如果以上兩篇文章同學你已經跟練過了,接下來你就可以來了解我們面向對象的四個基本特徵了,概念其實很簡單,我會以最簡單的方式告訴你,重點是如何將這些重要的概念融會貫通到你的代碼中,用代碼體現出來你學習成果;首先彆着急,一點一滴的做事情,不積跬步無以至千里,不積小流無以成江河,學習也是一樣,積少成多的過程。
接下來我們來聊聊面向對象4大特種中幾個:
- 什麼是封裝?
- 封裝,就是隱藏實現細節。
- 封裝的舉例:
- 類對於屬性和方法的封裝。
- 對象對於數據的封裝。
- 方法對於代碼的封裝。
- 對於屬性的封裝。
- 如何對於屬性封裝?
- 將屬性私有化,提供公有方法訪問私有屬性。
- 老師類的屬性封裝:
-
public class Teacher { private String name; // 教員姓名 private int age; // 年齡 /** * 返回自我介紹的內容 */ public String introduction() { return "大家好!我是" + name + ",我今年" + age + "歲"; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ if(age>=22&&age<=150){ this.age = age; }else{ System.out.println("年齡不合法,恢復到初始狀態"); this.age = 22; } } public int getAge(){ return age; } }
-
-
老師類的測試類
-
public class TeacherTest { public static void main(String[] args) { Teacher t1 = new Teacher();//創建老師對象 //t1.name = "張老師"; //t1.age = -10; t1.setName("張老師"); t1.setAge(1000); String s = t1.introduction(); System.out.println(s); System.out.println(t1.getName()); System.out.println(t1.getAge()); } }
-
- 爲什麼使用構造方法:
- 要簡化對象初始化的代碼,可以通過構造方法來解決。
- 檢查屬性的賦值,將代碼的安全性得到提高。
- 構造方法的作用,對象的初始化操作。
- 升級教師類,增加構造方法。
-
public class Teacher { private String name; // 教員姓名 private int age; // 年齡 private String edu;// 學歷 private String position;// 職位 //缺省的 public Teacher(){ } public Teacher(String name,int age,String edu,String position){ this.name = name; this.age = age; this.edu = edu; this.position = position; } /** * 返回自我介紹的內容 */ public String introduction() { return "大家好!我是" + name + ",我今年" + age + "歲,學歷是" + edu + ",職位是" + position; } //屬性的:get 和 set 方法已經被省略 }
-
-
測試老師,使用構造方法
-
public class TeacherTest { public static void main(String[] args) { Teacher t1 = new Teacher("張老師", 33, "碩士", "講師"); String s = t1.introduction(); System.out.println(s); System.out.println(t1.getName()); System.out.println(t1.getAge()); } }
-
- 構造方法必須滿足以下語法規則:
- 方法名與類名相同
- 沒有返回類型
- 方法重載:
- 方法名稱相同,形參列表不同。
- 典型案例:
- println方法
- Math.abs方法(求絕對值)
- 構造方法重載
- 方法重載是多態特性的重要體現
- 代碼運行時根據參數的不同會選擇不同的方法。
- 普通方法名稱可以與類名相同,但是不規範
- 普通方法名要準守駝峯命名法,例如:setName(String name);
- 構造方法與普通方法的區別
- 構造方法沒有返回值類型。
- 構造方法名稱必須和類名相同。
- 構造方法是實例化對象時使用。(構造方法在創建該類的對象時候使用)
- 注意:
- 一個類中,默認缺省狀態有一個無參的構造方法。
- 一旦人爲定義一個有參的構造方法時候,缺省構造方法則消失。
- 面向對象的四大特性
- 封裝
- 繼承
- 多態
- 抽象
- 在Java程序中,代碼封裝帶給我們的好處是什麼?
- 代碼封裝的方法可以重複使用。
- 隱藏實現細節。
- 提高數據的安全性。
- 繼承關係設計
- 符合一個原則:什麼是什麼的一種。
- 父類更加通用,子類更加具體。
- 繼承:
- 概念:子類具有父類的一般特性(包括屬性和行爲),以及自身特殊的特性。
- 繼承的好處
- 子類自動繼承父類的屬性和方法,子類中不再存在重複代碼。
- 關鍵字super,表示的是:父類 或者是 基類。
- 關鍵字 this,表示的是:當前類的引用。
- 關鍵字extends,表示一個類繼承了另一個類。
- 繼承的特點
- 子類自動繼承父類的屬性和方法,子類中可以定義特定的屬性和方法。
-
創建老師類
-
public class Teacher { private String name; private String school; public Teacher() { } public Teacher(String name, String school) { this.name = name; this.school = school; } public void giveLession() { System.out.println("知識點講解"); System.out.println("總結提問"); } public void introduction() { System.out.println("我是來自" + this.school + "的" + name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } }
-
-
創建JavaTeacher類
-
public class JavaTeacher extends Teacher { public JavaTeacher(String name,String school){ super(name, school); } /* * 方法重寫,自類重寫父類的方法 */ @Override public void giveLession() { System.out.println("打開Eclipse,講授JavaSE"); super.giveLession(); } }
-
-
創建DoNet老師類
-
public class DoNetTeacher extends Teacher { public DoNetTeacher() { super(); } public DoNetTeacher(String name, String school) { super(name, school); } @Override public void giveLession() { System.out.println("打開VS2019"); super.giveLession(); } }
-
-
創建測試類
-
public class TeacherTest { public static void main(String[] args) { JavaTeacher t1 = new JavaTeacher("Lisa", "HK"); t1.introduction(); t1.giveLession(); DoNetTeacher t2 = new DoNetTeacher("Tom", "BJ"); t2.introduction(); t2.giveLession(); } }
-
- Object:一切類的根父類
- 一切類直接過着間接都繼承了Object類
- 方法重寫
- 子類繼承父類,重寫父類的方法要求:
- 方法名稱相同,返回值類型相同,形參列表相同。
- 訪問修飾符不能小於父類的訪問修飾符範圍。、
- 方法重寫的典型案例:
- Object的toString()方法;
- 返回該對象的字符串表示形式。
- 默認返回該對象的內存地址。
- Object的toString()方法;
- 子類繼承父類,重寫父類的方法要求:
- 多態
- 概念:多態是具有表現多種形態的能力的特徵,
- 同一個實現接口,使用不同的實例而執行不同操作。
- 多態性是OOP的一個重要特性,主要是用來實現動態聯編的,換句話說,就是程序的最終狀態只有在執行過程中才被決定,而非在編輯期間就決定了。這對於大型系統來說能提高系統的靈活和擴展性。
- 多態形成的條件:
- 要有繼承關係;
- 要有方法重寫;
- 父類引用指向子類對象。
- 多態的體現形式:
- 方法重載是多態特性的重要體現
- 代碼運行時根據參數的不同會選擇不同的方法。
- 方法的形參處定義的是父類的類型,實際傳入的是具體子類的對象。
- 方法重載是多態特性的重要體現
- 多態的優點
- 提高了代碼的靈活性和可擴展性。
- 優點的案例:
- 使用多態之後,當需要增加新的子類類型時,無需更改總部類,程序的可擴展性及可維護性增強。
- 構造器的相關知識點:
- 繼承關係,子類創建對象時候。
- 會默認的先執行父類的構造器。
- 如果沒有明確指出,就會執行父類無參的缺省構造器。
- 普通方法調用
- 子類重寫了父類的方法,就會替換父類的方法。
- 如果需要調用父類的方法,需要使用關鍵字:super。
未完待續,下一篇文章見。