訪問修飾符
- 訪問修飾符
- 訪問修飾符是什麼
- public 訪問修飾符
- 使用場景
- 示例程式碼
- private 訪問修飾符
- 使用場景
- 示例程式碼
- protected 訪問修飾符
- 使用場景
- 示例程式碼
- 預設(包私有)訪問修飾符
- 使用場景
- 示例程式碼
訪問修飾符是什麼
Java中的訪問修飾符用於控制類、介面、建構函式、方法和資料成員(欄位)的可見性和訪問級別。
Java提供了四種訪問修飾符:
訪問修飾符 | 同一類內 | 同一包內 | 不同包的子類 | 不同包的非子類 | 適用物件 |
---|---|---|---|---|---|
public | 可見 | 可見 | 可見 | 可見 | 類、介面、變數、方法 |
protected | 可見 | 可見 | 可見 | 不可見 | 變數、方法 |
預設 | 可見 | 可見 | 不可見 | 不可見 | 類、介面、變數、方法 |
private | 可見 | 不可見 | 不可見 | 不可見 | 變數、方法 |
- public:允許所有類訪問。適用於需要公開訪問的API、常量類等。
- private:限制訪問僅在類內部。用於實現封裝和隱藏實現細節。
- protected:允許同包類和子類訪問。適用於繼承結構中的子類擴充套件和庫設計。
- 預設(包私有):允許同包類訪問。適用於包內協作和模組化設計。
public 訪問修飾符
public訪問修飾符是最寬鬆的修飾符,它允許被修飾的類、方法或變數在整個程式中被訪問。任何其他類,無論是否在同一個包中,都可以訪問被public修飾的成員。
使用場景
API設計:當你設計一個庫或框架,需要提供一些公共的介面或類供外部使用時,可以使用public修飾符。例如,Java的標準庫中很多類如ArrayList、HashMap等都是public的。
常量類:一些定義了常量的類通常也是public的,例如Math類中的常量PI。
示例程式碼
// Public class
public class Animal {
// Public method
public void eat() {
System.out.println("Animal is eating");
}
}
在這個例子中,Animal類以及它的eat方法都是public的,這意味著任何其他類都可以建立Animal物件並呼叫eat方法。
private 訪問修飾符
private訪問修飾符是最嚴格的修飾符,它限制被修飾的成員只能在它們所在的類內部訪問。其他類甚至是同一個包中的類都無法訪問被private修飾的成員。
使用場景
封裝:private修飾符是實現封裝(encapsulation)的關鍵。它確保了類的內部實現細節不被外部類依賴,從而可以在不影響外部程式碼的情況下自由地修改內部實現。
隱藏實現細節:當你不希望某個變數或方法被外部類直接訪問或修改時,可以將其宣告為private。
示例程式碼
public class Person {
// Private field
private String name;
// Public constructor
public Person(String name) {
this.name = name;
}
// Public method to access private field
public String getName() {
return name;
}
// Private method
private void secretMethod() {
System.out.println("This is a secret method");
}
}
在這個例子中,name欄位和secretMethod方法都是private的,只有Person類內部的程式碼可以訪問它們。getName方法是public的,提供了一個安全的方式來訪問name欄位。
protected 訪問修飾符
protected訪問修飾符介於public和private之間,它允許被修飾的成員在同一個包中的其他類以及所有子類中訪問(即使子類在不同的包中)。
使用場景
繼承層次結構:當你希望某個類的子類能夠訪問其某些成員,但不希望這些成員被同包中的非子類訪問時,可以使用protected修飾符。
庫設計:在設計庫時,有時需要讓子類能夠訪問和重寫某些方法,以便擴充套件其功能。
示例程式碼
public class Animal {
// Protected field
protected String type;
// Protected method
protected void makeSound() {
System.out.println("Animal makes a sound");
}
}
public class Dog extends Animal {
public Dog() {
type = "Dog"; // Accessing protected field
}
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
在這個例子中,type欄位和makeSound方法是protected的,Dog類可以訪問並重寫它們。
預設(包私有)訪問修飾符
預設訪問修飾符(也稱為包私有)是指沒有顯式宣告的訪問修飾符。它允許被修飾的成員在同一個包中的其他類中訪問,但不能被其他包中的類訪問。
使用場景
包內協作:當你希望一組相關的類在同一個包內協作但不希望這些類被包外的類訪問時,可以使用預設訪問修飾符。
模組化設計:在模組化設計中,可以將模組內部的實現細節隱藏在包內部,而只暴露必要的public介面。
示例程式碼
class PackagePrivateClass {
// Package-private field
int number;
// Package-private method
void displayNumber() {
System.out.println("Number: " + number);
}
}
在這個例子中,PackagePrivateClass類及其成員是包私有的,只有同一個包中的類才能訪問它們。