《Java编程思想 第4版》6.4 类的访问权限 中有这么3句话:
- 每个编译单元(文件)都只能有一个public类。这表示,每个编译单元都有单一的公共接口,用public类来实现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。
- public类的名称必须完全与含有该编译单元的文件名相匹配,包含大小写。所以对Widget而言,文件的名称必须是Widget.java,而不是widget.java或WIDGET.java。
- 虽然不是很常用,但编译单元内完全不带public类也是可能的。在这种情况下,可以随意对文件命名。
先来理解第1句话中的“包访问权限”。
我们知道,public、protected和private是Java中的访问权限修饰符。如果没有提供权限修饰词呢,没有明确指定某成员是public或protected或private呢?这时就是指“包访问权限”了(“包访问权限”有时会表示成friendly)。“包访问权限”意味着当前包中的所有其他类都可以访问这个成员,但这个包之外的所有类对这个成员没有访问权限。
举个例子:新建Java项目,在该项目的src目录下新建Package:com.example.tester,并在该Package下新建类Hello。其中,类Hello文件中就定义了具有包访问权限的类Person。
package com.example.tester;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void display(){
System.out.println(name+"is "+age);
}
}
public class Hello {
public static void main(String[] args) {
Person p = new Person("Nicholas",18);
p.display();
}
}
为了便于观察比较,在com.example.tester包下新建类Test,在com.example.tester包外定义类Check,分别如下所示:
package com.example.tester;
public class Test {
public static void main(String[] args) {
Person p = new Person("Jackson",24);
p.display();
}
}
import com.example.tester.Person;
public class Check {
public static void main(String[] args) {
Person p = new Person("Tomas",28);
p.display();
}
}
可以看到,包内的类Hello和Test可以访问Person,而com.example.tester外的类Check无权访问Person,报错信息是这样的:‘com.example.tester.Person’ is not public in ‘com.example.tester’. Cannot be accessed from outside package。
因此,第1句话的意思是,一个Java文件中最多只能有一个public类。如果有多个类,那么除public类外的其他类都是friendly类,即这些类前面没有访问权限修改词。
第2句话的意思是,如果一个Java文件中有一个public类,那么Java文件名必须与该public类名一致。
第3句话的意思是,一个Java文件可以都是friendly类,此时,Java文件名可以任意。看个例子吧。
在com.example.tester包下新建Java文件HelloWorld,在该文件中定义了两个类:Hello和World,这两个类都是friendly类,如下:
package com.example.tester;
class Hello{
public static void main(String[] args) {
System.out.println("hello");
}
}
class World{
public static void main(String[] args) {
System.out.println("world");
}
}
参考文章
为什么一个java源文件中只能有一个public类
Java编程思想第4版



