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节,供其他感兴趣的人参考。