我努力理解变量阴影方法重写理念的继承与Java。
情况1:
class Car{
public int gearRatio = 8;
public String accelerate() { return "Accelerate : Car"; }
}
class SportsCar extends Car{
public int gearRatio = 9;
public String accelerate() { return "Accelerate : SportsCar"; }
public static void main(String[] args){
Car c = new SportsCar();
System.out.println( c.gearRatio+" "+c.accelerate() );
}
}
输出:8加速:跑车。
案例2:
public class TestClass{
public static void main(String args[ ] ){
A o1 = new C( );
B o2 = (B) o1;
System.out.println(o1.m1( ) );
System.out.println(o2.i );
}
}
class A { int i = 10; int m1( ) { return i; } }
class B extends A { int i = 20; int m1() { return i; } }
class C extends B { int i = 30; int m1() { return i; } }
输出:30,20
所以,如果我理解正确的话,超类变量总是被调用,除非子类变量被显式调用。 但相反的是,其中的子类覆盖方法被调用,除非超类是显式调用方法一样。
我认为变量和方法应该工作相同或创建子类以相同的变量时,应该有一个编译错误。
一个人能解释这是否是正确的,为什么java的工作原理是这样吧。