实验代码
public class Cycle{//向上转型
static void ride(){
System.out.println("Cycle has ride");}
public static void main(String[] args){
Cycle c = new Unicycle();
Cycle y = new Bicycle();
Cycle l = new Tricycle();
Cycle cycle = new Cycle();
c.ride();
y.ride();
l.ride();
cycle.ride();
}
}
class Unicycle extends Cycle{
static void ride(){
System.out.println("Unicycle has ride");}
}
class Bicycle extends Cycle{
static void ride(){
System.out.println("Bicycle has ride");}
}
class Tricycle extends Cycle{
static void ride(){
System.out.println("Tricycle has ride");}
}
运行结果
所有结果都是调用的父类Cycle中的方法
若把所有类中的ride方法改为非静态的
运行结果为
造成这种情况的原因是
static方法在JVM类加载时便存在,先与对象存在于内存中
当子类对象创建时会先创建父类对象(而此时父类中的ride()方法已经存在了)
这时接着创建Child对象前,(ride()方法已存在)
所以调用时调用的是父类中的ride()方法