2012-10-12 30 views
4

圍繞Android API來源進行訪問。有一個數據成員descriptorFileDescriptor有沒有訪問修飾符:以Java訪問軟件包專用字段

int descriptor; 

再就是類FileOutputStream是構造一個新的FileDescriptor並分配到該字段:

fd = new FileDescriptor(); 
fd.descriptor = fileSystem.open(...); 

如何是與現場的訪問控制兼容Java的模型?我認爲package-private字段不能從聲明類外部訪問,並且沒有像C++那樣的友誼概念。

回答

18

基本上,包裝和私營部門可以在classpackage級別訪問:

the source

Access Levels 
Modifier Class Package Subclass World 
public   Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 
+0

在這種情況下什麼構成一個包?命名空間java.io中的所有類?或者'java.io'中的所有類都在同一個編譯單元中? –

+0

「名稱空間」java.io構成一個包,所以'java.io'的寬度將具有「包級」訪問權限。 – NominSim

+0

因此,如果我在'java.io'中聲明瞭一個類,那麼''I',API消費者可以在該字段周圍戳動?聽起來像一個非常野外突破封裝給我。 –

0

包私人領域(和其他任何東西)就是這樣:私人包裝內的私人領域。這意味着沒有其他類可以訪問包的範圍之外的字段(或其他實體)。有關更具體的細節,請參閱here

1

無改性劑宣言,像

INT描述符;

軟件包是否爲私有,通常稱爲DEFAULT,可在軟件包內訪問而不在軟件包外部訪問。 同一包內的任何類都可以訪問這些類,但這些在包外不可見。

欲瞭解更多詳細信息,請參閱here

Access Levels 
Modifier  Class Package  Subclass World 
public   Y   Y  Y   Y 
protected   Y   Y   Y   N 
no modifier  Y   Y   N   N 
private   Y   N   N   N 
+0

不要忘記保護。 – AedonEtLIRA

+0

是啊保護,也有.. –