2009-08-28 79 views
12

我有兩個問題在此代碼混淆「重寫一個私有方法」

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1)如何是函數f是對覆蓋PO的參考可見;

2)爲什麼是輸出的 「私人f()的」

+0

但是如何與子類的一個對象可以調用一個超類的一個私有方法的參考???這是一個錯誤? – 2009-08-28 13:56:10

+0

不,這不是一個錯誤,這完全是因爲它應該工作。 – Jesper 2009-08-29 05:56:37

+0

但不違反這個繼承的規則和後期綁定 – 2009-08-29 08:00:56

回答

24
  1. main方法是內部Override類,所以它ofcourse可以看到Override類的私有成員。

  2. 您在Derived覆蓋方法f,沒有多態性。變量類型po的是Override,因此將需要方法fOverride類。

注意,在Override類方法f是完全不可見的Derived類。在Derived類中的方法f是一種不同的方法,不具有任何與超類中的方法f

+0

但是,當綁定在運行時完成,然後將PO具有派生類對象它是那麼如何能夠調用父類的私有方法。 – 2009-08-28 11:40:05

+3

無處在你的代碼中有一個超類的私有方法的調用。當你調用po.f()時,Override的f被調用,因爲po的編譯時類型是Override。由於沒有壓倒一切的,沒有動態綁定(無多態性) - Java不看在運行時類型。 – Jesper 2009-08-29 05:54:26

2
Override po = new Derived(); 
po.f(); 

您正在訪問即使對象導出,因爲按照範圍規則,類的私有成員首先考慮,並作爲其寫在覆蓋它引用的私有的F範圍覆蓋自己的方法,並因爲它的私有它根本不在Derived類中覆蓋,所以只有方法簽名相同時纔會覆蓋。

Derived po = new Derived(); 
po.f(); 

Thsi是正確的代碼,將調用派生公司的F

+0

問題是關於Java,而不是C#。 Java中不存在'虛擬'。 – Jesper 2009-08-28 10:59:21

+0

感謝您的評論,我也修復了answwer。 – 2009-08-28 11:06:16

0

方法的重寫有三個conditions.child類必須具有相同的名稱和參數和返回值作爲超級class.But如果同時滿足參數和返回值有所不同,所以倍率是不存在的,即使兩個方法是不同的方法確定這樣的:!!!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

Eclipse將不會說話的錯誤!因爲類Child中的方法addV與父類中的方法addV不同。

+0

只有方法的名稱和參數列表必須完全相同。孩子的返回值可以是父母返回值的子類。並且還有兩條規則被省略。孩子的方法必須至少與父母方法一樣可用。而子類不能拋出新的檢查異常或更廣泛的異常。 – pkkoniec 2016-10-21 17:48:30