2015-06-08 28 views
0

有人可以解釋這種行爲嗎?它是一個錯誤還是我缺少一些明顯的東西?Java-Access Speficier

1)創建2個軟件包,比如pack1和pack2放在同一個目錄下。

2)在PACK1創建類X

package pack1; 
import pack2.*; 
public class X 
{ 
    void eat() 
    { 
    System.out.println("X eat"); 
    } 

    public static void main(String args[]) 
    { 
    X x = new Y(); 
    x.eat(); //accessing eat() method on Instance of Y. 
    //But since eat() is not public or protected its visibility must be limited to class X 
    System.out.println("Done"); 
    } 
} 

3)現在,在PACK2創建一個Y級

package pack2; 
import pack1.*; 
public class Y extends X 
{ 
} 

的方法,吃不應該提供給Y類,因爲它有'默認「訪問說明符,這會限制它對聲明的包的可見性(包X)。所以,這個方法不應該在類Y中可用。但是當我編譯並執行這段代碼時,它工作正常。它不違反'默認'訪問說明符嗎?如果我將X x = new Y()更改爲Y x = new Y(),則編譯失敗!

+0

在複製中,用'package private'替換'private'作爲答案。可訪問性是基於調用方法的表達式的靜態類型來確定的。在你的情況下,'X',而不是'Y'。 –

回答

1

[編輯]

1)的方法,吃不應該提供給Y類,因爲它有這限制了它的可見性聲明它的包(package X)「缺省」訪問說明符。所以,這種方法不應該在課堂上Y.提供

答: 您沒有訪問Y的吃法,您要訪問X的吃法。此外,您可從主調用它X的方法,這意味着它是可見的(該調用在包pack1內)。

移動代碼:

public static void main(String args[]) 
{ 
    X x = new Y(); 
    x.eat(); 
    System.out.println("Done"); 
} 

從類X(在PACK1)類Y(在PACK2)一看就知道吃()不再訪問。您將收到編譯器錯誤消息

的方法,吃()從X型是不可見的

2)亦如果更改X X =新的Y()到Y X =新Y(),然後編譯失敗!

答: 因爲,像以前一樣,你正在訪問的方法是不是在Y類,但類X.由於吃()方法的默認訪問修飾符,它不可通過繼承。因此,由於變量現在是Y類型(不是X),因此不能再訪問此方法。

+0

還是不明白。參考的類型是否確定方法是否可訪問?這很奇怪嗎?成員是否可訪問應該由實例確定,而不是通過引用來確定。 –

+0

我在說什麼(可能不夠清楚)是顯示默認訪問按預期工作,將呼叫轉移到吃包2。原始代碼中允許調用,因爲它是從pack1中創建的。 – JamesB

+0

@SotiriosDelimanolis更新了我的答案。 – JamesB