为什么图中((Boat)v).move();这行代码执行的函数输出的语句和上面输出的语句是一样的,类型转换没起作用?代码写得没问题
public abstract class Vehicle {
protected int price;
abstract void move();
public Vehicle(int price) {
this.price = price;
}
}
public class Boat extends Vehicle {
public Boat(int price) {
super(price);
}
@Override
void move() {
System.out.println("Boat moved");
}
}
public class Ship extends Boat {
public Ship(int price) {
super(price);
}
@Override
void move() {
System.out.println("Ship moved");
}
}
调用父类的方法,会直接调用子类的实现。
Vehicle v = new Ship(1200);
v.move();
它是调用 Ship 类的 move 方法。
转成 Boat 后,Boat还是 Ship 的父类,调用父类的方法名,还是会调用子类的实现的。
重写:能调用什么方法由左边引用类型决定,调用哪个方法由右边对象类型决定。一般是子类有就调用子类的,子类没有就沿着继承方向向上一层一层的找父类方法调用。这就是Java的多态机制。