Java public class 与 缺省class 完整详解

一、访问修饰符基础

Java 类的访问权限分两种场景:

  1. public:公共访问修饰符
  2. 无修饰符(直接写 class):默认包访问权限(包私有)

二、语法文件规则(硬性编译规则,错了直接报错)

1. public class 强制约束

  1. 一个 .java 源文件最多只能存在一个 public class
  2. public 修饰的类名,必须与当前.java文件名完全一致(大小写敏感)
    例:文件 Student.java,里面只能写 public class Studentpublic class Test 直接编译报错;
  3. 不能一个文件写两个 public class,直接编译失败。

正确示例 Student.java

// 类名和文件名完全匹配
public class Student {

}
// 允许存在多个无public普通类
class Teacher {}
class School {}

错误示例1(文件名不匹配)
文件名为 Test.java

public class Demo {} // 编译报错,public类名必须是Test

错误示例2(多个public类)

public class A {}
public class B {} // 编译报错,一个文件不能两个public class

2. 无修饰 class(普通类)无文件名限制

  1. 同一个java文件可以定义任意多个普通class;
  2. 类名和java文件名不需要一致,无强制绑定;
  3. 没有数量限制,全部不用public即可。

示例 Demo.java

class Cat {}
class Dog {}
class Bird {}

代码完全合法,可正常编译生成3个class文件。

三、编译后class文件生成规则

Java编译时,每个独立类都会生成单独 .class 字节码文件

  1. public class Student → 生成 Student.class
  2. 文件内其他普通类 Teacher → 生成 Teacher.class

如上 Student.java 编译后会产出:
Student.classTeacher.classSchool.class 三个文件。

四、核心访问权限区别(最重要)

1. public class(公共类)

权限:任何包、任何位置都能访问、实例化

  • 同包其他类:可以使用
  • 不同包其他类:import导入后即可使用
    适用:项目对外暴露的工具类、实体类、主程序入口类。

2. 无修饰 class(包访问权限)

权限:仅同一个包(package)内的类可以访问

  • 同包类:正常调用、创建对象
  • 其他包类:即便import导入,也无法使用,编译报错
    适用:仅当前包内部使用的辅助工具类、临时内部类。

权限对比表格

类型 同包访问 跨包访问 单文件数量上限 类名与文件名
public class 允许 允许 最多1个 必须完全相同
缺省class 允许 禁止 无限制 无要求

五、main 主方法存放规范

程序入口 public static void main(String[] args) 运行规则:

  1. main方法所在类如果是 public class,直接 java 类名 运行;
  2. main方法写在普通无public类中,运行时也能执行,但开发规范不推荐;
  3. 行业标准:程序启动类统一使用 public class,单独一个文件存放。

示例 Main.java

public class Main {
    // 程序入口
    public static void main(String[] args) {
        System.out.println("程序运行");
    }
}

六、开发场景使用建议

  1. 对外提供功能的类 → 使用 public class,单独一个文件,方便其他包调用;
  2. 仅当前包内部辅助、不对外暴露 → 写在同文件内,使用无public class;
  3. 业务实体、工具类、控制器统一public;
  4. 测试临时小类、工具辅助类,可作为同文件普通class,简化文件数量;
  5. 大型项目禁止一个文件写大量类,遵循一个文件一个public类规范。

七、补充易错点

  1. 只有顶层类才有 public / 缺省区分,方法内部写的内部类不受该文件名规则限制;
  2. 权限只作用于类本身,类内部的方法、变量访问修饰符不受此规则影响;
  3. 缺省权限没有关键字,不是 private/protected,专属名称:包访问权限。

更多推荐