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修飾的可見。
