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的错误。为什么呢?
答案 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();
ab
和ob
将拥有变量a
的不同副本,因为a
不是静态的。
但他们将共享一份b
。
因此,使用对象名称访问a
(因为每个obbject都有一个唯一的副本)。
ob.a=1;
ob.b=2;
使用类名访问b
。
someclass.b=4
(所有对象的值仍为4)。
因此,静态变量只意味着一个副本,因此,它由所有对象共享,并且不是对象唯一的,这就是使用对象名称无法访问它的原因。
与变量xb
相同。它不是静态变量,因此每个对象都有一个副本。所以使用对象名称访问它。