为什么超级可以访问超类的非静态变量?

why can super access non static variable of superclass?

class B {
   int xB = 10;
}

class C extends B {
   int xB = 4;

   C() {
      System.out.println(super.xB);
      System.out.println(B.xB);
   }
}

我收到 B.xB 的错误。它说 xB 不是静态的,因此您不能使用它。但它没有给我 super.xB 的错误。为什么?

当你在 subclass 中定义 xB 时,它基本上隐藏了 superclass 的 xB 变量。所以如果你打印 this.xB 你会得到 4。使用 super 是访问 superclass 的隐藏变量的方法,它与静态变量无关。同样正如您正确猜测的那样,因为 xB 是超级 class 中的实例变量(非静态),您不能仅使用 class 名称访问它。

你可以试试

class C extends B {
    int xB = 4;

    C() {
        System.out.println(this.xB);
        System.out.println(super.xB);
        System.out.println(((B)this).xB); //same behavior as super.xB
        //System.out.println(B.xB); // Not allowed as xB is not static in B
    }
}

你会得到

4
10
10

因为您是通过 class 标识符从 B class 访问变量 xB,而不是通过 this 或 super。 super 可以,或者您可以 ((B)this).xB.

super用于访问superclass的变量和函数。super用于调用super的class构造函数。

静态变量是其值对 class 的所有对象通用的变量。 这就像所有对象的一份副本。 示例:

int a;   //variable of someclass
static int b; //variable of someclass
someclass ob=new someclass();
someclass ab=new someclass();

abob 将具有变量 a 的不同副本,因为 a 不是静态的。 但是他们会分享一份 b .

因此,a 使用对象名称访问(因为每个对象都有一个唯一的副本)。

ob.a=1;
ob.b=2;

并且使用 class 名称访问 bsomeclass.b=4(所有对象的值保持为 4)。

因此,静态变量意味着只有一个副本,因此,它由所有对象共享并且不是对象唯一的,这就是无法使用对象名称访问它的原因。

与变量 xb 相同。它不是静态变量,因此每个对象都可以 copy.So 使用对象名称访问它。