1

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

4

2 回答 2

6

它会,但该功能f只能看到它的b版本A。因此函数返回 7。

如果您要将函数复制f到 中,class B您会看到正在返回b的成员。class B

正如隐藏类的实例变量所解释的,Java 变量不是多态的。正如您所期望的,这 2 个b变量是 2 个不同的变量,但是当您调用该函数时A.f,它只能看到具有的一个b变量A。所以它返回A.b而不是B.b

因此,要回答您的问题,B 类确实有自己的实例变量b,它完全独立,A.b但您目前无法访问它,因此您看不到它的值。

于 2013-01-08T00:11:18.550 回答
0

您的类型参考是A

A a = new B(); 

因此,实例字段/静态字段和静态方法将从 提供A,只要相关方法(在您的情况下f())不被B.

在其他语言中,如 Scala,变量可以在子类中重新定义,甚至可以从超类型引用中定位。

于 2013-01-08T00:17:34.123 回答