2013-03-23 64 views
0

我認爲沒有差別,但後來我遇到了這一點:明確寫作公開而不寫作公開有什麼區別?

public class Whatever 
{ 

String toString() 
{ 
//stuff 
} 

} 

此代碼導致編譯器錯誤:

toString() in Whatever cannot override toString() in java.lang.Object ; attempting to assign weaker access privileges; was public

如果我明確地鍵入public String toString()代碼編譯就好了。

回答

5

如果您不使用方法和字段的public訪問說明符,它們被假定爲在package級別的可見性下。

這裏是什麼packagepublic在可視性方面意味着你的類之外的漂亮圖表:

Modifier  Class Package Subclass World 
---------------------------------------------------------- 
public   Y   Y   Y  Y  
protected  Y   Y   Y  N 
no modifier  Y   Y   N  N  <--- This is package level 
private   Y   N   N  N 

Y意味着方法,類或字段可見。

N意味着該方法,類,或字段是可見

+0

'package'不是Java中真正的關鍵字嗎? – millimoose 2013-03-23 23:08:22

+0

@millimoose'package'關鍵字用於表示類X位於包Y中。至於訪問控制,不使用關鍵字包。 – 2013-03-23 23:09:22

+0

哦,對。 IDE始終生成的那個。我的錯。 – millimoose 2013-03-23 23:11:23

0

@Hunter麥克邁林提到的封裝級可見性(1)。

我只是想添加一個簡短的解釋是什麼意思。這意味着來自當前類的相同包和子類的類(即使它們本身屬於其他包)可以訪問此方法/字段。

0

在繼承中,重寫方法時不能縮小方法的訪問範圍。在這裏,Object類的toString()方法具有public訪問權,並且您的類Whatever正試圖通過將訪問級別更改爲package(等同於未指定訪問修飾符)來縮小範圍,並且這是不允許的。

一個package水平的方法可以被定義爲

void someMethod() { 
} 

如果你看到這裏,有void前沒有訪問修飾符,即publicprotectedprivate這意味着在同一個包Whatever所有類將能夠訪問它。包之外的任何包都不能訪問此方法,甚至不能訪問Whatever的子類。

當你明確寫出public時,整個人都可以隨意使用它。

+0

當你說子類時,你指的是擴展類的權利? 所以我們可以說我有: 公共類無論{ //方法有包可見 } 然後另一個類文件: 公共類您好擴展不管{} 類你好將無法獲得這樣的方法,不管用包可見性? – 2013-03-23 23:25:55

+0

僅當類「Hello」在某個其他包中時。如果類「Whatever」和「Hello」在同一個包中,「Hello」將有權訪問包可見性方法。 – devang 2013-03-23 23:32:22

+0

哦,好的,謝謝。 – 2013-03-23 23:33:12

相關問題