子類通過繼承的公共方法修改父類私有屬性的機制
面向對象編程中,子類繼承父類的方法,看似繞過了私有屬性的訪問限制,修改了父類的私有屬性,這其實體現了封裝和繼承機制的巧妙結合。
讓我們分析以下代碼示例:
父類 Employee:
public abstract class Employee { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void showMsg(); }
子類 Manager:
public class Manager extends Employee { private Clerk clerk; public Manager() {} public Manager(Clerk clerk) { this.clerk = clerk; } @Override public void showMsg() { System.out.println(this.getName()); } }
測試類:
public class Test { public static void main(String[] args) { Manager manager = new Manager(); manager.setName("John Doe"); System.out.println(manager.getName()); // 輸出 John Doe } }
關鍵在于:子類對象同時擁有父類和子類的特性。 manager 對象雖然是 Manager 類型,但它也同時是 Employee 類型的一個實例。 manager.setName(“John Doe”); 這行代碼調用的是繼承自 Employee 的 setName 方法。 而 setName 方法,盡管在 Employee 類內部定義,但它擁有修改 Employee 類私有屬性 name 的權限。
因此,子類并非直接訪問父類的私有屬性,而是通過父類提供的公共方法(setName)間接地修改了父類的私有屬性。 這并不違反封裝原則,因為父類本身允許通過 setName 方法來修改 name 屬性。 這種設計模式允許父類控制對私有屬性的訪問,同時又允許子類通過繼承的方法來修改這些屬性,從而實現靈活的代碼結構和數據管理。 這正是封裝和繼承機制的精妙之處。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END