【java】类声明的两种形式

在 Java 中,类的声明有两种形式:

  1. public class Test

  2. class Test

它们的区别主要在于访问权限 和文件名的要求。下面我会详细解释这两种形式的区别。


1. public class Test

  • 访问权限:

    • public 表示这个类是公共的,可以被其他包(package)中的类访问。

    • 如果没有 public,类的访问权限是包级私有(默认),只能被同一个包中的类访问。

  • 文件名的要求:

    • 如果一个类被声明为 public,那么它的文件名必须与类名完全相同。

    • 例如,public class Test 必须保存在 Test.java 文件中。

  • 使用场景:

    • 当你希望这个类被其他包中的类使用时,需要声明为 public。
示例

java

复制代码
// 文件 Test.java
public class Test {
    public void sayHello() {
        System.out.println("Hello!");
    }
}

2. class Test

  • 访问权限:

    • 如果没有 public,类的访问权限是包级私有(默认),只能被同一个包中的类访问。

    • 其他包中的类无法访问这个类。

  • 文件名的要求:

    • 文件名不需要与类名相同。

    • 一个 .java 文件中可以包含多个非 public 类,但只能有一个 public 类。

  • 使用场景:

    • 当你希望这个类只在当前包中使用时,可以不声明为 public。
示例

java

复制代码
// 文件 MyFile.java
class Test {
    void sayHello() {
        System.out.println("Hello!");
    }
}

class AnotherClass {
    // 其他代码
}

关键区别总结

特性 public class Test class Test
访问权限 公共的,可以被其他包访问 包级私有,只能被同一个包中的类访问
文件名要求 文件名必须与类名相同(Test.java) 文件名可以与类名不同
一个文件中的数量 一个文件中只能有一个 public 类 一个文件中可以有多个非 public 类
使用场景 需要被其他包中的类访问时使用 只在当前包中使用时使用

举个例子

场景 1:public class Test

java

复制代码
// 文件 Test.java
public class Test {
    public void sayHello() {
        System.out.println("Hello!");
    }
}
  • 这个类可以被其他包中的类访问。

  • 文件名必须是 Test.java。

场景 2:class Test

java

复制代码
// 文件 MyFile.java
class Test {
    void sayHello() {
        System.out.println("Hello!");
    }
}

class AnotherClass {
    // 其他代码
}
  • 这个类只能被同一个包中的类访问。

  • 文件名可以是 MyFile.java,不需要与类名相同。


总结

  • public class Test:

    • 类是公共的,可以被其他包访问。

    • 文件名必须与类名相同。

  • class Test:

    • 类是包级私有的,只能被同一个包中的类访问。

    • 文件名可以与类名不同。

选择哪种形式取决于你的需求:

  • 如果类需要被其他包访问,使用 public class。

  • 如果类只在当前包中使用,使用 class。

相关推荐
信誓旦旦的程序猿7 小时前
【Python量化实战宝典 #20】动量、反转择时手册:趋势跟随与均值回归(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
电商全栈程序猿7 小时前
2026 开源商城系统选型指南:开发者实测对比Tigshop、ShopXO、CRMEB
java·运维·开源
骑着蜗牛撵大象3277 小时前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
博风7 小时前
使用Spring官网下载Springboot骨架
java·spring boot·spring
金銀銅鐵7 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
qq_436962187 小时前
金蝶云星空数据分析怎么做?
java·数据库·数据分析
代码山河7 小时前
键盘输入与输出:Scanner与System.out详解
java·学习·架构·教程·面向对象·项目
碧海银沙音频科技研究院7 小时前
基于炬芯ATS308X的BLE 无线方式离线日志传输导出功能实现
java·linux·服务器
denlaku8 小时前
JDK 20 新特性详解
java
木井巳8 小时前
【JavaEE】SpringBoot 统一功能处理: 拦截器、统一返回与全局异常
java·spring boot·后端·spring·java-ee