小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2025-10-08 / 2 阅读
0
0

JAVA 默认访问权限 ≠ public

默认访问权限 ≠ 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() {
        // 测试数据准备
    }
}

记忆技巧

  1. 不写修饰符 = 默认权限 = 包级私有
  2. public是显式声明的,默认权限是隐式的
  3. 默认权限比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严格得多!不写任何访问修饰符就是默认权限,只能在同一个包内访问。


评论