【发布时间】:2020-04-14 04:19:07
【问题描述】:
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。我有这个疑问是因为,显然超类变量可以引用子类对象。
但是,他们将无法访问子类中存在的元素(变量、函数等)。但是上面的代码违反了这个原则。
【问题讨论】:
-
因为线路:
a = b;. -
我认为您应该阅读有关多态性和方法覆盖的内容。
display()存在于A中,这就是它知道它存在的原因。B覆盖它。 -
我知道 B 会覆盖它——但是当我分配
a = b;时,变量 a 不应该只能访问基类中的显示函数——因为它是基类的类型吗? 'a' 不应该知道被覆盖方法的存在。例如:'a' 不知道在子类中声明的变量 n 的存在。如果我尝试按如下方式访问 n :a=b;System.out.println(a.n);它会给我一个错误。很明显,基类对象不能访问子类的变量——那么它如何访问子类的重写函数呢? -
因为它被覆盖了。这就是重写方法的全部意义所在。它告诉对象:“运行没有参数的名为
display()的方法”。如果对象是A类型,它将运行原始display()。如果它是B类型,它将使用自己的display()版本。但是您无法访问父级中未声明的任何内容。
标签: java inheritance overloading derived-class base-class