Java 的访问修饰符(Access Modifiers)是控制类、方法、变量等成员访问范围的关键工具。它们定义了类、方法或成员变量的可见性,以及在不同位置(如不同包或子类)是否能访问这些成员。Java 提供了四种主要的访问修饰符:public、protected、默认和 private。
-
public:公共的,所有地方都可以访问。
-
protected:本类 ,本包,其他包中的子类都可以访问。
-
默认(没有修饰符):本类 ,本包可以访问。
注意:默认是空着不写,不是default
-
private:私有的,当前类可以访问。
public > protected > 默认 > private
public | protected | 默认 | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
1. public
- 定义: public 是最高权限的访问修饰符。
- 访问范围: 任何地方都可以访问被 public 修饰的类、方法或字段,包括同一包内、其他包中的类,甚至是子类。
- 使用场景: 当你希望某个成员可以被任何其他类访问时,使用 public 修饰符。
java">public class Person {public String name; // public字段,任何地方都可以访问public void greet() { // public方法,任何地方都可以调用System.out.println("Hello, my name is " + name);}
}
这里,Person 类的 name 字段和 greet 方法都是 public,可以被任何其他类访问和调用。
2. protected
- 定义: protected 修饰符限制了访问范围,使得只有同一个包中的类和所有子类(无论它们是否在同一个包中)可以访问被 protected 修饰的成员。
访问范围:
- 同一包内的类;
- 继承该类的子类(无论是否在同一包内)。
使用场景:
当你希望限制对成员的访问,仅允许同一包内的类或子类访问时,使用 protected 修饰符。
java">public class Animal {protected String name;protected void makeSound() { // protected方法System.out.println("Animal sound");}
}public class Dog extends Animal {public void bark() {makeSound(); // 可以调用protected方法System.out.println("Woof! My name is " + name); // 可以访问protected字段}
}
在这个例子中,name 字段和 makeSound() 方法都被 protected 修饰,因此它们可以被 Dog 类访问,因为 Dog 是 Animal 的子类,即使它们不在同一个包中。
3. 默认(没有修饰符)
- 定义: 当没有显式指定访问修饰符时,Java 默认采用包级访问权限。也就是说,只有同一包中的其他类可以访问该类、字段、方法。
访问范围:
- 同一包内的类可以访问;
- 不允许外部包的类访问。
使用场景:
当你希望某个成员仅限于同一个包内的类访问时,使用默认访问权限。
java">class Car { // 默认访问权限类String model; // 默认访问权限字段void startEngine() { // 默认访问权限方法System.out.println("Engine started");}
}
4. private
- 定义: private 修饰符提供了最严格的访问控制,它仅允许该类的内部方法访问被 private 修饰的成员。
访问范围:
- 仅限于类内部访问;
- 其他类无法直接访问。
使用场景:
当你希望完全封装某些数据,不希望外部直接访问这些数据时,使用 private 修饰符。通常与 getter 和 setter 方法一起使用,以便间接访问私有字段。
java">public class BankAccount {private double balance; // 私有字段,不能被外部直接访问public void deposit(double amount) {if (amount > 0) {balance += amount;}}public double getBalance() {return balance; // 提供一个公开方法来访问私有字段}
}
修饰符优先级(从高到低)
- public:最开放的访问级别,允许任何地方访问。
- protected:允许同一包内和子类访问。
- default(包访问):仅允许同一包内访问。
- private:最严格,仅允许类内部访问。
修饰符的应用场景:
- public:在类和方法设计时使用,表示它们应该是开放的,允许任何地方访问。
- protected:在设计类的继承体系时使用,特别是当你希望子类能够访问基类的某些功能时。
- default:适用于不希望对外暴露的类,或者只希望类的成员在包内共享时使用。
- private:用来封装类内部的数据,防止外部直接访问,常与方法一起使用来控制数据的安全性。