文章目录
提示:以下是本篇文章正文内容,Java系列学习将会持续更新
(1)基本概念
抽象类:普通类的超集,只是比普通类多一些抽象方法。使用abstract关键字修饰的类,抽象类不能实例化对象。
public abstract class TestAbstract {}
TestAbstract t = new TestAbstract(); (X)不能实例化对象
抽象方法:指不能被具体实现的方法,也就是不能有方法体{},并且使用abstract关键字修饰;
访问修饰符 abstract void show();
(2)注意事项
1.抽象类中可以有成员变量、成员方法以及构造方法;
2.抽象类中可以有抽象方法也可以没有;但是拥有抽象方法的类一定是抽象类,必须有abstract关键字修饰;
3.抽象类的子类可以是普通类(子类必须覆写父类的所有抽象方法),也可以是抽象类。
4.一个子类只能继承一个抽象类。
(3)实际意义
抽象类的意义不在于实例化对象而在于被继承。若一个类继承自抽象类,则必须重写抽象方法。否则该类也得变成抽象类。保证多态的正确运行。
因此,抽象类对子类具有强制性和规范性,叫做模板设计模式。
经验分享:
在以后的开发中推荐使用父类引用指向子类的对象形式,因为父类引用直接调用的方法一定是父类拥有的方法。当需要更换指向子类对象的时候,只需要将new后面的类型更改一下就可以了,其他的代码无需改动,因此提高了代码的可维护性和可扩展性。
该方式的缺点在于:父类引用不能直接调用子类独有的方法,若调用则需要强制类型转换。
(4)案例
①自定义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();
}
}
(5)运行结果
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是继续Java面向对象的学习,学习抽象方法、抽象类。之后的学习内容将持续更新!!!