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

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;

我得到一个B.xB的错误。它说xB不是静态的,所以你不能使用它。但是它没有给我一个super.xB的错误。为什么?

当您在子类中定义
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;