一,多態:
1.面向對象四大基本特性:抽象,封裝,繼承,多態
抽象,封裝,繼承是多態的基礎。多態是抽象,封裝,繼承的表現。
2.什么是多態
不同類的對象對同一消息作出不同的響應叫做多態
3.多態的作用
簡單來說:解藕。詳細點就是,多態是設計模式的基礎(既然是基礎,那么一些設計模式中肯定有多態的下面三個條件)
4.多態存在的三個條件
有繼承關系
子類重寫了父類方法
父類引用指向子類對象
5.注意:
因為多態存在必須要有“子類重寫父類方法”這個條件,那么下面三種類型的方法沒辦法表現出多態的特性(因為不能被重寫)
static方法:static修飾的方法是屬於類的,而不屬於實例
final方法:因為被final修飾的方法無法被子類重寫
private方法:被private修飾的發那個法對子類不可見,
protected方法:被protected修飾的方法可以被子類見到,也可以被重寫,但無法被外部所引用,無法引用,就沒有多態
6.多態的分類:
編譯時多態,方法的重載
運行時多態,方法的重寫
7.分析多態問題的幾條原則
比如有一個父類Father,有一個子類Children
(1)向上轉型是自動的。Father f=new Children()是自動的,不需要強轉
(2)向下轉型要強轉。即Children c=new Father()是無法編譯通過的,必須要Children c=(Children)new Father(),讓父類知道它要轉成具體哪個子類
(3)父類引用指向子類對象,子類重寫了父類的方法,調用父類的方法,實際調用的是子類重寫了父類的該方法。
即 Father f=new Children(),f.toString()實際上調用的是Children中的toString()方法
例如:
父類: public class Father { private double money=100; public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } public void usePhone(){ System.out.println("使用老年機"); } }
子類:有繼承關系,並且重寫父類的方法userPhone() public class Children extends Father { public void usePhone(){ System.out.println("繼承money:"+getMoney()+"使用智能機"); } }
public class Test { public static void main(String[] args) { Father f=new Children(); //父類的引用指向子類對象。 f.usePhone();//其實是調用子類的方法,輸出:“繼承money:100.0使用智能機” } }
二,封裝
一個對象他所封裝的是自己的屬性和方法,所以它是不需要依賴其他對象就可以完成自己的操作
封裝就是把一個對象的屬性私有化,同時提供一些可以被外界訪問屬性的方法
1.封裝的三大好處:
良好的封裝能減少耦合
類內部的結構可以自由修改
可以對成員變量更精確的控制
隱藏信息,實現等細節
2.實際應用
(1)好處1:封裝確實可以使我們容易地修改類的內部實現,而無需修改使用了該類的客戶代碼。
public class User { private Long id; private String name; private int age; public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
如果我們需要修改User這個類,把 age改為String 。你只有一處使用了這個類還好,如果你有幾十個甚至上百個這樣地方,你是不是要改到崩潰。如果使用了封裝,我們完全可以不需要做任何修改,只需要稍微改變下Husband類的setAge()方法即可。
public class User { private Long id; private String name; private String age; //改為String類型 public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getAge() { return age; } public void setAge(int age) { this.age = String.valueOf(age); } }
(2)好處2:可以對成員變量進行更精確的控制。
public class User { private Long id; private String name; private int age; public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public int getAge() { return age; } public void setAge(int age) { if(age>150){ System.out.println("年齡不符合要求");//輸出提示信息 }else { this.age = age; } } }
好處3:例如性別我們在數據庫中一般都是已1、0方式來存儲的,但是在前台我們又不能展示1、0,這里我們只需要在getter()方法里面做一些轉換即可。
public class User { private Long id; private String name; private Integer sex; private String sexString; public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getSexString() { if(sex==1){ setSexString("男"); }else if(sex==0){ setSexString("女"); }else { setSexString("未知"); } return sexString; } public void setSexString(String sexString) { this.sexString = sexString; } }
三,繼承
1.使用繼承可以用來復用代碼。可以將所有子類的共同屬性放入父類中
使用繼承記住三句話:
子類擁有父類非private的屬性和方法
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展
子類可以用自己的方式實現父類的方法
2.構造方法:
首先是通過構造方法來完成對象的初始化,子類的構造方法默認調用父類的構造方法,通過super()方式
(1).父類有默認的構造方法,子類的構造方法默認執行super();調用父類構造方法進行實例化
(2).父類沒有默認構造方法(肯定是手寫了構造方法),子類構造方法中顯示使用super()調用父類構造方法
3.缺點:
父類變,子類必須變
繼承是一種強耦合關系