Skip to content

访问修饰符

概述

Java 提供了四种访问修饰符,用于控制类、变量、方法和构造方法的访问权限。

四种访问修饰符

修饰符同一类同一包子类其他包
public
protected
default(无修饰符)
private

public

特点

任何地方都可以访问:

java
// public 类:任何类都可以访问
public class PublicClass {
    public static void main(String[] args) {
        System.out.println("Public class");
    }
}

// ✅ 同一包中访问
class AnotherClass {
    public static void main(String[] args) {
        PublicClass obj = new PublicClass();
    }
}

protected

特点

protected 成员可以被:

  • 同一包中的类访问
  • 子类访问(即使不在同一包)
java
package com.example.parent;

public class Parent {
    protected String protectedField = "protected";
    protected void protectedMethod() {
        System.out.println("Protected method");
    }
}
java
package com.example.parent;

public class SubClass extends Parent {
    public static void main(String[] args) {
        SubClass obj = new SubClass();
        System.out.println(obj.protectedField);  // ✅ 同包子类可访问
        obj.protectedMethod();  // ✅ 同包子类可访问
    }
}
java
package com.example.other;

public class SubClass2 extends Parent {
    public static void main(String[] args) {
        SubClass2 obj = new SubClass2();
        System.out.println(obj.protectedField);  // ✅ 不同包子类可访问
        obj.protectedMethod();  // ✅ 不同包子类可访问
    }
}

default(默认修饰符)

默认(包私有)成员只能被同一包中的类访问。

java
package com.example.mypackage;

class DefaultClass {  // 默认修饰符
    String defaultField = "default";
    void defaultMethod() {
        System.out.println("Default method");
    }
}

class AnotherClass {
    public static void main(String[] args) {
        DefaultClass obj = new DefaultClass();
        System.out.println(obj.defaultField);  // ✅ 同包可访问
        obj.defaultMethod();  // ✅ 同包可访问
    }
}
java
package com.example.other;

class OtherClass {
    public static void main(String[] args) {
        DefaultClass obj = new DefaultClass();  // ❌ 不同包不能访问
        // obj.defaultField;  // 编译错误
    }
}

private

特点

private 成员只能在本类中访问。

java
public class MyClass {
    private String privateField = "private";

    private void privateMethod() {
        System.out.println("Private method");
    }

    // 公共方法访问私有成员
    public void publicAccess() {
        System.out.println(privateField);  // ✅ 本类可访问
        privateMethod();  // ✅ 本类可访问
    }
}

常见用途

java
public class User {
    private String name;
    private int age;

    // 提供公共访问器
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 私有辅助方法
    private boolean validateName(String name) {
        return name != null && !name.isEmpty();
    }
}

修饰符使用场景

类级别

修饰符使用场景
public公开类,任何地方都可用
default包内使用的类
java
// public 类
public class UserService { }

// 包内类(默认)
class InternalHelper { }

成员级别

修饰符使用场景
publicAPI 公开方法
protected供子类使用的方法
default包内使用
private内部实现细节
java
public class UserService {

    // 公开 API
    public void createUser(User user) { }

    // 供子类重写
    protected void beforeCreate(User user) { }

    // 包内使用
    void log(String message) { }

    // 内部实现
    private boolean validate(User user) {
        return user != null;
    }
}

总结

修饰符本类同包子类其他包
public
protected
default
private
  • private 是最严格的访问级别
  • public 是最宽松的访问级别
  • 一般原则:尽可能使用最严格的访问级别

基于 VitePress 构建