默认访问权限 ≠ public
1. 默认访问权限(包级私有)
class DefaultClass { // 默认权限 - 包内可见
int defaultField; // 默认权限 - 包内可见
void defaultMethod() {} // 默认权限 - 包内可见
}
2. public访问权限
public class PublicClass { // public - 全局可见
public int publicField; // public - 全局可见
public void publicMethod() {} // public - 全局可见
}
详细对比
特性 | 默认权限 | public权限 |
---|---|---|
关键字 | 无(不写任何修饰符) | public |
同包访问 | ✅ 可访问 | ✅ 可访问 |
不同包访问 | ❌ 不可访问 | ✅ 可访问 |
继承跨包 | ❌ 不可访问 | ✅ 可访问 |
可见范围 | 仅同一个包内 | 所有包 |
实际代码演示
包A中的类
// 文件: com.packageA.ClassA.java
package com.packageA;
public class ClassA {
public String publicField = "公共字段";
String defaultField = "默认字段"; // 默认权限
public void publicMethod() {
System.out.println("公共方法");
}
void defaultMethod() { // 默认权限
System.out.println("默认方法");
}
}
同包内的访问
// 文件: com.packageA.ClassB.java
package com.packageA;
public class ClassB {
public void test() {
ClassA a = new ClassA();
System.out.println(a.publicField); // ✅ 可访问
System.out.println(a.defaultField); // ✅ 可访问(同包)
a.publicMethod(); // ✅ 可访问
a.defaultMethod(); // ✅ 可访问(同包)
}
}
不同包的访问
// 文件: com.packageB.ClassC.java
package com.packageB;
import com.packageA.ClassA;
public class ClassC {
public void test() {
ClassA a = new ClassA();
System.out.println(a.publicField); // ✅ 可访问
// System.out.println(a.defaultField); // ❌ 编译错误!不同包不能访问默认字段
a.publicMethod(); // ✅ 可访问
// a.defaultMethod(); // ❌ 编译错误!不同包不能访问默认方法
}
}
常见的默认权限使用场景
场景1:包内工具类
// 只在包内使用的工具类,不需要暴露给外部
class PackageUtils { // 默认权限
static void helperMethod() {
// 包内辅助方法
}
}
场景2:实现细节隐藏
public class PublicService {
// 公共API
public void publicAPI() {
internalHelper();
}
// 内部实现,不暴露给包外
void internalHelper() { // 默认权限
// 实现细节
}
}
场景3:测试专用类
// 只在测试包内使用的类
class TestHelper { // 默认权限
static void setupTestData() {
// 测试数据准备
}
}
记忆技巧
- 不写修饰符 = 默认权限 = 包级私有
- public是显式声明的,默认权限是隐式的
- 默认权限比public严格得多
验证理解的小测试
// 问题:以下哪些访问是允许的?
// 包: com.example
package com.example;
class DefaultClass {
String name = "默认";
}
public class PublicClass {
public String publicName = "公共";
String defaultName = "默认";
}
// 包: com.other
package com.other;
import com.example.PublicClass;
public class Test {
public void test() {
PublicClass pc = new PublicClass();
System.out.println(pc.publicName); // ✅ 允许
// System.out.println(pc.defaultName); // ❌ 不允许
// DefaultClass dc = new DefaultClass(); // ❌ 不允许
}
}
总结:默认权限是包级私有的,比public严格得多!不写任何访问修饰符就是默认权限,只能在同一个包内访问。