多態:
多態:多種形式;
多態是指一個對象有多種形式的能力;
多態描述:相同的行為;不同的實現;
多態分類:
靜態多態:程序在編譯時,系統就能決定調用哪個方法,所以稱為編譯時多態;實現的方式就是方法的重載,調用規則是依據對象在定義時的類型相應的調用對應類中的重載方法;
動態多態:在運行中系統才能動態確定方法所指的對象,所以稱為運行時多態,實現的方式是重寫父類中的同名成員方法,動態多態主要是通過動態綁定和重寫機制來實現。
技術基礎:
1、向上轉型技術:一個父類的引用變量可以指向不同的子類對象,或者一個子類對象可以被當做一個父類類型;
2、instanceof關鍵字:instanceof關鍵字用于判斷運行時對象的真正類型;
3、動態綁定技術:運行時根據父類引用變量所指對象的時機類型執行相應的子方法,從而實現多態性;
基本數據類型的轉型:
1、自動類型轉換、隱式轉換、從小范圍的數據類型往大范圍的數據類型轉換
無風險/肯定成功;
int a = 'b';
double f = 254;
2、強制類型轉換、顯式轉換、從大范圍的數據往小范圍的數據類型轉換
有風險/丟失精度/無意義
a = (int)3.14;
char c = (char)12345670;
引用數據類型的轉換——只有有繼承關系的類才能使用類型轉換
public class PetBean {private String name;private int age;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;}
}
?
public class DogBean extends PetBean {private int boneNum;public int getBoneNum() {return boneNum;}public void setBoneNum(int boneNum) {this.boneNum = boneNum;}}
public class TestMain {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub
1、向上類型轉換、自動類型轉換、隱式類型轉換、從小范圍的數據類型往大范圍的數據類型轉換
無風險\肯定成功
PetBean p = new PetBean();//父類的引用可以指向子類的對象
2、向下類型轉換、強制類型轉換、顯式轉換、從大范圍的數據往小范圍的數據類型轉換
有風險/可能會拋出異常,終止程序的運行
只有運行起來后,確實是本類引用指向本類對象或父類引用指向子類對象才可以成功
DogBean dog = (DogBean)p;
多態應用——多態參數:
多態參數就是當方法的某個形式參數是一個引用的時候,與該引用兼容的任何對象都可以傳遞給方法,從而允許方法接受不同數據類型的形式參數。
多態應用——異構集合:
多態另一個常見應用是穿件一個不是同一類型,但是有共同父類的數據集合,不同對象的集合稱為異構集合。
多態小結:
使用父類類型的引用指向子類的對象;
該引用只能調用父類中定義的方法,不能調用子類中獨有的方法;
如果子類中重寫了父類中的一個方法,那么在調用該方法的時候,將會調用子類中的這個方法;
在多態中,子類可以調用父類中的所有方法;
?
抽象類:
將一個方法聲明為抽象方法有兩個結果:
1、類也必須聲明為抽象類,如果一個類包含了一個抽象方法,那么該類也必須是抽象類;
2、任何子類必須重寫抽象方法,除非子類本身也是抽象類;
關鍵字: abstract;用這個關鍵字修飾類的時候,表示這個類是抽象類;
注: 抽象類不能產生對象,它只能充當父類;
1、有抽象方法的類一定是抽象類;
2、抽象類不一定有抽象方法;
3、抽象類除了類有abstract修飾符,它內部跟普通類一樣,可以有:屬性、構造、已經實現的方法;
例:
public class Boy {private Girl myGirl;public Girl getMyGirl() {return myGirl;}public void setMyGirl(Girl myGirl) {this.myGirl = myGirl;}public void kiss(){System.out.println("讓我親一個嘛~~~");this.myGirl.response();}
}
public abstract class Girl {//abstract關鍵字表示抽象//當它修飾方法的時候,表示類有這個方法,但是不能確定這個方法的實現,應該由它的子類去確定public abstract void response();}
public class PureGirl extends Girl {
//子類在繼承抽象類的時候,必須重寫抽象類的抽象方法。
//否則這個子類也必須是抽象類。
@Overridepublic void response() {// TODO Auto-generated method stubSystem.out.println("嗯~~~你好壞~~~");}}
public class BoldGirl extends Girl {
//子類在繼承抽象類的時候,必須重寫抽象類的抽象方法。
//否則這個子類也必須是抽象類。
@Overridepublic void response() {// TODO Auto-generated method stubSystem.out.println("老娘飛起來一腳~~~~");}}
public class TestLove {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubBoy boy = new Boy();System.out.println("請選擇你喜歡的女孩類型:1、純情;2、野蠻。");int choice = new Scanner(System.in).nextInt();Girl girl = null;switch(choice){case 1:girl = new PureGirl();break;case 2:girl = new BoldGirl();break;}boy.setMyGirl(girl);boy.kiss();}}
?