2013-05-13 45 views
0

以下程序在main方法內發生了「obj.method()」行中的編譯錯誤。錯誤是「來自類Superclass的method method()不可見」。根據我的理解,它應該能夠訪問子類的公共方法。任何人都可以解釋它背後的概念嗎?重寫的私有方法導致在訪問Java中的子類公用方法時出現異常

class Superclass{ 

private void method(){ 
    System.out.println("Inside superclass method"); 
} 

} 

public class MyClass extends Superclass{ 

    public void method(){ 
     System.out.println("Inside subclass method"); 
    } 

    public static void main(String s[]){ 

     Superclass obj = new MyClass(); 
     obj.method(); 

    } 
} 
+3

你不能重寫私有方法,如果絕對要重寫,則將其聲明爲protected/public。 – codeMan 2013-05-13 09:23:16

回答

3

從我的理解,應該能夠訪問子類的公共方法。

是的,但只有當你調用它表達的編譯時類型是子類。

所以,如果你改變你的代碼:

MyClass obj = new MyClass(); 

那麼它應該是罰款。目前,obj的編譯時類型只是Superclass,其中並不是有一個公開的method方法。

另請注意,MyClass.method確實不是覆蓋Superclass.method。在Superclass內調用method()只會調用Superclass.method(),即使對象的實際類型爲MyClass

+0

謝謝你的回答。我明白了。 – 2013-05-13 09:54:00

1

method宣佈爲privateSuperclassprivate意味着它只能在該類中訪問。如果您希望子類能夠訪問它(或覆蓋它),則必須聲明protected

+0

我會回答你的回答,如果你想覆蓋已經在超類中定義的方法,你必須添加'@ Override'註解。可能你的IDE會向你推薦它。 – DaGLiMiOuX 2013-05-13 09:25:55

+0

@DaGLiMiOux您通常不需要。但它的建議,因爲它會給編譯時間警告,你實際上並沒有在這種情況下覆蓋任何方法。 – NilsH 2013-05-13 09:26:36

+0

是的,我說'你一定需要',但它是可選的:) – DaGLiMiOuX 2013-05-13 09:27:36

0

obj具有參考SuperClass。所以它只能看到SuperClass方法是protecteddefaultpublic
私有方法僅在類中可見。

No Overriding happens here. 
+0

obj是MyClass的一個實例 – pbespechnyi 2013-05-13 09:25:01

相關問題