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

时间:2015-12-19 09:01:54

标签: java static super

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的错误。为什么呢?

3 个答案:

答案 0 :(得分:2)

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

你可以尝试

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

super用于访问超类的变量和函数。super用于调用超类构造函数。

静态变量是其值对于类的所有对象都是通用的变量。 这就像是所有对象的一个​​副本。 例如:

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

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

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

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

使用类名访问bsomeclass.b=4(所有对象的值仍为4)。

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

与变量xb相同。它不是静态变量,因此每个对象都有一个副本。所以使用对象名称访问它。

相关问题