成员变量/方法的访问控制
Java提供了4种访问控制的类型,规定一个类的成员变量/方法的可见性(什么地方可以看见并使用)。
因为对于成员变量和方法是一样的,以下我们只用成员变量说明。
成员变量/方法的可见性可总结为
-
public
类型:全project的class
可见,可被继承;
-
private
类型:只有自身class
可见;
-
- Default类型(没有访问控制修饰符):只有同一个包的
class
可见;
- Default类型(没有访问控制修饰符):只有同一个包的
-
protected
类型:同一个包的class
可见,可被继承。
注. protected类型的成员变量和方法非常tricky:子类可以继承其超类的protected成员变量和方法,但是只能在子内内部访问;想要在其他类访问其子类继承来的protected变量/方法,需要和超类放在同一个包。所以对于初学者来说,如果无法理解掌握,就暂时跳过。
实验 Guideline.
- (1) 新建一个accesscontrol包;
- (1) 在accesscontrol下新建一个model包;
- (2) 在accesscontrol下新建一个test包;
- (3) 在model包下建立一个TestData类:
package accesscontrol.model;
public class TestData{
public int publicData = 1; // public类型的成员变量
private int privateData = 4; // private类型的成员变量
protected int protectedData = 2; // protected类型的成员变量
int defaultData = 3; //default类型的成员变量
}
实验1. 在不同包访问TestData类里的成员变量
- 在accesscontrol.test包下新建一个类TestInDifferentPackage.
TestInDifferentPackage.java
package accesscontrol.test;
import accesscontrol.model.TestData;
public class TestInDifferentPackage {
public static void main(String[] args) {
TestData data = new TestData();
System.out.println("publicData = " + data.publicData);
// privateData, protectedData, defaultData均不可见,尝试打印就会出错。
// System.out.println("protectedData = " + data.protectedData);
// System.out.println("defaultData = " + data.defaultData);
// System.out.println("privateData = " + data.privateData);
}
}
实验结果:
在不同包,只能看见TestData的public类型的成员变量publicData。
实验2. 在相同包访问TestData类里的成员变量
- 在accesscontrol.model包中新建一个类TestInTheSamePackage.
TestInTheSamePackage.java
package accesscontrol.model;
public class TestInTheSamePackage {
public static void main(String[] args) {
TestData data = new TestData();
System.out.println("publicData = " + data.publicData);
// privateData不可见,其他均可见。
System.out.println("protectedData = " + data.protectedData);
System.out.println("defaultData = " + data.defaultData);
// System.out.println("privateData = " + data.privateData);
}
}
实验结果:
在相同包,public, protected, 和default类型的成员变量均可见。private类型的不可见。
由于protected比较诡异,这里不再深究。等对Java编程有相当熟悉程度了再深究不迟。