详细介绍一下Java中public class的作用
·
Java public class 完整详细讲解
一、定义语法
public 是 Java 访问修饰符,修饰顶层类时写法:
public class 类名 {
// 成员变量、方法、构造器
}
public class = 公共类,是项目开发最常用的顶层类修饰形式。
二、两大核心作用
作用1:控制访问权限(核心作用)
被 public 修饰的类,全项目任意包、任意位置都能访问。
- 同包其他类:直接 new 创建对象,无需导入;
- 不同包的类:通过
import 包名.类名导入后,即可实例化、调用其方法;
对比无修饰普通类(包访问权限):只能同包使用,跨包直接编译报错。
示例:
包1:com.demo.User.java
package com.demo;
// 公共类,全项目可见
public class User {
public void login(){}
}
包2:com.test.Test.java
package com.test;
import com.demo.User;
public class Test {
public static void main(String[] args) {
// 跨包正常使用User,因为User是public class
User u = new User();
u.login();
}
}
作用2:绑定Java源文件名(编译强制规则)
- 一个
.java文件最多只能有 1 个 public class; public修饰的类名,必须和 .java 文件名完全一致,大小写严格匹配。
举例:
- 文件叫
Student.java→ 文件内只能写public class Student; - 写成
public class Stu直接编译报错。
目的:编译器快速定位主类、方便JVM通过 java 类名 执行程序。
三、配套延伸功能
1. 承载程序入口 main 方法
程序入口 public static void main(String[] args) 标准写在 public class 中:
public class Main {
// 程序执行入口
public static void main(String[] args) {
System.out.println("程序启动");
}
}
执行命令:java Main,JVM 会直接识别 public 类并寻找main方法。
若main写在无public普通类中,虽能运行,但不符合工程规范。
2. 支持外部继承、重写
跨包想要继承某个类,该父类必须是 public class。
// com.demo.Animal.java
public class Animal {}
// com.test.Dog.java
import com.demo.Animal;
// 跨包继承,依赖父类为public
public class Dog extends Animal {}
3. 可作为外部工具类对外提供服务
项目中的实体类(User、Order)、工具类(StringUtils、DateUtil)、接口实现类,全部定义为 public class,供整个项目各处调用。
四、编译产物规则
每一个 public class 编译后会单独生成 类名.class 字节码文件;
一个文件内如果有1个public类 + 多个普通类,每个类都会生成独立class文件。
例:User.java
public class User{}
class Temp{}
编译后生成两个文件:User.class、Temp.class。
五、使用限制(硬性规则)
- 仅顶层类能使用
public class;方法内部的局部内部类、匿名类不能加public; - 单个java源文件不能存在两个及以上
public class,编译失败; - public类名与文件名大小写必须完全一致,区分大小写。
六、开发中什么时候必须用 public class
- 需要被其他包调用的实体、工具、业务类;
- 程序启动类(含main方法);
- 需要跨包继承、多态使用的父类;
- 框架组件:Spring的Controller、Service、Mapper等,框架需要反射跨包实例化,必须public;
- 提供给第三方调用的API类。
七、补充对比,凸显public class价值
public class:全项目可见,跨包访问无限制,规范项目统一使用;- 无修饰class:仅同包可用,跨包访问报错,只适合包内临时辅助类;
- private/protected:不能修饰顶层类,只能修饰内部类、成员变量/方法。
八、常见报错场景
- public类名和文件名不一致 → 编译报错;
- 一个文件两个public class → 编译报错;
- 跨包调用无public普通类 → import导入后依然无法new,编译报错;
- 框架注解类不加public → 框架无法反射实例化,运行空指针。
更多推荐
所有评论(0)