问题可能是一个非常基本的问题。我是Java的新手,所以请耐心等待。 我的代码:
class A
{
int b=10;
A()
{
this.b=7;
}
int f()
{
return b;
}
}
class B extends A{ int b; }
class Test
{
public static void main(String[] args)
{
A a=new B();
System.out.println(a.f());
}
}
为什么输出7? B类不会获得自己的实例变量b
吗?
答案 0 :(得分:6)
但是功能f
只能看到b
中A
的版本。因此该函数返回7.
如果您要将功能f
复制到class B
,您会看到正在返回b
的成员class B
。
正如Hiding instance variables of a class所解释的那样,Java变量不是多态的。 2个b
变量是您所期望的2个不同变量,但是当您调用函数A.f
时,它只能看到b
具有的A
变量。所以它返回A.b
而不是B.b
。
因此,要回答您的问题,B类会获得自己的实例变量b
,并且它完全独立于A.b
,但您目前无法访问它,因此您无法看到它的值。
答案 1 :(得分:0)
您的类型参考是A
:
A a = new B();
因此,实例字段/静态字段和静态方法将从A
提供,只要有关方法(在您的情况下为f()
)未被B
覆盖。
在其他语言中,作为Scala,变量可以在子类中重新定义,甚至可以从超类型引用中定位。