在 Java 中,访问修饰符用于控制类、方法、变量和构造器的访问权限。Java 提供了四种访问修饰符:public
、protected
、default
(默认,不使用任何关键字)和 private
。本文将详细解析这些访问修饰符的作用及其区别。
1. 访问修饰符概述
访问修饰符 | 类内部 | 同一包内 | 子类 | 其他包 |
---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
default | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
2. public
修饰符
2.1 作用
public
是最开放的访问修饰符,表示被修饰的成员可以被任何类访问。
2.2 示例
public class MyClass {
public int publicVar = 10;
public void publicMethod() {
System.out.println("Public Method");
}
}
2.3 使用场景
- 类的公共接口方法。
- 需要跨包访问的类或成员。
3. protected
修饰符
3.1 作用
protected
表示被修饰的成员可以被同一包内的类以及不同包中的子类访问。
3.2 示例
package com.example;
public class Parent {
protected int protectedVar = 20;
protected void protectedMethod() {
System.out.println("Protected Method");
}
}
package com.another;
import com.example.Parent;
public class Child extends Parent {
void accessProtected() {
System.out.println(protectedVar); // 可以访问父类的 protected 成员
protectedMethod();
}
}
3.3 使用场景
- 需要被子类访问的成员。
- 同一包内的类需要访问的成员。
4. default
修饰符
4.1 作用
default
(默认,不使用任何关键字)表示被修饰的成员只能被同一包内的类访问。
4.2 示例
package com.example;
class MyClass {
int defaultVar = 30;
void defaultMethod() {
System.out.println("Default Method");
}
}
4.3 使用场景
- 包内共享的成员。
- 不需要被其他包访问的成员。
5. private
修饰符
5.1 作用
private
是最严格的访问修饰符,表示被修饰的成员只能被定义它的类访问。
5.2 示例
public class MyClass {
private int privateVar = 40;
private void privateMethod() {
System.out.println("Private Method");
}
public void accessPrivate() {
System.out.println(privateVar); // 可以访问 private 成员
privateMethod();
}
}
5.3 使用场景
- 类的内部实现细节。
- 不希望被外部类访问的成员。
6. 访问修饰符的使用场景总结
访问修饰符 | 使用场景 |
---|---|
public | 类的公共接口方法、需要跨包访问的类或成员。 |
protected | 需要被子类访问的成员、同一包内的类需要访问的成员。 |
default | 包内共享的成员、不需要被其他包访问的成员。 |
private | 类的内部实现细节、不希望被外部类访问的成员。 |
7. 访问修饰符的注意事项
-
类的访问修饰符:
- 类只能使用
public
或default
修饰符。 public
类可以被任何包访问,default
类只能被同一包内的类访问。
- 类只能使用
-
构造器的访问修饰符:
- 构造器可以使用
public
、protected
、default
或private
修饰符。 private
构造器常用于单例模式。
- 构造器可以使用
-
内部类的访问修饰符:
- 内部类可以使用所有访问修饰符。
private
内部类只能被外部类访问。
8. 示例代码
package com.example;
public class AccessModifiersExample {
public int publicVar = 10;
protected int protectedVar = 20;
int defaultVar = 30;
private int privateVar = 40;
public void publicMethod() {
System.out.println("Public Method");
}
protected void protectedMethod() {
System.out.println("Protected Method");
}
void defaultMethod() {
System.out.println("Default Method");
}
private void privateMethod() {
System.out.println("Private Method");
}
public void accessPrivate() {
System.out.println(privateVar); // 可以访问 private 成员
privateMethod();
}
}
package com.another;
import com.example.AccessModifiersExample;
public class AnotherClass {
public static void main(String[] args) {
AccessModifiersExample example = new AccessModifiersExample();
System.out.println(example.publicVar); // 可以访问 public 成员
example.publicMethod();
// System.out.println(example.protectedVar); // 编译错误:无法访问 protected 成员
// example.protectedMethod();
// System.out.println(example.defaultVar); // 编译错误:无法访问 default 成员
// example.defaultMethod();
// System.out.println(example.privateVar); // 编译错误:无法访问 private 成员
// example.privateMethod();
}
}
9. 总结
Java 中的访问修饰符用于控制类、方法、变量和构造器的访问权限。通过合理使用访问修饰符,可以提高代码的封装性和安全性。以下是四种访问修饰符的主要区别:
public
:任何类都可以访问。protected
:同一包内的类和不同包中的子类可以访问。default
:同一包内的类可以访问。private
:只有定义它的类可以访问。