Java public class 与 缺省无修饰符class 完整详细区别前置概念public访问修饰符公共权限缺省类类前面不写任何修饰符既无public、private、protected官方名称为包访问权限 / 包私有权限以下对比只针对顶层类直接写在.java文件中不是方法/类内部的内部类。一、源文件语法强制规则编译直接报错硬性规定1. public class 规则单个.java文件最多只能有1个 public class不能存在多个public修饰的类名必须和当前.java文件名完全相同大小写严格区分示例文件Person.java// 合法publicclassPerson{}// 普通缺省类允许存在多个classTest1{}classTest2{}错误案例文件Person.java写public class User{}→ 编译失败。2. 缺省class规则一个java文件可以写任意多个缺省class数量无限制类名与java文件名无任何绑定叫什么都可以示例Demo.javaclassA{}classB{}classC{}完全合法无编译报错。二、访问权限核心本质区别1. public class权限全局可见任意包都能访问同包其他类直接new使用无需import不同包类通过import 完整包名.类名导入后实例化、继承、调用方法全部正常示例包1com.entity.User.javapackagecom.entity;publicclassUser{}包2com.test.Test.javapackagecom.test;importcom.entity.User;publicclassTest{publicstaticvoidmain(String[]args){UserusernewUser();// 跨包正常使用}}2. 缺省class权限仅当前同一个package包内可见同包类正常创建对象、调用跨包类就算手动import导入也无法实例化、继承直接编译报错示例包1com.entity.Order.javapackagecom.entity;// 缺省类仅限com.entity包内使用classOrder{}包2无法使用Order代码直接报错。三、编译后生成class文件规则Java编译机制每个独立顶层类都会单独生成一份.class字节码文件文件内public class Student→ 生成Student.class文件内缺省类Temp→ 生成Temp.class例Student.javapublicclassStudent{}classHelper{}编译产出两个文件Student.class、Helper.class。两种类在编译产物上无区别只是权限与文件约束不同。四、继承、重写使用限制public class任意包的类都可以extends该类作为父类支持跨包继承、多态缺省class只有同包下的类能继承其他包无法继承该类不能跨包做父类。五、程序入口main方法适配public class把public static void main(String[] args)写在public类中直接执行java 类名是行业标准规范缺省classmain方法可以写在缺省类里运行不会报错但不推荐。原因其他包无法访问该类项目分层后不方便调用启动程序。六、框架反射适配场景Spring、MyBatis等主流框架会通过反射跨包创建类对象Controller、Service、Mapper、实体类必须是public class如果写成缺省class框架跨包反射实例化失败抛出异常。七、适用开发场景区分使用 public class 的场景项目对外提供的实体类、工具类、业务类程序启动类包含main主方法需要跨包继承、被多处调用的父类框架注解类Controller、Service等需要给第三方模块、其他项目调用的公共API类。使用缺省class的场景仅当前包内部使用的辅助工具类临时工具类不需要对外暴露测试专用辅助类仅本包单元测试调用不希望外部包访问、隐藏内部逻辑。八、完整对比表格对比维度public class缺省class无修饰符访问权限所有包全局可见仅同一个包内可见单文件数量最多1个不限数量类名与文件名必须完全一致无任何要求跨包访问import后正常使用跨包直接编译报错跨包继承支持不支持框架反射调用正常实例化反射失败报错工程规范对外业务类标准写法包内隐藏辅助类专用九、高频易错点总结只有顶层类区分public/缺省方法内的内部类不受文件名规则限制private、protected不能修饰顶层类只能修饰成员变量、方法、内部类缺省权限没有关键字不要写成defaultdefault仅用于接口方法、switch分支多人协作项目尽量遵循一个文件一个public类不要大量缺省类堆在同一个文件。