抽象类2_练习
问题描述
定义两个类ChineseAirConditioner
(Z国空调)和AmericanAirConditioner
(M国空调),执行下面代码:
public class Main {
public static void main(String[] args) {
System.out.println("***测试中国空调***");
ChineseAirConditioner conditioner1 = new ChineseAirConditioner();
conditioner1.startUp();
conditioner1.displayStatus();
conditioner1.shutDown();
conditioner1.displayStatus();
System.out.println("***测试美国空调***");
AmericanAirConditioner conditioner2 = new AmericanAirConditioner();
conditioner2.startUp();
conditioner2.displayStatus();
conditioner2.shutDown();
conditioner2.displayStatus();
}
}
可产生如下输出:
***测试中国空调***
空调状态: 开启
空调状态: 关闭
***测试美国空调***
Air Conditioner Status: ON
Air Conditioner Status: OFF
先确保能够理解并运行原始版本,再逐步升级到抽象类版本(先通过引入一个公共超类简化类定义中的重复代码,再简化main
中的代码)。在升级代码的过程中体会继承和抽象方法的好处。
1.0
Z国空调:
public class ChineseAirConditioner {
private boolean isOn = false;
// isOn: false表已关机,true表示已启动
public void startUp() {
isOn = true;
}
public void shutDown() {
isOn = false;
}
public void displayStatus() {
System.out.println("空调状态: " + (isOn ? "开启" : "关闭"));
}
}
M国空调:
public class AmericanAirConditioner {
private boolean isOn = false;
public void startUp() {
isOn = true;
}
public void shutDown() {
isOn = false;
}
public void displayStatus() {
System.out.println("Air Conditioner Status: " + (isOn ? "ON" : "OFF"));
}
}
2.0:处理类定义中完全相同的代码
定义公共超类,将完全相同的代码移动到超类当中,原来的类去继承这个新定义的类,实现一份代码多个类使用。
空调(新定义的公共超类):
public class Conditioner {
// 处理完全相同的代码=>定义公共超类
protected boolean isOn = false;
// protected: 本包和子类可以访问
public void startUp() {
isOn = true;
}
public void shutDown() {
isOn = false;
}
}
Z国空调:
public class ChineseAirConditioner extends Conditioner {
public void displayStatus() {
System.out.println("空调状态: " + (isOn ? "开启" : "关闭"));
}
}
3.0:处理“大同小异”的方法
public abstract class Conditioner {
// 处理完全相同的代码=>定义公共超类,普通方法
protected boolean isOn = false; // protected: 本包和子类可以访问
public void startUp() {
isOn = true;
}
public void shutDown() {
isOn = false;
}
//处理大同小异代码=>定义公共超类,抽象方法
public abstract void displayStatus();
// 似乎没省代码,为何这么写?
// 1效果: 继承该类必须实现该类中的abstract方法,否则报错(务必自行请尝试)
// 定义抽象类实际定义了一种规范或者模板=>空调就必须长这个样
// 凡空调都应该有displayStatus方法
// 2不这么写不行,见下版代码
}
4.0:简化main方法
public class Main {
private static void test(Conditioner conditioner) {
conditioner.startUp();
conditioner.displayStatus();
conditioner.shutDown();
conditioner.displayStatus();
// 不在Conditioner中写displayStatus的话
// 无法调用displayStatus,也就无法发挥多态和动态绑定的威力
}
public static void main(String[] args) {
System.out.println("***测试中国空调***");
test(new ChineseAirConditioner());
System.out.println("***测试美国空调***");
test(new AmericanAirConditioner());
}
}