在最近的一次采访中有人问我这个问题。希望获得帮助。
public class A {
public A() {
foo();
}
public void foo() {
System.out.println("In foo method in class A");
}
}
B类覆盖A类中的foo方法。
public class B extends A {
@Override
public void foo() {
System.out.println("In foo method in class B");
}
}
现在,如果我们创建类B的实例,则将调用B中的foo()方法。
A a = new B();
prints: "In foo method in class B"
问题:假设我们拥有类A,它是jar文件(abc.jar)的一部分,如何确定实例化类B的时间,是调用A.foo()而不是重写B.foo()?
条件:
想象一下,该jar与其他用户共享,并且我们无法破坏将我标记为私有/最终方法的客户端代码。
也不能从类B调用super.foo(),因为我们不拥有类B且不能限制用户。
public class A {
public A() {
fooInternal();
}
public void foo() {
fooInternal();
}
private final void fooInternal() {
System.out.println("In foo method in class A");
}
}
您无法使其调用A.foo()
,因为该方法已被覆盖。您只能使其调用一个调用的方法A.foo()
,并且该方法不能被覆盖。
这里更重要的一点是,您永远不要从构造函数中调用可重写的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句