“Java 中的访问控制符” 之默认访问级别

除了公共访问级别外,针对类还有默认访问控制级别,在上面的例子中已经使用到,当在类定义时前面什么都不写就是默认访问级别。如果一个类的资源仅允许在包内访问,则可以将该类定义为默认访问级别。下面的图中说明了默认访问级别与公共访问级别间的区别。

上图中描述了两个包,包 A 和包 B,包 A 包含了三个类 A,B 和 C,包 B 包含两个类 D 和 E,详细说明如下:

  • 包 A 和包 B 是相互间独立的两个包
  • 包 A 包含了三个类,即 A、B 和 C
  • 包 A 是公共访问级别,B 类和 C 类都是默认访问级别
  • 包 B 包含了两个类,即 D 和 E
  • D 类是公共访问级别,E 类是默认访问级别
  • A 类和 D 类对于其他几个类都是可见的
  • B 类对于 A 类和 C 类是可见的,但是对于处于包 B 中的 D 类和 E 类是不可见的
  • C 类对于 A 类和 B 类是可见的,但是对于处于包 B 中的 D 类和 E 类是不可见的
  • E 类对于 D 类是可见的,但是对于处于包 A 中的 A 类、B 类和 C 类都是不可见的

下面的例子在 com.zmxlh.demo 中定义了两个类,一个是公共访问级别的,另一个是默认访问级别的。

(1)首先定义默认访问级别的 B 类,如下所示:

package com.zmxlh.demo;

public class B {
	private String s;

	public B(String s) {
		this.s = s;
	}
	public void printB(){
	 System.out.println("Default Class B Printing...");
	 System.out.println(s);
	}
}

 B 类定义为默认访问级别的,声明了一个成员变量和一个方法,详细说明如下:

  • 使用 package 关键字声明 B 类属于 com.zmxlh.demo 包
  • class B 前没有 package 关键字,声明 B 类为默认访问级别
  • 声明 String 类型的成员变量 s
  • 构造函数通过将输入的字符串赋值给成员变量来生成对象
  • B 类定义了方法 printB (),该方法包含两条语句,首先输出 “Default Class B Printing….”,接着输出成员变量 s 的值

(2)下面定义公共访问级别的 A 类

代码如下:

package com.zmxlh.demo;

public class A {
	private B b;
	public A(String s){
		b = new B(s);
	}
	public void printA(){
		System.out.println("Public Class A Printing...");
		b.printB();
	}
}

 A 类定义为公共访问级别,同样也声明了一个成员变量和一个方法,详细说明如下:

  • 使用 package 关键字声明 A 类属于 com.zmxlh.demo 包
  • class A 前有 public 关键词,声明 A 类为公共访问级别
  • 声明 B 类型的成员变量 b
  • A 类定义了方法 printA (),该方法包含两条语句,首先输出 “Public Class A Printing….”,接着调用成员变量 b 的方法 printB ()。

 (3)在默认包定义 DefaultClassDemo 类,引入 A 类的相关资源,如下所示。

package Default;
import com.zmxlh.demo.*;

public class DefaultClassDemo {
	public static void main(String args[]){
		A a;	//定义对象引用变量
		a=new A("Public Class A");	//生成对象
		a.printA();		//调用方法
	}
}

上面定义的 DefaultClassDemo 类,导入了 com.zmxlh.demo 包下的 A 类,并生成了 A 类实例 a,调用其相应的方法,详细说明如下:

  • 使用 import 关键字导入了 com.zmxlh.demo 包下的 A 类
  • 使用 new A (“Public Class A”) 生成了对象
  • 使用对象引用变量调用了 printA () 方法

最终在 Eclipse 中执行程序,得到下面的显示结果: