为什么Java不允许使用super.super.method();?

426
我阅读了这个问题,并认为如果能够编写以下代码,则可以轻松解决该问题(即使不使用此方法也可以解决):
@Override
public String toString() {
    return super.super.toString();
}

我不确定它在许多情况下是否有用,但我想知道为什么它不是这样,并且其他语言中是否存在类似的东西。

你们觉得呢?

编辑: 澄清一下:是的,我知道在Java中这是不可能的,我也不是很想要它。这不是我期望它能工作,而是惊讶于得到编译器错误。我只是有这个想法,想讨论一下。


8
想要调用super.super.toString()与你选择扩展一个类并接受它的所有特性的决定相矛盾,因此不建议这样做。 - DayaMoon
22个回答

-1
public class SubSubClass extends SubClass {

    @Override
    public void print() {
        super.superPrint();
    }

    public static void main(String[] args) {
        new SubSubClass().print();
    }
}

class SuperClass {

    public void print() {
        System.out.println("Printed in the GrandDad");
    }
}

class SubClass extends SuperClass {

    public void superPrint() {
        super.print();
    }
}

输出:在GrandDad中打印


2
这个答案超出了问题的范围。OP没有问如何调用祖父类中的方法。问题是讨论为什么在Java中super.super.method()不是有效的代码。 - Jed Schaaf

-1

关键字super只是调用超类中方法的一种方式。在Java教程中:https://docs.oracle.com/javase/tutorial/java/IandI/super.html

如果您的方法覆盖了其超类的方法,则可以通过使用关键字super来调用被覆盖的方法。

不要认为它是超级对象的引用!!! 不,它只是一个关键字,用于调用超类中的方法。

这里有一个例子:

class Animal {
    public void doSth() {
        System.out.println(this);   // It's a Cat! Not an animal!
        System.out.println("Animal do sth.");
    }
}

class Cat extends Animal {
    public void doSth() {
        System.out.println(this);
        System.out.println("Cat do sth.");
        super.doSth();
    }
}

当您调用cat.doSth()时,类Animal中的方法doSth()将打印this并且它是一只猫。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接