理解繼承概念後,protected 關鍵字才真正展現其價值。理想情況下,private 成員完全私有,任何外部代碼不可訪問。但實務上常需「深藏內部細節,卻允許衍生類別存取」,protected 正是為此而生。其含義為:「對外私有,但允許繼承此類別的任何代碼、以及同一套件內的其他代碼訪問」。在 Java 中,protected 實際上賦予了「友好」存取權限。
最佳做法是保持成員為 private,保留修改底層實作細節的權利;再透過 protected 方法,提供給衍生類別受控的存取管道。
//: Orc.java
// The protected keyword
import java.util.*;
class Villain {
private int i;
protected int read() { return i; }
protected void set(int ii) { i = ii; }
public Villain(int ii) { i = ii; }
public int value(int m) { return m * i; }
}
public class Orc extends Villain {
private int j;
public Orc(int jj) { super(jj); j = jj; }
public void change(int x) { set(x); }
} ///:~
change() 能呼叫 set(),正是因為後者被宣告為 protected(受保護)。