我有一个扩展超类的子类。我希望超类永远不会在子类上调用方法。这可能吗?
在超类上显式调用的方法再次调用子类似乎不直观。
琐碎的例子:
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();
}
但这不起作用,因为前向迭代器在后向迭代器上调用了错误的方法。我目前的解决方法是将前向迭代器存储为字段并调用方法,但这看起来很笨拙/不优雅。
答案 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(); }
}