在 Java 物件導向設計中,繼承是實現代碼復用的基石。子類不僅擁有自己聲明的成員,更能「繼承」父類的非私有成員變量與方法,彷彿這些成員原本就定義在子類中一般。這意味著子類的實例方法可以直接操作繼承來的成員變量,也能直接調用繼承來的方法,形成「完全意義上的成員」關係。
當子類與父類位於同一個包時,繼承權限相對寬鬆:
protected、public、包私有(默認)修飾的成員變量與方法private 修飾的成員變量與方法// 父類 Parent.java
package com.b510;
public class Parent {
private int numbera = 10;
protected int numberb = 20;
void sum() { numberb = numbera + numberb; System.out.println(numberb); }
private int getNumbera() { System.out.println(numbera); return numbera; }
public void print() { System.out.println("numberb+numbera=" + (numberb + numbera)); }
protected void say() { System.out.println("Hello,i'm parent class!"); }
}
// 子類 SubClass.java
package com.b510;
public class SubClass extends Parent {
void youYuan() {
System.out.println("子類不能繼承numbera,但能繼承numberb=" + numberb);
}
protected void proFun() { System.out.println("子類中可以繼承numberb=" + numberb); }
private void priFun() { System.out.println("這是private方法"); }
}
Hello,i'm parent class!
30
numberb+numbera=40
子類中可以繼承numberb=30
子類不能繼承numbera,但能繼承numberb=30
這是子類中的友元方法
結論:同包下,子類無法繼承父類的 private 成員,但可自由使用 protected、默認、public 成員。
當子類與父類不在同一包時,規則發生關鍵變化:
protected、public 成員private、包私有(默認/友元) 成員protected、public 方法// 父類位於 package com
// 子類位於 package com.b510,需 import com.Parent
public class SubClass extends Parent {
@Override
protected void say() {
System.out.println("這是重寫父類的protected方法,say(),還可以得到numberb=" + numberb);
}
// 其他方法同前...
}
這是重寫父類的protected方法,say(),還可以得到numberb=20
numberb+numbera=30
子類中可以繼承numberb=20
子類不能繼承numbera,但能繼承numberb=20
這是子類中的友元方法
注意:numberb 保持初始值 20,說明子類調用的是重寫後的 say(),且 sum() 方法(包私有)未被繼承,無法調用。
| 修飾符 | 同包繼承 | 跨包繼承 |
|---|---|---|
| public | ✅ | ✅ |
| protected | ✅ | ✅ |
| default (包私有) | ✅ | ❌ |
| private | ❌ | ❌ |
掌握這些規則,能幫助你設計清晰的類層級結構,避免因訪問權限誤解導致的編譯錯誤或運行時異常。