java - 区分 super 和 this

标签 java

<分区>

我正在尝试为该声明找到证据 - 关键字 super 是对父类的引用,就像关键字 this 是对当前类的引用一样。

我在 Java A->B->C 中尝试多级继承:A 类是祖父类,B 类是父类,C 类是子类。

我在所有三个类中声明了一个变量 X,其值分别为 (A:x=100,B:x=200,C:x=300)

在子类构造函数中,我正在打印值。但是,转换不适用于 super 关键字,而适用于 this 关键字。

((A)super).x 不工作,但是 ((A)this).x 工作。

class A {
    int x = 100;
}

class B extends A {
    int x = 200;
}

public class C extends B {
    int x = 300;
    public C () {
        System.out.println(this.x); //OP = 300
        System.out.println(super.x); // OP = 200
        System.out.println(((A)this).x);// OP = 100
        System.out.println(((A)super).x); // Giving Compile time Error.. Why?
        B reftoB = new B();
        System.out.println(((A)reftoB).x);  // OP = 100
    }

    public static void main(String[] args) {
        C t1= new C();
    }
}

我希望 System.out.println(((A)super).x) 的输出是 100,但它给出了编译时错误。

所以我的问题是,如果 super 是对父类的引用,那么为什么不对它进行类型转换?

最佳答案

Super 关键字的使用:

  1. super() 可用于引用直接父类实例 变量。
  2. super() 可用于调用直接父类方法。
  3. super() 可用于调用直接父类构造函数。

你的编译器是 (A)super).x 的编译错误,因为它不是一个有效的语句,而且我们不这样使用它,最重要的是 它违反封装,你不应该能够绕过父类。在 super() 的每个定义中,您都会发现一些被提及为当前父类的内容,但是您在这里试图做的是绕过 当前父级

现在来解决您的问题:

x                // Field x in class C
this.x           // Field x in class C
super.x          // Field x in class B
((B)this).x      // Field x in class B
((A)this).x      // Field x in class A
super.super.x    // Illegal; does not refer to x in class A
((A)super).x     // Illegal as well as compilation error

如果您仍想访问您想要的变量,请使用如下内容:

t1.x              // Field x of class C 
((B)t1).x         // Field x of class B
((A)t1).x         // Field x of class A

注意:t1 是您的 C 类实例。

关于java - 区分 super 和 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54432078/

相关文章:

java - Lombok SLF4J impl 继承问题

java - 比较 SQL 中的元素(房间预订 WebApp)Java

java - 如何将我经常使用的方法添加到android studio?

java - 在 Java 中制作偶数和奇数线程以自然顺序打印数字

java - Tomcat 7 忽略 cookies?

java - 在 Android 中使用 ORMLite 持久化 ArrayList<String>

java - 如何使 AWT 组件在渐进式背景图像上透明?使用了 Window()、Panel()、Button() 但失败了

java - JVM 优化是如何基于假设的?

java - 使用 ListAdapter 的新 Intent

java - 调整java swing中复选框之间的间距