2013-05-26 83 views
1

我有這些類:爪哇 - 保護的訪問修飾符

package abc; 

public class A { 

    public int publicInt; 
    private int privateInt; 
    protected int protectedInt; 
    int defaultInt; 

    public void test() { 
     publicInt = 0; 
     privateInt = 0; 
     protectedInt = 0; 
     defaultInt = 0; 
    } 

} 

「A」包含了所有四個訪問修飾符的屬性。這些其他類擴展「A」或創建實例並嘗試訪問屬性。

package de; 

public class D { 

    public void test() { 
     E e = new E(); 
     e.publicInt = 0; 
     e.privateInt = 0; // error, cannot access 
     e.protectedInt = 0; // error, cannot access 
     e.defaultInt = 0; // error, cannot access 
    } 

} 

package de; 

import abc.A; 

public class E extends A { 

    public void test() { 
     publicInt = 0; 
     privateInt = 0; // error, cannot access 
     protectedInt = 0; // ok 
     defaultInt = 0; // error, cannot access 
    } 

} 

package abc; 

import de.E; 

public class C { 

    public void test() { 
     E e = new E(); 
     e.publicInt = 0; 
     e.privateInt = 0; // error, cannot access 
     e.protectedInt = 0; // ok, but why? 
     e.defaultInt = 0; // error, cannot access 
    } 

} 

一切都好,除了我不明白,爲什麼在C類,我可以訪問e.protectedInt。

回答

1

我認爲一個代碼插圖可以幫助我們更好地理解。

,E類添加一個受保護的成員現在

public class E extends A { 
    protected int protectedIntE; 
    ... 

,嘗試在類訪問它ç

e.protectedInt = 0; // ok, but why? 
e.protectedIntE = 0; // error, exactly as you expected 

所以,這裏要注意的一點是,儘管你通過一個實例訪問protectedIntE它實際上屬於A類,並且通過繼承被E類繼承。類E的實際(非繼承)保護成員仍然無法像您期望的那樣訪問。

現在,由於A類和C類在同一個包中,受保護的訪問基本上作爲包的超集(也包括子類訪問),所以編譯器在這裏沒有什麼可抱怨的。

1

因爲CA(包abc)位於同一包中,並且在Java中的protected修飾符包括在同一包中的訪問。

0

Acces Control

按照鏈接,你到了Java文檔,explanes修飾符accessibalities。

protected對於您當前的類,包和子包,類,函數等是可見的。也可以在你班的子類中看到。