2014-11-14 109 views
0

我在下面的代碼中使用受保護的修飾符,但它不像我所期望的那樣工作。爲什麼這個受保護的屬性不起作用?

這是我的Prob3.java文件,編譯時我期望有錯誤ob1.x=4; 任何人都可以解釋爲什麼我沒有得到一個?

class Coordinates2D{ 
    protected int x,y; 
    public Coordinates2D(int x,int y){ 
     this.x=x; 
     this.y=y; 
    } 
    public int getX(){ 
     return this.x; 
    } 
    public int getY(){ 
     return this.y; 
    } 
    public void setX(int val){ 
     this.x=val; 
    } 
} 

public class Prob3{ 
    public static void main(String[] args){ 
     Coordinates2D ob1 = new Coordinates2D(3,4); 
     ob1.x=4; 
     System.out.println("Atributele ob 2D: "+ ob1.getX()+" , "+ob1.getY()); 
    } 
} 
+0

可能的重複:http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private'protected'允許在同一個包中訪問。 – clcto 2014-11-14 18:35:31

+0

您正試圖在類Coordinates2D之外設置對象值。因爲ob1.x受保護,它會給你一個錯誤。 – 2014-11-14 18:35:31

+3

它們是否在同一個包中?如果他們是,那麼這工作正常。受保護意味着它可以在包裝內查看。如果你只希望它被那個班級看到,你應該使用私人的。 – AdamMc331 2014-11-14 18:35:40

回答

0

你沒有得到錯誤的原因是因爲你沒有做錯任何事情。但是,您認爲您做錯了,請讓我解釋一下:

關鍵字protected允許在同一個package的任何類中查看變量。

由於您的prob3類和Coordinates2D類位於同一個包中,因此可以同時訪問受保護的變量。如果你想限制變量x和y的可用性,你應在其訪問修飾符設置爲私有:

private int x, y; 

嘗試它,並留下您的代碼相同的其餘部分。你會得到你期望的編譯器錯誤。

+0

謝謝。我理解這個主意。最後,我得到了PROTECTED概念的理解。 – 2014-11-14 18:53:00

+0

@TautAdrian很高興知道。這絕對是一個棘手的問題,你並不孤單,你的困惑。 – AdamMc331 2014-11-14 18:54:56

1

protected關鍵字限制任一個變量或函數的可訪問性的範圍,以相同的封裝內,或任何亞類繼承與類所述可變或功能。這意味着只要兩個類位於同一個包中,他們就可以使用關鍵字protected訪問對方的屬性和方法。在這種情況下,它們不僅在同一個包中,而且在同一個類文件中。如果要限制x,y的訪問權限僅限於Coordinates2D級別,請改用關鍵字private

+1

只是爲了讓它更加清晰:如果你的類在同一個.java文件中定義,那麼你的兩個類都在同一個包中 - 因此,在你的場景中按照預期進行保護。 – JBA 2014-11-14 18:42:40

0

protected部件是可見的

  • 類本身
  • 類的任何亞類和
  • 在相同的包中的任何類。

由於這些類位於同一個文件中,因此它們位於同一個包中,因此它們將具有訪問權限。