抽象类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());
    }
}

 

posted @ 2024-11-22 09:54  xkfx  阅读(62)  评论(0编辑  收藏  举报