2015-04-20 26 views
0

要被訪問當我在包com.access.test在訪問一個缺省(與像公共或在它前面的私人沒有訪問修飾符)訪問可變像String s = "hello"class Aclass B相同的包,我無法獲得class B中的變量s。 IDE顯示變量s從不定義。變量與默認訪問關鍵字是無法在同一個包中的不同類

但是爲什麼Java會說默認訪問變量可以在同一個包中訪問。就像我們知道通過擴展類可以從不同的包中訪問受保護的變量。 因此,一個默認變量應該可以訪問,甚至不需要對其進行class A的對象實例化(A a = new A(),然後a.s)。 請解釋。

+0

做兩個類文件定位在同一個文件夾? –

+0

不,我不這麼認爲。在eclipse中它們處於相同的包中。 –

+0

如果它們位於不同的文件夾中,則它們被視爲處於不同的包中。 Java中沒有包層次結構,即類'a.b.c'中的類不會看到包'a.b'類的包 - 私有字段和方法,反之亦然。 –

回答

0

你應該能夠通過A.

的實例來訪問它在B上做這樣:

A a = new A(); 
//print a.s 

如果定義字符串a爲靜態的,那麼你可以通過類名訪問B like:

//print A.s 
0

即使在同一個包中不可能訪問類的直接外部類A的變量。

想一想,用一種簡單的方法,B類在同一個包中,但不能繼承A類,對!因此String s;不是class B的一部分。那麼如何直接訪問呢?您必須在class B中創建class A的對象,然後才能訪問String s

只要在Java中使用訪問修飾符的基礎知識,您就會知道即使沒有它的對象,也無法在類之外訪問類的公共變量。

例如:

class Test5 
{ 
    public int x=10; 
} 
class TestMain 
{ 
    public static void main(String[] arg) 
    { 
     //System.out.println(x); //Generates Compile Time Error 
     Test5 obj= new Test5(); 
     System.out.println(obj.x); 
    } 
} 

在這個例子中,x是公開的,但仍然沒有Test5類的對象不可訪問,即使兩個類都在同一個程序文件。

默認修飾符的情況也是如此。

希望這會有所幫助。

0

考慮以下兩類

public ClassA { 
    String myA = "A string"; 
} 

public ClassB { 
    String myB = "B string"; 
} 

我想你可能會產生混淆無障礙命名空間。每個類定義都創建自己的名稱空間。這使您可以在單獨的類中創建相同名稱的實例字段,這些類仍然分別封裝在每個類中。

如果您希望訪問在同一個包中但在單獨的類中具有默認訪問權限的實例字段,則必須使用類實例限定該字段名稱(以便編譯器知道該字段的位置; if您不要質量字段名稱,然後假定您只想考慮當前範圍中的字段名稱)。例如,從ClassB訪問myA你可以這樣寫:

a = new ClassA(); 
System.out.println("myA = " + a.myA); 
相關問題