抽象类练习_超级跑车
问题描述
请创建一个Car
抽象类,要求有brand
(品牌)属性,并且要求封装私有化,写出属性的setter
与getter
方法。抽象类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
必须在构造器中第一行。