访问控制修饰符
在 Java 中,访问修饰符用于控制类、字段、方法和构造函数的访问权限。通过使用访问修饰符,可以实现封装,保护数据,并控制不同部分之间的访问范围。Java 提供了四种主要的访问修饰符,它们分别控制不同范围的访问权限。
Java 中的四种访问修饰符:
public:公共的protected:受保护的- 默认(包级别,
default):没有指定修饰符时,默认是包级别的访问权限 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 字段的值,我们提供了一个 public 的 setName() 方法。
总结:选择合适的访问修饰符
public:适用于需要被外部类广泛访问的成员,尽量避免过多使用,以免降低封装性。protected:适用于需要在继承关系中访问的成员,提供比public更严格的控制。- 默认(包级别):适用于同一包内共享的成员,减少类之间的耦合,隐藏实现细节。
private:适用于类的内部实现细节,确保数据和方法不被外部直接访问,是最严格的访问控制。
通过合理使用访问修饰符,Java 可以有效实现封装,保护类的内部数据和方法,同时提供合适的访问范围,增强程序的安全性和可维护性。
相关笔记
本篇是速记视角;更系统的"四类访问范围→使用场景→常见坑"讲解见 访问权限。
⬅️ 编译时多态和运行时多态 🏠 00-Java ➡️ 为什么 Java 不支持多重继承?
💬 评论