2010-03-10 33 views
2

我瞭解到一個班級可以是公共或私人包裝(最後一個值是默認值)。類的字段也可以是公共的或私有的。這些「狀態」具有相同的含義。如果某些東西是包私有的,它只能在同一個包中看到。它是公開的,它從任何地方都可見(來自任何包裹)。班級和領域的知名度之間的相互影響

我不清楚這些狀態是如何相互影響的。特別是我對以下兩種情況感興趣:

  1. 該類是公開的,但它的字段是包私有的。這個字段只能從包中看到嗎?

  2. 這個類是包私有的,它有一個公共字段。哪裏會唱這個領域?

總的來說,我不明白爲什麼我們費心,如果一個類是公共的還是包私人,如果在任何情況下,對於一類(場和方法)的任何單個組件,我們表明,如果它是公共的還是包私人。

+0

我認爲你的意思是「在相同的包裝內」,而不是在第一段中的「在同一班級內」。 –

+0

@Jon Skeet,你是​​對的。感謝您的評論。 – Roman

回答

5

應用最嚴格的可見性。您的問題的答案是:

  1. 是的。
  2. 僅限套餐。

包類中的公共字段通常沒有多大意義。

有一些微妙之處:私有嵌套類中的私有字段可以被封閉類讀取(儘管由於隱式添加了綜合訪問器會導致一些性能損失)。

Sun's tutorial有一個關於能見度的簡短說明。另請參閱嵌套類的部分。

編輯:爲了您的興趣,反思也允許篡改visibilities。

+0

Xr,但在第一種情況下,字段可見性會覆蓋類可見性。該字段是包私有的,並且類是公共的,因此該字段只能從「本地」包中看到。 – Roman

+0

正確。其實,這是最嚴格的適用。我搞砸了第一句(固定它),但我的答案的其餘部分仍然成立。 –

+0

+1提及合成訪問器。 – mtsz

1
  1. 如果該類是公開的,那麼該類的所有成員都是「可能」可見的。但正如你所說,該領域只會在包裝內看到。

  2. 如果該類不可見,那麼您將如何引用該字段?所以是的,它僅限於套餐。

當然值得注意的是,大多數時候你不應該使用公共字段,除非它們是常量。

我不明白你的最後一點,當我第一次讀到它,但我覺得你問爲什麼這是值得設置限制性類訪問修飾符時,你可以限制訪問的方法。爲什麼不能依賴字段/方法來提供限制的一個原因是擴展類(可能在另一個包中)可能會增加方法的可見性。但是,如果他們無法看到課堂延伸,那麼你就很安全(r)。

+0

所以,如果一個類是「公開」的,而不是所有的領域都是公開的,並且如果我們在這些領域的前面使用「公共」修飾符,這個領域將是真正公開的。如果一個類是包私有的,比字段的修飾符沒有任何意義(不管我們使用什麼字段修飾符,這個字段總是包私有的)。 – Roman

+0

是的「潛在公衆」部分。沒有包裝私人的東西。在這種情況下,「受保護」和「私人」仍然保留其含義。 –

+0

沒錯。在第二種情況下,該字段當然可以是包私有的或私有的。 –

1

您可以將可見性視爲層次結構。您必須先看到課程,然後才能看到其任何成員或功能。考慮到這一點,您的兩種情況解決方案如下:

  1. 是的,同一個包中的類可以在公共類中看到包私有字段。
  2. 只有同一個包中的類才能看到包私有類中的公共成員和函數。

如果您正在編寫您期望他人使用的API,最好使用package private隱藏可幫助您設計的類,但不會貢獻給API。

相關問題