抽象类:普通类的超集,只是比普通类多一些抽象方法。使用abstract关键字修饰的类,抽象类不能实例化对象。
public abstract class TestAbstract {} TestAbstract t = new TestAbstract(); (X)不能实例化对象
抽象方法:指不能被具体实现的方法,也就是不能有方法体{},并且使用abstract关键字修饰;
访问修饰符 abstract void show();
回到目录…
1.抽象类中可以有成员变量、成员方法以及构造方法;
2.抽象类中可以有抽象方法也可以没有;但是拥有抽象方法的类一定是抽象类,必须有abstract关键字修饰;
3.抽象类的子类可以是普通类(子类必须覆写父类的所有抽象方法),也可以是抽象类。
4.一个子类只能继承一个抽象类。
回到目录…
抽象类的意义不在于实例化对象而在于被继承。若一个类继承自抽象类,则必须重写抽象方法。否则该类也得变成抽象类。保证多态的正确运行。
因此,抽象类对子类具有强制性和规范性,叫做模板设计模式。
经验分享:
在以后的开发中推荐使用父类引用指向子类的对象形式,因为父类引用直接调用的方法一定是父类拥有的方法。当需要更换指向子类对象的时候,只需要将new后面的类型更改一下就可以了,其他的代码无需改动,因此提高了代码的可维护性和可扩展性。
该方式的缺点在于:父类引用不能直接调用子类独有的方法,若调用则需要强制类型转换。
回到目录…
①自定义CaffeineDrinks抽象类,包含制作饮品的大方法、每个流程的小方法/抽象方法。
②自定义Coffee、Tea、MilkTea类继承CaffeineDrinks类,实现对父类中抽象方法的重写。
③自定义TestCaffeineDrinks类,在main()方法中使用多态的语法创建对象进行测试。
CaffeineDrinks父类
/** * 抽象类:咖啡因饮品 */ public abstract class CaffeineDrinks { // 制作流程是标准化的,封装到父类中 // 子类只有使用权不能修改 // 饮品的制作流程,用final修饰,表示不能被覆写 public final void prepareDrinks() { //烧水 boilWater(); //冲泡 brew(); //倒入杯中 pourInCup(); if(isCustomerWantsCondiments()) { //添加调味料 addCondiments(); } } // 对于浸泡和加调味品来说,不同子类实现细节不同,延迟到子类中去具体实现 /** 抽象方法 **/ //冲泡的方式不同 public abstract void brew(); //添加的调味料不同 public abstract void addCondiments(); //烧水 public void boilWater() { System.out.println("boiling water"); } //倒入杯中 public void pourInCup() { System.out.println("pouring into cup"); } //顾客是否添加调味料,默认添加 public boolean isCustomerWantsCondiments() { return true; } }
Coffee子类
/** * 星巴克咖啡制作 */ import java.util.Scanner; public class Coffee extends CaffeineDrinks { Scanner input = new Scanner(System.in); //重写抽象类中的冲泡方法 @Override public void brew() { System.out.println("brew coffee bag"); } //重写抽象类中的调料方法 @Override public void addCondiments() { System.out.println("add sugar and milk"); } //重写抽象类中的是否调料方法 @Override public boolean isCustomerWantsCondiments() { System.out.print("您的咖啡是否加糖和奶? y表示加,n表示不加 :"); String str = input.nextLine(); if (str.equals("y")) { return true; } return false; } }
MilkTea子类
/** * 奶茶制作 */ public class MilkTea extends CaffeineDrinks { //重写抽象类中的冲泡方法 @Override public void brew() { System.out.println("brew tea and coffee bag"); } //重写抽象类中的调料方法 @Override public void addCondiments() { System.out.println("add milk and sugar"); } }
Tea子类
/** * 星巴克泡茶法 */ public class Tea extends CaffeineDrinks { //重写抽象类中的冲泡方法 @Override public void brew() { System.out.println("steep tea bag"); } //重写抽象类中的调料方法 @Override public void addCondiments() { System.out.println("add lemon"); } }
TestCaffeineDrinks测试类
/** * 抽象方法的测试类 */ public class TestCaffeineDrinks { public static void main(String[] args) { //咖啡的制作 CaffeineDrinks coffee = new Coffee(); System.out.println("咖啡的制作:"); coffee.prepareDrinks(); System.out.println("--------------"); //茶的制作 CaffeineDrinks tea = new Tea(); System.out.println("茶的制作:"); tea.prepareDrinks(); System.out.println("--------------"); //奶茶的制作 CaffeineDrinks milkTea = new MilkTea(); System.out.println("奶茶的制作:"); milkTea.prepareDrinks(); } }
回到目录…
回到目录…
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是继续Java面向对象的学习,学习抽象方法、抽象类。之后的学习内容将持续更新!!!