2012-08-15 157 views
20

在Java中可以重寫私有方法嗎? 如果不是,那麼下面的代碼是如何工作的?在超類中的私有方法是否可以在子類中重寫?

class Base{ 
     private void func(){ 
      System.out.println("In Base Class func method !!");   
     }; 
} 

class Derived extends Base{ 
     public void func(){ // Is this a Method Overriding..????   
      System.out.println("In Derived Class func method"); 
     }  
} 

class InheritDemo{ 
     public static void main(String [] args){      
      Derived d = new Derived(); 
      d.func(); 
     } 
} 

回答

2

不,它不是。你可以標記一個覆蓋只是爲了確保像這樣:

@Override 
public void func(){ 
    System.out.println("In Derived Class func method"); 
} 

而在這種情況下,這將是一個編譯器錯誤。

+1

好的@ @ Override',超好用! – TheZ 2012-08-15 20:09:56

+0

感謝您的回覆..但是,即使我在超類最終做出了方法,代碼也能正常工作......所以我認爲如果我們在子類中使用與不同修飾符相同的方法簽名,它只是創建一個新方法的子類而不是覆蓋上面的一個.. – AnkitChhajed 2012-08-15 20:12:23

+0

請參閱編輯。我誤讀了「私人」。 XD – Doorknob 2012-08-15 20:12:53

17

不,不能重寫私有方法,因爲它不可見於任何其他類。您已經爲您的子類聲明瞭一個與超類方法無關的新方法。看待它的一種方法是問自己在Derived類中編寫super.func()是否合法。重寫方法不可能被禁止訪問它重寫的方法,但在這裏就是這種情況。

+1

是的..如果它被覆蓋,那麼如果我創建超類的引用並將基類對象分配給它。噸也必須工作,但它不是 – AnkitChhajed 2012-08-15 20:14:37

1

你不是壓倒一切的。你不能重寫私人成員,你只是在Derived中定義一個新的方法。自從聲明爲私有後,派生自己沒有知識庫的實現func()。在Derived中定義func()時,您將不會收到編譯器錯誤,但這是因爲Derived不知道Base的實現爲func()。要清楚:說你重寫Base的實現func()是不正確的。

+0

哦哎呀我誤讀'私人'XD – Doorknob 2012-08-15 20:11:55

1

沒有,因爲如果你做了類似Base b = new Derived();的事情,你仍然無法調用b.func()。你在做什麼被稱爲「隱藏」。

+0

嗯..非常感謝 – AnkitChhajed 2012-08-15 20:16:08

37

不,你不是壓倒性的。您可以通過嘗試使用@Override進行標記或嘗試撥打super.func();來進行檢查。兩者都行不通;他們拋出編譯器錯誤。

此外,檢查了這一點:

class Base { 
     private void func(){ 
      System.out.println("In base func method");   
     }; 
     public void func2() { 
      System.out.println("func2"); 
      func(); 
     } 
} 

class Derived extends Base { 
     public void func(){ // Is this an overriding method? 
      System.out.println("In Derived Class func method"); 
     } 
} 

class InheritDemo { 
     public static void main(String [] args) { 
      Derived D = new Derived(); 
      D.func2(); 
     } 
} 

它會打印:

func2 
In base func method 

當您在Base改變func()公衆,然後這將是一個覆蓋,並輸出將更改爲:

func2 
In Derived Class func method 
+1

@Polygnome:示例+1展示它不是一個覆蓋,和'@ Override'測試。 – 2012-08-15 23:06:12

+2

+1表示在這種情況下動態分派如何工作(或不工作:D)。 – 2013-07-10 10:10:55

+1

很好的答案。 – 2017-05-05 11:51:01

0

由於該方法是私有的,因此其他類不可見。因此,派生類不會繼承此方法。 所以這是不是覆蓋的情況下

0

方法隱藏將發生在這裏,而不是重寫。就像靜態情況下會發生什麼一樣。

0

其實,你是不是overriding.Before Java5的

覆蓋方法的返回類型必須與父類的方法相匹配。

但是Java 5引入了一種叫做covariant return type的新工具。你可以重寫一個具有相同簽名的方法,但返回返回對象的一個​​子類。換句話說,子類中的方法可以返回一個對象,該對象的類型是該超類中具有相同簽名的方法返回的類型的子類。 你可以按照這個線程:Can overridden methods differ in return type?

-1

你不能重寫的東西是不可見的或不存在的子類。

相關問題