【发布时间】:2016-05-27 11:00:00
【问题描述】:
当一个类扩展一个类时,我们可以在为子类对象分配内存的同时使用超类引用。 到目前为止我的理解是可以这样做,因为子类继承了其父类的数据,但它无法访问子类的成员,因为它只是引用,因此不知道添加了什么由子类完成。
我的问题是当我在上述概念中包含方法隐藏时,超类引用变量开始引用子类函数。这是为什么 ?为什么它没有像它应该的那样调用它自己的方法?
class A{
void show(){ System.out.print("CLass A. \n"); }
}
class B extends A{
void show(){System.out.print("Class B. \n"); }
}
class Main{
public static void main(String[] args){
A a= new A();
B b= new B();
a.show(); // prints Class A
b.show(); // prints Class B
A a1= new B();
a1.show(); // print Class B. why is this ? it should be Class A as per theory?
}
}
【问题讨论】:
-
了解方法覆盖
-
什么理论会这样说?这完全是预期的行为。
-
为什么要打印
Class A?您只是将B的实例存储在A类型的变量中。事实上,该类仍然属于实例B,并且不会神奇地转换为A。而且由于它仍然是B的一个实例,它将打印Class B.,因为该方法已被覆盖。 -
a1是一个A引用,但是一个B具体实例。 -
我对这个概念感到困惑,即当你使用超类引用来引用子类对象时,只能调用超类的成员。但相反,调用是在运行时解决的,因此会发生覆盖!
标签: java inheritance overloading method-hiding