除了公共访问级别外,针对类还有默认访问控制级别,在上面的例子中已经使用到,当在类定义时前面什么都不写就是默认访问级别。如果一个类的资源仅允许在包内访问,则可以将该类定义为默认访问级别。下面的图中说明了默认访问级别与公共访问级别间的区别。
上图中描述了两个包,包 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 中执行程序,得到下面的显示结果: