java - 为什么super可以访问父类(super class)的非静态变量?

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

最佳答案

当您在子类中定义xB时,它基本上隐藏了父类(super class)的xB变量。所以如果你打印this.xB,你会得到4。使用super是访问父类(super class)隐藏变量的方法,它与静态变量无关。另外,正如您正确猜测的那样,由于 xB 是父类(super 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

关于java - 为什么super可以访问父类(super class)的非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34369007/

相关文章:

java - 如何在 Java Servlet 应用程序上为每个用户创建一个数据库连接?

java - java.time 是否无法解析秒数?

Java 类/继承结构

php - 如何创建从数据库中动态提取的静态 WordPress 页面?

java - 为什么 this.super() 在 Java 中不可能?

java - Spring Integration + Amazon SQS 队列的工作示例

linux - 在访问权限非常有限的不同 Linux 机器上安装程序

c# - C# 静态方法模板

Java - 理解克隆

javascript - 无法将 'super' 与 JavaScript 类中原型(prototype)对象上定义的函数一起使用