在Java中,访问修饰符用于控制类、方法、变量等的访问权限,主要有四种:publicprivateprotected和默认(没有显式声明修饰符)。下面详细介绍它们的作用范围和使用场景。

1. public

  • 作用范围
    • public修饰的类、方法、变量可以被任何其他类访问,无论这些类位于哪个包中。这是访问权限最宽松的修饰符。
  • 使用场景
    • 类的公共接口:当你希望一个类的方法或变量可以被其他任何类自由使用时,使用public修饰符。例如,在一个工具类中,提供一些通用的静态方法供其他类调用。
    • API设计:在设计公共API时,通常会将一些核心的类和方法声明为public,以便其他开发者可以方便地使用。

示例代码

// 公共类
public class PublicClass {
    // 公共变量
    public int publicVariable = 10;

    // 公共方法
    public void publicMethod() {
        System.out.println("This is a public method.");
    }
}

2. private

  • 作用范围
    • private修饰的方法、变量只能在定义它们的类内部被访问,其他类无法直接访问。private不能修饰外部类,但可以修饰内部类。
  • 使用场景
    • 封装:通过将类的成员变量声明为private,可以隐藏类的内部实现细节,只提供公共的访问方法(getter和setter)来控制对这些变量的访问。这样可以提高类的安全性和可维护性。
    • 辅助方法:如果一个方法只是为了辅助类内部的其他方法而存在,不希望被外部类调用,可以将其声明为private

示例代码

public class PrivateClass {
    // 私有变量
    private int privateVariable = 20;

    // 私有方法
    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    // 公共的访问方法
    public int getPrivateVariable() {
        return privateVariable;
    }

    public void setPrivateVariable(int value) {
        privateVariable = value;
    }
}

3. protected

  • 作用范围
    • protected修饰的方法、变量可以在定义它们的类内部、同一个包中的其他类以及不同包中的子类中被访问。
  • 使用场景
    • 继承和代码复用:当你希望一个类的某些成员可以被其子类访问,但又不希望被其他无关的类访问时,使用protected修饰符。例如,在一个基类中定义一些通用的方法,供其子类继承和扩展。
    • 包内访问:在同一个包内,protected成员可以被其他类访问,方便包内的类之间进行协作。

示例代码

// 基类
package com.example.base;
public class ProtectedBaseClass {
    // 受保护的变量
    protected int protectedVariable = 30;

    // 受保护的方法
    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }
}

// 子类,位于不同的包中
package com.example.sub;
import com.example.base.ProtectedBaseClass;
public class ProtectedSubClass extends ProtectedBaseClass {
    public void accessProtectedMembers() {
        // 可以访问父类的受保护成员
        System.out.println(protectedVariable);
        protectedMethod();
    }
}

4. 默认(没有显式声明修饰符)

  • 作用范围
    • 没有显式声明修饰符的类、方法、变量只能在同一个包中的其他类中被访问。这种访问权限也称为包访问权限。
  • 使用场景
    • 包内协作:当你希望类的成员只能在同一个包内被访问时,可以不使用任何修饰符。这有助于将相关的类组织在一起,形成一个独立的模块,提高代码的内聚性。

示例代码

// 位于 com.example 包中
package com.example;
class DefaultAccessClass {
    // 默认访问权限的变量
    int defaultVariable = 40;

    // 默认访问权限的方法
    void defaultMethod() {
        System.out.println("This is a default access method.");
    }
}

总结

访问修饰符 同一类内 同一包内 不同包的子类 不同包非子类
public
protected ×
默认 × ×
private × × ×

根据不同的需求和设计原则,合理选择访问修饰符可以提高代码的安全性、可维护性和可扩展性。