抽象类练习_超级跑车
问题描述
请创建一个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必须在构造器中第一行。
浙公网安备 33010602011771号