子類如何通過繼承父類的公共方法修改私有屬性?

子類如何通過繼承父類的公共方法修改私有屬性?

子類通過繼承的公共方法修改父類私有屬性的機制

面向對象編程中,子類繼承父類的方法,看似繞過了私有屬性的訪問限制,修改了父類的私有屬性,這其實體現了封裝和繼承機制的巧妙結合。

讓我們分析以下代碼示例:

父類 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
喜歡就支持一下吧
點贊13 分享