访问控制修饰符

在 Java 中,访问修饰符用于控制类、字段、方法和构造函数的访问权限。通过使用访问修饰符,可以实现封装,保护数据,并控制不同部分之间的访问范围。Java 提供了四种主要的访问修饰符,它们分别控制不同范围的访问权限。

Java 中的四种访问修饰符:

  1. public:公共的
  2. protected:受保护的
  3. 默认(包级别,default:没有指定修饰符时,默认是包级别的访问权限
  4. private:私有的

访问修饰符的适用范围

修饰符 当前类 同一包内 子类(不同包) 其他包
public
protected
default
private

1. public 访问修饰符

  • 含义public 关键字表示该成员可以被任何其他类访问,包括同一包内、不同包中的类。
  • 适用场景:适用于那些需要被外部广泛访问的类、字段、方法和构造函数。

示例

public class Animal {
    public String name;

    public void eat() {
        System.out.println(name + " eats food.");
    }
}

在上面的例子中,name 字段和 eat() 方法都被声明为 public,因此它们可以被任何类访问。


2. protected 访问修饰符

  • 含义protected 关键字表示该成员可以被同一包中的类访问,也可以被子类访问(即使子类在不同包中)。但不允许其他包的非子类访问。
  • 适用场景:适用于那些需要在继承关系中共享的字段或方法,或者在同一包中共享的字段或方法。

示例

class Animal {
    protected String name;

    protected void eat() {
        System.out.println(name + " eats food.");
    }
}

class Dog extends Animal {
    public void display() {
        name = "Dog";
        eat();
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.display();  // 正常访问,输出 "Dog eats food."
    }
}

在上面的例子中,name 字段和 eat() 方法被声明为 protected,因此子类 Dog 可以访问并使用它们。


3. 默认(包级别,default)访问修饰符

  • 含义:如果没有显式指定访问修饰符,那么默认的访问修饰符是包级别(default)。这种情况下,该成员只能在同一包内访问,其他包中的类无法访问。
  • 适用场景:适用于仅在同一包内使用的类、字段、方法或构造函数。适当使用可以隐藏实现细节,减少类之间的耦合。

示例

class Animal {
    String name;

    void eat() {
        System.out.println(name + " eats food.");
    }
}

在这个例子中,name 字段和 eat() 方法没有使用任何访问修饰符,因此它们是默认的包级别(default)访问权限,只能在同一包内访问。


4. private 访问修饰符

  • 含义private 关键字表示该成员只能在定义它的类内部访问,外部无法直接访问。private 访问修饰符提供了最严格的封装控制,确保数据和方法不会被外部直接修改。
  • 适用场景:适用于内部实现细节,确保类的内部数据和方法不被外部直接访问,保护类的封装性。

示例

class Animal {
    private String name;

    private void eat() {
        System.out.println(name + " eats food.");
    }

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

    public void display() {
        eat(); // 只能在类内部访问
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.setName("Dog");
        animal.display();  // 调用类内的方法
        // animal.eat();   // 编译错误,无法访问私有方法
    }
}

在这个例子中,name 字段和 eat() 方法是 private 的,因此它们不能被外部类访问。为了修改 name 字段的值,我们提供了一个 publicsetName() 方法。


总结:选择合适的访问修饰符

  • public:适用于需要被外部类广泛访问的成员,尽量避免过多使用,以免降低封装性。
  • protected:适用于需要在继承关系中访问的成员,提供比 public 更严格的控制。
  • 默认(包级别):适用于同一包内共享的成员,减少类之间的耦合,隐藏实现细节。
  • private:适用于类的内部实现细节,确保数据和方法不被外部直接访问,是最严格的访问控制。

通过合理使用访问修饰符,Java 可以有效实现封装,保护类的内部数据和方法,同时提供合适的访问范围,增强程序的安全性和可维护性。

相关笔记

本篇是速记视角;更系统的"四类访问范围→使用场景→常见坑"讲解见 访问权限


⬅️ 编译时多态和运行时多态 🏠 00-Java ➡️ 为什么 Java 不支持多重继承?