《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版