输出说明

时间:2013-01-08 00:10:23

标签: java

问题可能是一个非常基本的问题。我是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吗?

2 个答案:

答案 0 :(得分:6)

但是功能f只能看到bA的版本。因此该函数返回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,变量可以在子类中重新定义,甚至可以从超类型引用中定位。