Java 区分super和this

Java 区分super和this,java,Java,我试图为这句话找到证据——关键字super是对父类的引用,就像关键字这个是对当前类的引用一样 我正在Java A->B->C中尝试多级继承:类A是父类,类B是父类,类C是子类 我在所有三个类中分别声明了一个变量X,其值分别为(a:X=100,B:X=200,C:X=300) 在子类构造函数中,我正在打印值。然而,这个角色不是为super关键字工作,而是为这个关键字工作 ((A)super).x不工作,但((A)this).x工作 class A { int x = 100; } cla

我试图为这句话找到证据——关键字
super
是对父类的引用,就像关键字
这个
是对当前类的引用一样

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

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

在子类构造函数中,我正在打印值。然而,这个角色不是为
super
关键字工作,而是为
这个
关键字工作

((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关键字指的是类的父类,而
this
关键字指的是您所在的类。让我们创建一个父类来开始演示:

public class ParentClass{

  private int justANumber;

  public ParentClass(int justANumber){
    this.justANumber = justANumber;
  }

}
注意这里是如何使用
this
关键字的,它告诉我们“嘿,将justANumber值分配给这个类属性,也称为justANumber”。现在让我们为这个父类创建一个子类:

public class Subclass extends ParentClass{

  // You don't need to declare the justANumber variable, cause it's from the parent

  public Subclass(int justANumber){
    super(justANumber);
  }

  public showNumber(){
    return this.justANumber;
  }

}

super()
方法调用父构造函数,父构造函数首先需要一个
int
值,因此可以将其作为参数传递。现在看看
showNumber()
方法如何返回
this.justANumber
?为什么?这是因为当调用
super()
方法时,父类会自动将其变量委托给子类,因此在这种情况下,
subclass
现在可以说
justANumber
是他的变量,可以使用
this
关键字。希望您现在了解差异。

使用
Super
关键字:

  • super()
    可用于引用直接父类实例 变数
  • super()
    可用于调用直接父类方法
  • 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类实例。

    为什么
    这个
    可以强制转换,但是
    超级
    不能的答案与为什么
    这个
    可以作为方法参数传递,但是
    超级
    不能的问题相同:即,因为
    这个
    被JLS定义为,但是
    超级
    不是。

    它只是无效的语法
    super
    不能那样使用。它只能在直接字段访问/方法调用表达式中使用,而不尝试强制转换。
    super
    引用与
    this
    相同的实例。你试图做的没有意义。
    super
    不是“对父类的引用”。它是一个关键字,允许您引用继承的字段或方法。没什么了。
    super()
    super
    是完全不同的东西。前者是一个构造函数调用,后者的作用是修改通常的名称解析算法。原始post在任何地方都不使用超类构造函数调用
    super()。它使用超类访问关键字
    super
    .Upvote作为指向语言规范的(间接)指针;Java SE 11 JLS中的第15.11.2节,供其他感兴趣的人参考。