Java面向物件02:封裝和繼承
阿新 • • 發佈:2022-03-15
Java面向物件02:封裝和繼承
封裝
該露的露,該藏的藏
- 我們程式設計要追求“高內聚,低耦合” 。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合就是僅暴露少量的方法給外部使用。
- 封裝(資料的隱藏):通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。
- 總之,屬性私有,get/set
- 封裝的必要性
- 提高程式的安全性,保護資料
- 隱藏程式碼的實現細節
- 統一介面
- 提升系統的可維護性
- 建立私有屬性:private 資料型別 變數名 = 變數值;
- 建立set/get方法的快捷鍵 Alt + Insert
例項:
Application類:
package com.lurenj.oop; import com.lurenj.oop.demo04.Student; /* 封裝的必要性 1.提高程式的安全性,保護資料 2.隱藏程式碼的實現細節 3.統一介面 4.增加系統可維護性 */ public class Application { public static void main(String[] args) { Student student = new Student(); student.setName("lurenj"); System.out.println(student.getName()); student.setAge(999);//不合法的 System.out.println(student.getAge()); } }
Student類:
package com.lurenj.oop.demo04; //類 private:私有 public class Student { //屬性私有 private String name;//名字 private int id;//學號 private int age;//年齡 private char sex;//性別 //提供一些可以操作這個屬性的方法 //public 的 get、set 方法 //通過 get 方法獲得這個資料 public String getName(){ return this.name; } //通過 set 方法給資料設定值 public void setName(String name){ this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age > 120 || age < 0){ this.age = 3; }else { this.age = age; } } }
繼承
-
繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模,私有的東西無法被繼承,無論是變數還是方法,private修飾符
-
extends的意思是“擴充套件”。子類是父類的擴充套件。
-
JAVA中類只有單繼承,沒有多繼承,一個兒子只能夠有一個爸爸,
-
繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等
-
繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示
-
子類和父類之間,從意義上講應該具有“is a”的關係,IDEA檢視繼承樹繼承快捷鍵:Ctrl + H
-
object類,在JAVA中,所有的類,都預設直接或間接繼承object類
-
super
-
super呼叫父類的構造方法,必須在構造方法的第一個執行
-
super 必須只能出現在子類的方法或者構造方法中
-
super 和 this 不能同時呼叫構造方法
-
this和super的不同點
-
this:引用當前物件
super:引用父類物件
-
this:沒有繼承情況也能使用
super:只能在繼承條件下才能使用
-
構造方法中this呼叫本類的構造
呼叫super父類的構造
-
-
-
方法重寫
- 需要有繼承關係,子類重寫父類的方法,子類的方法和父類必須一致,方法體不同!
- 方法名必須相同
- 引數列表必須相同
- 修飾符:範圍可以擴大,但不能縮小 public > protected > default > private
- 丟擲的異常:範圍可以被縮小,但不能擴大; ClassNotFoundException < Exception
- IDEA建立重寫快捷鍵:Alt + Insert;選擇 override;
- 重寫都是方法的重寫,和屬性無關
- 為什麼需要重寫?
- 父類的功能,子類不一定需要,或者不一定滿足
父類:
package com.lurenj.oop.demo05; //重寫都是方法的重寫,和屬性無關 public class B { public void test(){ System.out.println("B=>test()"); } }
子類:
package com.lurenj.oop.demo05; //繼承 public class A extends B{ //Override 重寫 @Override //註解:有功能的註釋 public void test() { System.out.println("A=>test()"); } }