为什么我们不能在Java中使用子类方法中的super关键字来调用超类构造函数?

时间:2015-04-09 04:58:39

标签: java inheritance try-catch super

我对java很新,所以我对上面的标题问题几乎没有什么困惑。

请有人帮我解决这个问题吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

考虑以下情况:

class Father {
    Father() {}
}

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

    void foo() {
        super(); //won't compile
    }
}

您可以撰写Father f = new Father();来构建Father,但不能非法撰写super f = super()

否则会出现两个问题:

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

(2)关键字this不明确。你的意思是this = super()(类似于在构造函数中使用,但在这种情况下会很奇怪),或者你想创建一个超类的实例?

如果你真的想动态获取一个实例,你可以做的最多就是使用反射:

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

但这似乎很危险。最后,您应该使用Father f = new Father()创建Father实例,或使用关键字this来引用Son实例(继承Father中的所有方法和字段1}})直接。

答案 1 :(得分:0)

在Java中,每个关键字都有自己的含义......例如,为了定义一个新类,我们使用'class'关键字。每个关键字都保留用于执行特定操作。基本上,当您键入关键字时,它是对jvm的指令,jvm知道在遇到特定关键字时需要执行的操作。同样,super()被设计为仅在子类构造函数中调用,这样当您实例化子类的对象时,超类默认值也将被实例化。因此,它确保在实例化子类实例时,超类默认值也将被实例化。现在,如果要在方法中创建超类Object,可以使用new keyword。