Java 为什么super可以访问超类的非静态变量?
我得到一个B.xB的错误。它说xB不是静态的,所以你不能使用它。但是它没有给我一个super.xB的错误。为什么?当您在子类中定义Java 为什么super可以访问超类的非静态变量?,java,static,super,Java,Static,Super,我得到一个B.xB的错误。它说xB不是静态的,所以你不能使用它。但是它没有给我一个super.xB的错误。为什么?当您在子类中定义xB时,它基本上隐藏了超类的xB变量。因此,如果您打印这个.xB,您将得到4。使用super是访问超类隐藏变量的方法,与静态变量无关。另外,正如您正确猜测的那样,因为xB是超级类中的实例变量(非静态),所以您不能仅使用类名访问它 你可以试试 class B { int xB = 10; } class C extends B { int xB = 4;
xB
时,它基本上隐藏了超类的xB
变量。因此,如果您打印这个.xB
,您将得到4。使用super
是访问超类隐藏变量的方法,与静态变量无关。另外,正如您正确猜测的那样,因为xB
是超级类中的实例变量(非静态),所以您不能仅使用类名访问它
你可以试试
class B {
int xB = 10;
}
class C extends B {
int xB = 4;
C() {
System.out.println(super.xB);
System.out.println(B.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
}
}
在子类中定义
xB
时,它基本上隐藏了超类的xB
变量。因此,如果您打印这个.xB
,您将得到4。使用super
是访问超类隐藏变量的方法,与静态变量无关。另外,正如您正确猜测的那样,因为xB
是超级类中的实例变量(非静态),所以您不能仅使用类名访问它
你可以试试
class B {
int xB = 10;
}
class C extends B {
int xB = 4;
C() {
System.out.println(super.xB);
System.out.println(B.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
}
}
因为您是通过类标识符从B类访问变量xB,而不是通过this或super。
super
可以,或者您可以执行((B)此操作)。xB
因为您是通过类标识符从B类访问变量xB,而不是通过此或super。无论是super
都可以,或者您可以执行((B)此操作)。xB
super
用于访问超类的变量和函数。super
用于调用超类构造函数
静态变量是其值对于类的所有对象都是公共的变量。
它就像是所有对象的一个副本。
例如:
ab
和ob
将具有变量a
的不同副本,因为a
不是静态的。
但他们将共享一份b
因此,使用对象名访问
(因为每个对象都有一个唯一的副本)
使用类名访问b
。
someclass.b=4
(所有对象的值保持为4)
因此,静态变量只意味着一个副本,因此,它由所有对象共享,并且不是对象所独有的,这就是不能使用对象名访问它的原因
变量
xb
也一样。它不是一个静态变量,因此每个对象都有一个副本。所以使用对象名访问它。super
用于访问超类的变量和函数。super
用于调用超类构造函数
静态变量是其值对于类的所有对象都是公共的变量。
它就像是所有对象的一个副本。
例如:
ab
和ob
将具有变量a
的不同副本,因为a
不是静态的。
但他们将共享一份b
因此,使用对象名访问
(因为每个对象都有一个唯一的副本)
使用类名访问b
。
someclass.b=4
(所有对象的值保持为4)
因此,静态变量只意味着一个副本,因此,它由所有对象共享,并且不是对象所独有的,这就是不能使用对象名访问它的原因
变量xb
也是如此。它不是一个静态变量,所以每个对象都有一个副本。所以使用对象名访问它
ob.a=1;
ob.b=2;