成员变量/方法的访问控制

Java提供了4种访问控制的类型,规定一个类的成员变量/方法的可见性(什么地方可以看见并使用)。
因为对于成员变量和方法是一样的,以下我们只用成员变量说明。

成员变量/方法的可见性可总结为

    1. public类型:全project的class可见,可被继承
    1. private类型:只有自身class可见;
    1. Default类型(没有访问控制修饰符):只有同一个包class可见;
    1. 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编程有相当熟悉程度了再深究不迟。