访问修饰符
概述
Java 提供了四种访问修饰符,用于控制类、变量、方法和构造方法的访问权限。
四种访问修饰符
| 修饰符 | 同一类 | 同一包 | 子类 | 其他包 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default(无修饰符) | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
public
特点
任何地方都可以访问:
java
// public 类:任何类都可以访问
public class PublicClass {
public static void main(String[] args) {
System.out.println("Public class");
}
}
// ✅ 同一包中访问
class AnotherClass {
public static void main(String[] args) {
PublicClass obj = new PublicClass();
}
}protected
特点
protected 成员可以被:
- 同一包中的类访问
- 子类访问(即使不在同一包)
java
package com.example.parent;
public class Parent {
protected String protectedField = "protected";
protected void protectedMethod() {
System.out.println("Protected method");
}
}java
package com.example.parent;
public class SubClass extends Parent {
public static void main(String[] args) {
SubClass obj = new SubClass();
System.out.println(obj.protectedField); // ✅ 同包子类可访问
obj.protectedMethod(); // ✅ 同包子类可访问
}
}java
package com.example.other;
public class SubClass2 extends Parent {
public static void main(String[] args) {
SubClass2 obj = new SubClass2();
System.out.println(obj.protectedField); // ✅ 不同包子类可访问
obj.protectedMethod(); // ✅ 不同包子类可访问
}
}default(默认修饰符)
默认(包私有)成员只能被同一包中的类访问。
java
package com.example.mypackage;
class DefaultClass { // 默认修饰符
String defaultField = "default";
void defaultMethod() {
System.out.println("Default method");
}
}
class AnotherClass {
public static void main(String[] args) {
DefaultClass obj = new DefaultClass();
System.out.println(obj.defaultField); // ✅ 同包可访问
obj.defaultMethod(); // ✅ 同包可访问
}
}java
package com.example.other;
class OtherClass {
public static void main(String[] args) {
DefaultClass obj = new DefaultClass(); // ❌ 不同包不能访问
// obj.defaultField; // 编译错误
}
}private
特点
private 成员只能在本类中访问。
java
public class MyClass {
private String privateField = "private";
private void privateMethod() {
System.out.println("Private method");
}
// 公共方法访问私有成员
public void publicAccess() {
System.out.println(privateField); // ✅ 本类可访问
privateMethod(); // ✅ 本类可访问
}
}常见用途
java
public class User {
private String name;
private int age;
// 提供公共访问器
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 私有辅助方法
private boolean validateName(String name) {
return name != null && !name.isEmpty();
}
}修饰符使用场景
类级别
| 修饰符 | 使用场景 |
|---|---|
| public | 公开类,任何地方都可用 |
| default | 包内使用的类 |
java
// public 类
public class UserService { }
// 包内类(默认)
class InternalHelper { }成员级别
| 修饰符 | 使用场景 |
|---|---|
| public | API 公开方法 |
| protected | 供子类使用的方法 |
| default | 包内使用 |
| private | 内部实现细节 |
java
public class UserService {
// 公开 API
public void createUser(User user) { }
// 供子类重写
protected void beforeCreate(User user) { }
// 包内使用
void log(String message) { }
// 内部实现
private boolean validate(User user) {
return user != null;
}
}总结
| 修饰符 | 本类 | 同包 | 子类 | 其他包 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
- private 是最严格的访问级别
- public 是最宽松的访问级别
- 一般原则:尽可能使用最严格的访问级别
