在 Java 中,訪問修飾符(Access Modifiers)用于控制類、方法、變量和構造器的訪問權限。Java 提供了四種訪問修飾符,分別是:
- public
- protected
- default(包私有,沒有顯式修飾符)
- private
public
- 訪問范圍:最大范圍的訪問權限。
- 作用:
- 被 public 修飾的類、方法、變量或構造器可以在任何地方訪問。
- 如果類是 public,則類名必須與文件名一致。
public class MyClass {public int myVar;public void myMethod() {System.out.println("Public Method");}
}
protected
- 訪問范圍:
- 同一包內的類可以訪問。
- 不同包中的子類可以訪問。
- 作用:
- 主要用于繼承場景,允許子類訪問父類的成員。
package com.example;public class Parent {protected int myVar;protected void myMethod() {System.out.println("Protected Method");}
}package com.another;import com.example.Parent;public class Child extends Parent {void accessParent() {myVar = 10; // 可以訪問 protected 變量myMethod(); // 可以訪問 protected 方法}
}
default(包私有)
- 訪問范圍:
- 同一包內的類可以訪問。
- 不同包中的類無法訪問。
- 作用:
- 如果不顯式指定訪問修飾符,則默認為 default。
package com.example;class MyClass {int myVar; // default 訪問權限void myMethod() {System.out.println("Default Method");}
}
private
- 訪問范圍:
- 僅限當前類內部訪問。
- 作用:
- 用于封裝類的內部實現細節,防止外部直接訪問。
public class MyClass {private int myVar;private void myMethod() {System.out.println("Private Method");}public void setMyVar(int value) {this.myVar = value; // 可以在類內部訪問 private 變量}
}
訪問修飾符的總結
訪問修飾符 | 類內部 | 同一包內 | 不同包的子類 | 不同包的非子類 |
---|---|---|---|---|
public | ?? | ?? | ?? | ?? |
protected | ?? | ?? | ?? | ? |
default | ?? | ?? | ? | ? |
private | ?? | ? | ? | ? |
訪問修飾符的使用場景
public:
用于暴露 API,如工具類的方法或常量。例如:public static final int MAX_VALUE = 100;
protected:
用于允許子類擴展父類的功能。例如:protected void init() { … }
default:
用于包內共享的輔助類或工具方法。例如:void helperMethod() { … }
private:
用于封裝類的內部實現細節。例如:private String secretKey;
注意事項
- 類的訪問修飾符只能是 public 或 default(包私有)。
- 接口中的方法默認是 public,變量默認是 public static final。
- 構造器可以使用 public、protected、default 或 private。
- private 構造器常用于單例模式或工具類。
package com.example;public class AccessExample {public int publicVar = 1;protected int protectedVar = 2;int defaultVar = 3; // default 訪問權限private int privateVar = 4;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");}
}class AnotherClass {void testAccess() {AccessExample example = new AccessExample();System.out.println(example.publicVar); // 可以訪問System.out.println(example.protectedVar); // 可以訪問System.out.println(example.defaultVar); // 可以訪問// System.out.println(example.privateVar); // 編譯錯誤,無法訪問 private 變量}
}