我正在努力理解 Java 继承的变量、阴影方法和重写概念。
Case 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 加速:跑车。
Case 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 会这样工作吗?
我认为变量和方法应该工作相同,否则在创建具有相同变量的子类时应该出现编译错误。
嗯,这根本不是 Java 的工作方式。
变量是not多态处理 - 不存在“覆盖”变量的概念。然而,方法,are多态处理。行为可以专门化,但不能state.
请注意,如果您的变量是私有的(它们几乎总是应该如此),则这种情况永远不会可见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)