超类调用子类方法

时间:2017-12-10 05:16:03

标签: java inheritance

我有一个扩展超类的子类。我希望超类永远不会在子类上调用方法。这可能吗?

在超类上显式调用的方法再次调用子类似乎不直观。

琐碎的例子:

public class Demo {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println("A.a() = " + a.a()); // -1
        System.out.println("A.b() = " + a.b()); // -1
        System.out.println("B.a() = " + b.a()); // 99
        // B.b() -> A.b() -> B.a()
        System.out.println("B.b() = " + b.b()); // 99
    }
}

class A {
    public int a() { return -1; }
    public int b() { return a(); } // tried, doesn't work: A.a(), A.this.a()
}

class B extends A {
    public int a() { return 99; }
    public int b() { return super.b(); }
}

注意:实际情况是实施Deque;降序迭代器类继承自前向迭代器类,只是从尾部开始而不是从头部开始。我想交换方法名称,我想用它来做:

public boolean hasNext() {
    return super.hasPrevious();
}

但这不起作用,因为前向迭代器在后向迭代器上调用了错误的方法。我目前的解决方法是将前向迭代器存储为字段并调用方法,但这看起来很笨拙/不优雅。

2 个答案:

答案 0 :(得分:1)

默认情况下,子类可以覆盖其超类的方法。为了防止这种情况发生,您可以向超类的方法添加final修饰符,以防止其子类覆盖该方法。

答案 1 :(得分:0)

如果调用的超类方法是private,那么当你进入超类代码时,它将用于超类方法,而不是子类方法。

即使它很丑,以下内容也会有效。

class A {
    public int a() { return privateA(); }
    public int b() { return privateA();}  
    // It's impossible for anything to override privateA, even if a subclass has a 
    // method with the same name, because it's private.
    private int privateA(){return -1}
}

class B extends A {
    public int a() { return 99; }
    public int b() { return super.b(); }
}