Java public class 完整详细讲解

一、定义语法

public 是 Java 访问修饰符,修饰顶层类时写法:

public class 类名 {
    // 成员变量、方法、构造器
}

public class = 公共类,是项目开发最常用的顶层类修饰形式。

二、两大核心作用

作用1:控制访问权限(核心作用)

public 修饰的类,全项目任意包、任意位置都能访问

  1. 同包其他类:直接 new 创建对象,无需导入;
  2. 不同包的类:通过 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源文件名(编译强制规则)

  1. 一个 .java 文件最多只能有 1 个 public class
  2. 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.classTemp.class

五、使用限制(硬性规则)

  1. 顶层类能使用 public class;方法内部的局部内部类、匿名类不能加public;
  2. 单个java源文件不能存在两个及以上 public class,编译失败;
  3. public类名与文件名大小写必须完全一致,区分大小写。

六、开发中什么时候必须用 public class

  1. 需要被其他包调用的实体、工具、业务类;
  2. 程序启动类(含main方法);
  3. 需要跨包继承、多态使用的父类;
  4. 框架组件:Spring的Controller、Service、Mapper等,框架需要反射跨包实例化,必须public;
  5. 提供给第三方调用的API类。

七、补充对比,凸显public class价值

  1. public class:全项目可见,跨包访问无限制,规范项目统一使用;
  2. 无修饰class:仅同包可用,跨包访问报错,只适合包内临时辅助类;
  3. private/protected:不能修饰顶层类,只能修饰内部类、成员变量/方法。

八、常见报错场景

  1. public类名和文件名不一致 → 编译报错;
  2. 一个文件两个public class → 编译报错;
  3. 跨包调用无public普通类 → import导入后依然无法new,编译报错;
  4. 框架注解类不加public → 框架无法反射实例化,运行空指针。

更多推荐