你想弄清楚Java中public class和class(默认访问权限)的核心区别,这是Java类定义的基础知识点,我会用通俗易懂的语言+代码示例,帮你把两者的差异、使用规则和适用场景讲透。
一、核心区别总览
先通过表格直观对比核心差异:
| 特性 | public class(公有类) | class(默认访问权限,也称包访问权限) |
|---|---|---|
| 访问范围 | 整个项目中所有包的类都能访问 | 仅同一包内的类可以访问 |
| 文件名要求 | 类名必须与.java文件名完全一致(大小写敏感) |
类名可以与文件名不一致 |
| 一个文件中数量 | 一个.java文件只能有1个public class |
一个.java文件可以有多个默认类 |
二、代码示例:直观理解差异
场景1:同一包内访问(默认类和公有类都可访问)
// 包名:com.example.demo
package com.example.demo;// 1. public class:类名=文件名(DemoPublic.java)
public class DemoPublic {public void sayHello() {System.out.println("我是公有类,全项目可访问");}
}// 2. 默认类:类名≠文件名也可以
class DemoDefault {public void sayHi() {System.out.println("我是默认类,仅同包可访问");}
}// 测试类(同一包内)
public class TestSamePackage {public static void main(String[] args) {// 同一包内,两种类都能创建对象并调用方法DemoPublic publicObj = new DemoPublic();publicObj.sayHello();DemoDefault defaultObj = new DemoDefault();defaultObj.sayHi();}
}
输出结果:
我是公有类,全项目可访问
我是默认类,仅同包可访问
场景2:不同包访问(仅public class可访问)
// 包名:com.example.other(和上面的包不同)
package com.example.other;// 导入公有类(默认类无法导入)
import com.example.demo.DemoPublic;public class TestDifferentPackage {public static void main(String[] args) {// 1. 公有类:跨包可访问,正常创建对象DemoPublic publicObj = new DemoPublic();publicObj.sayHello();// 2. 默认类:跨包无法访问,编译报错!// com.example.demo.DemoDefault defaultObj = new com.example.demo.DemoDefault();}
}
关键结果:
- 公有类
DemoPublic跨包可正常使用; - 默认类
DemoDefault跨包无法访问,编译器直接报错(提示“找不到符号”)。
三、核心规则详解
1. 文件名规则(重点!新手易踩坑)
- public class:
- 必须满足「类名 = 文件名」(大小写完全一致),比如
public class User必须放在User.java文件中; - 一个
.java文件只能有一个public class(可以有多个默认类)。
- 必须满足「类名 = 文件名」(大小写完全一致),比如
- 默认class:
- 类名可以和文件名无关,比如
class Student可以放在Teacher.java文件中; - 一个
.java文件可以有多个默认类。
- 类名可以和文件名无关,比如
2. 访问权限规则(核心)
- public class:访问权限是“全局”的,项目中任何包的类,只要通过
import导入(或写全类名),就能访问、创建对象、调用其公有方法/属性。 - 默认class:访问权限是“包级”的,只有和它在同一个包下的类能访问,跨包时完全不可见(即使导入也没用)。
3. 适用场景
| 类类型 | 适用场景 | 示例 |
|---|---|---|
| public class | 对外提供功能的核心类、需要跨包复用的类 | 工具类、实体类(User、Order) |
| 默认class | 仅当前包内使用的辅助类、工具类(无需对外暴露) | 包内的临时数据处理类、内部辅助类 |
四、新手常见错误及避坑
-
错误1:一个
.java文件写多个public class// 错误!Test.java文件中不能有2个public class public class Test1 {} public class Test2 {}解决:保留一个public class,其余改为默认class,或拆分成多个
.java文件。 -
错误2:public class的类名和文件名不一致
// 文件名为Hello.java,但public类名是World,编译报错 public class World {}解决:要么修改类名为
Hello,要么修改文件名为World.java(保持一致)。 -
错误3:跨包使用默认class
解决:如果需要跨包访问,把默认class改为public class;如果仅包内使用,就保持默认权限(更安全,减少暴露)。
总结
- 核心差异:
public class是全局访问、类名必须和文件名一致;class(默认)是包级访问、类名可与文件名不同。 - 访问权限:public类跨包可访问,默认类仅同包可访问,这是控制代码“对外暴露范围”的核心手段。
- 使用原则:需要对外提供功能的类用
public class,仅包内使用的辅助类用默认class(遵循“最小权限原则”,更安全)。