Java中的访问控制符
Java提供了4种访问控制级别
- private
- 不加任何访问控制符的访问控制级别(default)
- protected
- public
从上到下,访问控制级别由小到大。
权限介绍
- private:当前类访问权限。如果类中的成员(包括属性、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。
- default:包访问权限。如果类中的成员(包括属性、方法和构造器等)或者一个外部类,不用任何访问控制符修饰,我们就称它是包访问权限。default访问控制的成员或外部类可以被相同包下的其他类访问。
- protected:子类访问权限。如果类中的成员(包括属性、方法和构造器等)使用protected访问控制符来修饰,则这个成员即可以被同一个包中的其他类访问,也可以被不同包中的子类访问。
- public:公共访问权限。这是一个最宽松的访问控制级别。如果类中的成员(包括属性、方法和构造器等)或者一个外部类,使用public访问控制符来修饰,那么这个成员或者外部类就可以被所有类访问,不管访问类和被访问类是否处于同一个包中,不管是否具有父子继承关系。
外部类只能有两种访问控制级别:public和默认default。外部类不能使用private和protected修饰。因为外部类没有处于任何类的内部,也就没有所在类的内部、所在类的子类两个范围。因此,private和protected访问控制符对外部类没有意义。
访问级别控制表
private | default | protected | public | |
---|---|---|---|---|
同一个类中 | √ | √ | √ | √ |
同一个包中 | √ | √ | √ | |
子类中 | √ | √ | ||
全局范围内 | √ |
上面表格横向(每行)比较
比如:有3个类,C1,C2,C3。
其中C1和C2在同一个包下
C3和C2不在一个包下,且C3继承了C2,即,C3是C2的不同包下的子类。
在同一个类中,C2访问本类中的属性、方法和默认类。都可访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43//C2类
package com.study.demo1;
public class C2 {
private int a;
int b;
protected int c;
public int d;
private void test1(){
}
void test2(){
}
protected void test3(){
}
public void test4(){
}
public static void main(String[] args) {
C2 c2 = new C2();
c2.a = 1;
c2.b = 2;
c2.c = 3;
c2.d = 4;
c2.test1();
c2.test2();
c2.test3();
c2.test4();
T t = new T();
}
}
//没有任何访问控制符修饰的类
class T{
}在同一个包中,C1访问C2中的属性、方法和默认类。除了private访问控制符修饰的属性或方法,其他访问控制符修饰的,都可访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//C1类
package com.study.demo1;
public class C1 {
public static void main(String[] args) {
//类C1与类C2在同一个包内
C2 c2 = new C2();
//c2.a = 1;//编译报错
c2.b = 2;
c2.c = 3;
c2.d = 4;
//c2.test1();//编译报错
c2.test2();
c2.test3();
c2.test4();
T t = new T();
}
}子类中,C3和C2不在一个包下,且C3继承了C2,即,C3是C2的不同包下的子类。子类中,只能访问父类中的protected和public访问控制符修饰的属性和方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22package com.study.demo2;
import com.study.demo1.C2;
public class C3 extends C2 {
public static void main(String[] args) {
//类C3继承类C2
//即类C3是类C2的子类
C3 c3 = new C3();
//c3.a = 1;//编译报错
//c3.b = 2;//编译报错
c3.c = 3;
c3.d = 4;
//c3.test1();//编译报错
//c3.test2();//编译报错
c3.test3();
c3.test4();
//T t = new T();//编译报错
}
}全局范围类,public访问控制符修饰的属性、方法可以被全局访问。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.