有時候,你可能無意中寫出這樣的代碼:
public class PrivateOverride
{
private void f()
{
System.out.println("private f()");
}
public static void main(String[] args)
{
PrivateOverride po = new Derived();
po.f();
}
}
class Derived extends PrivateOverride
{
public void f()
{
System.out.println("public f()");
}
}
{
private void f()
{
System.out.println("private f()");
}
public static void main(String[] args)
{
PrivateOverride po = new Derived();
po.f();
}
}
class Derived extends PrivateOverride
{
public void f()
{
System.out.println("public f()");
}
}
你可能想當然得認爲輸出會是"public f()".事實上,private的方法會自動被認爲是"final"的.它對繼承類也是不可見的.所以,Derived類裏的方法f()在這個例子裏其實是一個全新的方法.它甚至不能算是重載(overload),因爲基類裏的方法f()對Derived類也是不可見的.
從這個例子我們可以看到只有非private(non-private)的方法纔可以被重載(overload).但是,你必須提防"重載"private方法的現象,這種情況編譯器不會報錯,但結果卻可能與你預想的不一樣.爲了清晰起見,在爲繼承類裏的方法起名時應當要儘量與基類裏private方法的名稱不同.