2014-04-14 56 views
-1

我們不能重寫一個私有方法,那麼爲什麼followng代碼不會給出錯誤。相反,它會產生輸出。重寫私有方法

class A { 
    private void fun() { 
     System.out.println("ths is a private method"); 
    } 
} 

class B extends A { 
    void fun() { 
     System.out.println("ths is wrng"); 
    } 
} 

class C { 
    public static void main(String args[]) { 
     B ob = new B(); 
     ob.fun(); 
    } 
} 

回答

1

private方法不被繼承。在main方法中,您對B類型的變量調用fun()方法。類型Bfun()方法似乎可以訪問,假設您的類B和類C處於相同的包中。

假如你這樣做

A ob = new B(); 
ob.fun(); 

然後你會得到你的編譯錯誤。

B#fun()A#fun()完全無關。

0

方法fun()B類中未被覆蓋,因爲它從未從類A繼承。

您在代碼中調用的是B類的方法,與類A和方法A#fun()無關。

要檢查此問題,請添加一個@Override註釋,您將收到編譯時錯誤。

// Compilation error. 
Class B extends A{ 
    @Override 
    void fun(){ 
     System.out.println("ths is wrng"); 
    } 
} 

現在這段代碼不會編譯。

0

兩者是完全不同的方法,彼此不相關。由於私有方法沒有被繼承,所以這裏沒有覆蓋的概念。

0

首先,私有方法不在子類中繼承。如果仍然嘗試編寫一個與父類相同名稱的方法,那麼java編譯器會將子類中的方法視爲一種全新的方法,並且不會拋出任何異常。它像在子類中的新方法一樣在父類中隱藏私有方法。