抽象类练习_超级跑车

问题描述

请创建一个Car抽象类,要求有brand(品牌)属性,并且要求封装私有化,写出属性的settergetter方法。抽象类Car构造方法中也可以对brand属性赋值,定义抽象方法run()。创建一个跑车类SportsCar继承抽象类Car。实现Car抽象方法输出一条语句“超级跑车”,在本类中写出一个自己的方法price(),输出一条语句“售价100w”。
在测试类Test类中创建跑车对象car1,用构造器赋值品牌属性,输出属性,调用run()price()方法。创建跑车car2,用set方法赋值属性,输出属性,调用run()price()方法。

输出结果如下:

法拉利
超级跑车
售价100W
兰博基尼
超级跑车
售价100W

参考代码

根据题目要求定义Car抽象类:

public abstract class Car {

    private String brand;

    public Car(String brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public abstract void run();
}

由于题目中说:创建跑车car2,用set方法赋值属性SportsCar中应有一个无参的构造器:

public class SportsCar extends Car {
    public SportsCar() {
    }

    public SportsCar(String brand) {
        super(brand);
    }

    public void run() {
        System.out.println("超级跑车");
    }

    public void price() {
        System.out.println("售价100w");
    }
}

但这样写会报错,因为,在构造子类对象时必须先调用超类的构造器(要么显式、要么隐式)。由于在Car里定义了有参的构造器,编译器默认提供的无参构造器就木有了!需要在Car中自己手动添加一个无参构造器:

public abstract class Car {

    private String brand;

    public Car() {
        
    }
    
    public Car(String brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public abstract void run();
}

Test:

public class Test {
    public static void main(String[] args) {
        SportsCar car1 = new SportsCar("法拉利");
        System.out.println(car1.getBrand());
        car1.run();
        car1.price();

        SportsCar car2 = new SportsCar();
        car2.setBrand("兰博基尼");
        System.out.println(car2.getBrand());
        car1.run();
        car1.price();
    }
}

输出:

法拉利
超级跑车
售价100w
兰博基尼
超级跑车
售价100w

补充说明

构造子类对象时,必须先调用超类构造器(使用super)。原理可参考书P96图3.11

SportsCar中的无参构造器中也调用了super,只是可以省略不写:

    public SportsCar() {
        super();
    }

    public SportsCar(String brand) {
        super(brand);
    }

Car中也是同理(Car的超类是Object):

    public Car() {
        super();
    }

    public Car(String brand) {
        super();
        this.brand = brand;
    }

super必须在构造器中第一行。

 

posted @ 2024-12-08 00:01  xkfx  阅读(79)  评论(0编辑  收藏  举报