类中所有的private方法都隐式地指定为是final的。如果你试图覆盖一个private方法(隐含是final的),似乎是奏效的,而且编译器也不会提示错误信息:
//: reusing/FinalOverridingIllusion.java
// It only looks like you can override
// a private or private final method.
import static net.mindview.util.Print.*;
class WithFinals {
// Identical to "private" alone:
private final void f() { print("WithFinals.f()"); }
// Also automatically "final":
private void g() { print("WithFinals.g()"); }
}
class OverridingPrivate extends WithFinals {
private final void f() {
print("OverridingPrivate.f()");
}
private void g() {
print("OverridingPrivate.g()");
}
}
class OverridingPrivate2 extends OverridingPrivate {
public final void f() {
print("OverridingPrivate2.f()");
}
public void g() {
print("OverridingPrivate2.g()");
}
}
public class FinalOverridingIllusion {
public static void main(String[] args) {
OverridingPrivate2 op2 = new OverridingPrivate2();
op2.f();
op2.g();
// You can upcast:
OverridingPrivate op = op2;
// But you can’t call the methods:
//! op.f();
//! op.g();
// Same here:
WithFinals wf = op2;
//! wf.f();
//! wf.g();
}
} /* Output:
OverridingPrivate2.f()
OverridingPrivate2.g()
*///:~
定义为static的东西只会被。加载一次。
只有非private方法才可以被覆盖。
如果某个方法是静态的,它的行为就不具有多态性。静态方法是与类,而并非与单个对象相关联的。
接口可以包含域,但是这些域隐式地是static和final的。
可以先把在接口中显式地将方法声明为public的,但即使不这么做,它们也是public的。