一个Java文件只能有一个public类

《Java编程思想 第4版》6.4 类的访问权限 中有这么3句话:

  1. 每个编译单元(文件)都只能有一个public类。这表示,每个编译单元都有单一的公共接口,用public类来实现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。
  2. public类的名称必须完全与含有该编译单元的文件名相匹配,包含大小写。所以对Widget而言,文件的名称必须是Widget.java,而不是widget.javaWIDGET.java
  3. 虽然不是很常用,但编译单元内完全不带public类也是可能的。在这种情况下,可以随意对文件命名。

先来理解第1句话中的“包访问权限”。
我们知道,publicprotectedprivate是Java中的访问权限修饰符。如果没有提供权限修饰词呢,没有明确指定某成员是publicprotectedprivate呢?这时就是指“包访问权限”了(“包访问权限”有时会表示成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();
    }
}

可以看到,包内的类HelloTest可以访问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,在该文件中定义了两个类:HelloWorld,这两个类都是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版

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值