class A
{
private int m;
public void display()
{
System.out.println(m);
}
}
class B extends A
{
int n;
B(int b)
{
this.n = b;
}
public void display()
{
super.display();
System.out.println(n);
}
}
class trial
{
public static void main(String args[])
{
A a = new A();
B b = new B(10);
a = b;
a.display();
}
}
在上面的代码中,调用a
函数的变量display()
如何执行子类display()
-子类display()
的类型为B
,并且不应该存在于具有此类型的对象中A
。我对此表示怀疑,因为显然超类变量可以引用子类对象。但是,他们将无法访问子类中存在的元素(变量,函数等)。但是以上代码违反了该原则。
我有这个疑问,因为显然超类变量可以引用子类对象。但是,他们将无法访问子类中存在的元素(变量,函数等)。但是以上代码违反了该原则。
这是不正确的。请通过https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
请注意,在a.display()
语句中,它是B
的实例,在其上调用了display()
。
在您的代码中,执行以下代码a = b;变量a指向B对象。由于A是B的超类,因此它可以保存Child Class实例的引用。等效于A b = new B(10);现在,如果我们调用b.display();
// B的display()的版本被调用。
这在JAVA中称为运行时多态。使用它可以覆盖子对象中的父类方法。但是您不能访问Child类的实例变量或仅在Child类中存在的方法。
请阅读https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/