2016-12-20 76 views
1

在學習OCJP時,我遇到了這個讓我感到意外的包問題。 我有兩個簡單類的類信息和新信息分別每一個自己的包A和B的範圍內:包/默認訪問的交叉包繼承

package A; 
public class Message 
{ 
    String getText() 
    { 
     return "text"; 
    } 
} 

和類NewMessage作爲這是在程序包B和亞類A的:

package B; 
public class NewMessage extends A.Message 
{ 
    String getText() { 
     return "New Message"; 
    } 

    public static void main(String[] args) 
    { 
     System.out.println(new NewMessage().getText()); 
    } 
} 

而且我編譯如下:

javac -d . Message.java 
javac -d . NewMessage.java 

和運行:

java B.NewMessage 

和它打印

New Message 

按照此stackpost Can a private method in super class be overriden in the sub-class? 我試圖標記NewMessage作爲的方法,採用@Override並且編譯,這給了我以下錯誤:

NewMessage.java:4: error: method does not override or implement a method from a supertype 
     @Override 
     ^

這意味着我不是覆蓋getText()方法。 有人可以向我解釋這裏發生了什麼?這種情況是否類似於我鏈接後的私人方法重寫的情況?

+0

你明白嗎? – ItamarG3

+0

@ItamarGreen我的理解是這種行爲與私有方法重寫的行爲相同。我知道默認的可見性意味着它只能被默認的包類看到和訪問。如果我想覆蓋它,那麼我需要在類A中的getText()方法中添加「protected」修飾符。 –

回答

-1

這是因爲不同的原因發生的事情:

System.out.println(new NewMessage().getText()); 

您正在創建一個NewMessage對象,它有一個方法。如果你創建了一個對象,它沒有足夠的方法,但仍然延長Message,那麼輸出將是'text'

+1

實際上,** does **與處於不同包中的類有關。 –

+0

@TimothyTruckle究竟如何? – ItamarG3

0

我認爲這個問題的答案有你在找什麼:

In Java, difference between default, public, protected, and private

接受的答案引用本文檔從Oracle:

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

由於默認範圍是只包,你的子類是不允許覆蓋它甚至訪問它。如果您要從NewMessage類中移除getText()方法並嘗試編譯,您可以看到Message類中的getText方法對NewMessage不可見。

我認爲這與您鏈接的帖子有相似之處,但不同之處在於,由於沒有指定訪問修飾符,因此只會對包進行訪問。

0

你在Message類方法默認知名度,這意味着它是唯一在同一封裝內可見。因此,對於其他包中的子類可見而不是

由於方法在包B中不可見,因此無法覆蓋我的NewMessage