实现一个简单的运行时多态
继承(extends) + 方法重写(override)
直接上代码
一个超类Car, 三个子类BmwCar, AudiCar, PorscheCar。
其中show()方法为那个重写的方法,但是只有BmwCar和AudiCar重写了该方法:
超类Car:
public class Car {
private String brand;
private String color;
private int doorNum;
public Car(String brand, String color, int doorNum) {
this.brand = brand;
this.color = color;
this.doorNum = doorNum;
}
public void show(){
System.out.println("没有该车的信息!");
}
public String getBrand() {
return brand;
}
public String getColor() {
return color;
}
public int getDoorNum() {
return doorNum;
}
}
子类1 BmwCar:
public class BmwCar extends Car {
public BmwCar() {
super("BMW","Black",2);
}
@Override
public void show(){
System.out.println(super.getBrand() + " "
+ super.getColor() +
+ " DoorNum:" +
+ super.getDoorNum());
}
}
子类2 AudiCar:
public class AudiCar extends Car{
public AudiCar() {
super("Audi","Red",4);
}
@Override
public void show(){
System.out.println(super.getBrand() + " "
+ super.getColor() +
+ " DoorNum:" +
+ super.getDoorNum());
}
}
子类3 PorscheCar:
public class PorscheCar extends Car{
public PorscheCar() {
super("Porsche","Blue",5);
}
}
主函数:
为了更明显的看出多态的现象,在主函数中定义了一个额外的方法randomCar()用来随机返回任意子类。
public class Main {
public static void main(String[] args) {
for (int i = 1; i <10; i++){
Car car = randomCar();
System.out.print(car.getBrand() + "-> ");
car.show();
}
}
public static Car randomCar(){
int randomNum =(int)(Math.random()*3) + 1;
System.out.print("Random No." + randomNum + " ");
switch (randomNum){
case 1:
return new BmwCar();
case 2:
return new AudiCar();
case 3:
return new PorscheCar();
}
return null;
}
}
程序输出:
主函数中最核心的代码为
Car car = randomCar();
car.show();
同样的代码,得到的结果却不同。
因为show()方法在子类BmwCar和子类AudiCar中都进行了重写,于是调用了它们重写的show()方法, 而子类PorscheCar中没有重写show()方法,所以调用了超类的show()方法。