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