为什么可以';在Java中,我们是否使用子类方法中的super关键字调用超类构造函数?

为什么可以';在Java中,我们是否使用子类方法中的super关键字调用超类构造函数?,java,inheritance,try-catch,super,Java,Inheritance,Try Catch,Super,我对java非常陌生,所以我对上面的标题问题没有什么疑惑 谁能帮我拿这个吗 提前感谢。考虑以下情况: class Father { Father() {} } class Son extends Father { Son() { super(); } void foo() { super(); //won't compile } } 您可以编写fatherf=newfather()来构造父级,但不能非法编写super

我对java非常陌生,所以我对上面的标题问题没有什么疑惑

谁能帮我拿这个吗


提前感谢。

考虑以下情况:

class Father {
    Father() {}
}

class Son extends Father {
    Son() {
        super();
    }

    void foo() {
        super(); //won't compile
    }
}
您可以编写
fatherf=newfather()
来构造父级,但不能非法编写
super f=super()

否则会出现两个问题:

(1) 什么是超级?编译器应该如何编译关键字
super
?如果进一步扩展Son,编译器可能无法确定实际返回的类
super()

(2) 关键字
不明确。您的意思是
this=super()
(类似于构造函数中的用法,但在本例中会很奇怪),还是要创建超类的实例

如果您确实希望动态获取实例,您最多可以使用反射:

try {
    Object o = this.getClass().getSuperclass().newInstance();
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
}

但这似乎很危险。总之,您应该使用
Father f=new Father()
创建
Father
实例,或者使用关键字
this
直接引用
Son
实例(它继承了
Father
的所有方法和字段)。

在Java中,每个关键字都有自己的含义。。。例如,要定义一个新类,我们使用“class”关键字。每个关键字都是为了做特定的事情而保留的。基本上,当您键入关键字时,它是对jvm的指令,jvm知道在遇到特定关键字时需要做什么。在子类构造函数中调用super()的方法与此相同,这样当您实例化子类的对象时,超级类的默认值也将被实例化。因此,它确保在实例化子类实例时,超级类默认值也将被实例化。现在,如果您想在方法中创建一个超类对象,可以使用new关键字。

可能是因为您在调用方法之前需要一个对象实例,即使您在实例方法B中调用实例级方法a,您实际上是在调用
this.B
中的
this.a
。。。请参阅隐式this ref,其中super或this构造函数在
this
contextThank.中不可用。。这有帮助。