Java中的四種訪問修飾符:public、protected、default(無修飾符,默認)、private。
- 四種修飾符可修飾的成分(類、方法、成員變量)
public | protected | default | private | |
類 | √ |
× | √ |
×(內部類可以用private修飾) |
方法 | √ |
√ |
√ |
√ |
成員變量 | √ |
√ |
√ |
√ |
- 四種修飾符的訪問權限
public:對所有類可見
protected:對同一包中的類可見、對同一包及不同包中的子類可見
default:對同一包中的類可見、對同一包中的子類可見
private:僅對類本身可見
可見是可訪問的意思,即由這些修飾符修飾的成分(類、方法、成員變量)可以被其它類訪問。對子類可見即子類可以繼承。
這里需要注意的是protected與default,二者的區別在於不同包中的子類是否可以繼承。
訪問權限 | 類 | 同一包 | 同一包中的子類 | 不同包中的子類 | 不同包 |
public | √ |
√ |
√ |
√ |
√ |
protected | √ |
√ |
√ |
√ |
× |
default | √ |
√ |
√ |
× | × |
private | √ |
× | × | × | × |
- 例如
package1:ParentClass、ChildClassOne、TestOne
package2:ChildClassTwo、TestTwo
package3:TestThree
其中ParentClass為
public class ParentClass { public int a=2; protected int b = 3; int c = 4; private int d = 5; }
1.對於TestOne來說,ParentClass類、a、b、c均可見,d不可見。即在TestOne中可以new一個ParentClass對象,且該對象中的a,b,c變量可操作。如下:
public class TestOne { public static void main(String args[]) { ParentClass obj = new ParentClass(); System.out.println(obj.a); System.out.println(obj.b); System.out.println(obj.c); // System.out.println(obj.d); //d 不可見 } }
2. ChildClassOne繼承ParentClass且與其在同一個包中,則a、b、c均可見,d不可見。
public class ChildClassOne extends ParentClass{ public static void main(String args[]) { ChildClassOne obj = new ChildClassOne(); System.out.println(obj.a); System.out.println(obj.b); System.out.println(obj.c); // System.out.println(obj.d); // d不可見 } }
3. ChildClassTwo繼承ParentClass,則a、b均可見,d不可見,由於子類與ParentClass不在同一包中,故c(default類型)不可見。
public class ChildClassTwo extends ParentClass{ public static void main(String args[]) { ChildClassTwo obj = new ChildClassTwo(); System.out.println(obj.a); System.out.println(obj.b); // System.out.println(obj.c); // c不可見 // System.out.println(obj.d); // d不可見 } }
4.對於TestTwo來說,ParentClass類、a均可見,b、c、d不可見。由於TestTwo與ParentClass不在同一個包中,故只有public修飾的成分可見。
public class TestTwo { public static void main(String args[]) { ParentClass obj = new ParentClass(); System.out.println(obj.a); // System.out.println(obj.b); // b 不可見 // System.out.println(obj.c); // c 不可見 // System.out.println(obj.d); // d 不可見 } }
- 另外值得注意的是繼承父類的子類與其他類之間的可見性,取決於其他類與父類之間的可見性。
對於TestOne來說,ChildClassOne中a,b,c都可見,d不可見,這是由於TestOne與ParentClass在同一個包中。
而對於TestThree來說,ChildClassOne中只有a可見,這是由於TestThree與ParentClass在不同的包中。
需要注意:
雖然a、b對ChildClassTwo可見,TestTwo與ChildClassTwo在同一包中,
但對於TestTwo來說,ChildClassTwo中只有a可見,這是由於TestTwo與ParentClass在不同的包中,只有public修飾的可見。