为什么可以';在Java中,我们是否使用子类方法中的super关键字调用超类构造函数?
我对java非常陌生,所以我对上面的标题问题没有什么疑惑 谁能帮我拿这个吗为什么可以';在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
提前感谢。考虑以下情况:
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.中不可用。。这有帮助。