一憨颠、何為多態(tài)
多態(tài)是繼數(shù)據(jù)抽象和繼承之后的第三種基本特征胳徽;
多態(tài)通過(guò)分離做什么和怎么做,從另一個(gè)角度將接口和實(shí)現(xiàn)分離開(kāi)來(lái)爽彤,多態(tài)不但能夠改善代碼的組織結(jié)構(gòu)和可讀性膜廊,還能夠創(chuàng)建可擴(kuò)展的程序
多態(tài)三要素
1.被動(dòng)方必須有繼承關(guān)系
2.子類一般都要重寫父類方法
3.必須將主動(dòng)方的功能函數(shù)的參數(shù)設(shè)置為 被動(dòng)方父類的類型
舉個(gè)栗子:
司機(jī)會(huì)開(kāi)車,實(shí)現(xiàn)那該如何實(shí)現(xiàn)
首先創(chuàng)造一個(gè)車類淫茵,然后創(chuàng)建一個(gè)司機(jī)類爪瓜,并在司機(jī)類中添加開(kāi)車的方法,
假如說(shuō)司機(jī)會(huì)開(kāi)卡車 我們需要再定義一個(gè)卡車的類 然后在司機(jī)類中添加會(huì)開(kāi)卡車的方法下面看下傳統(tǒng)的調(diào)用方式 代碼如下:
/**
* 定義一個(gè)車類
*/
public class Car {
private String name;
//無(wú)參構(gòu)造方法
public Car(){
}
//有參構(gòu)造方法
public Car(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public void run(){
}
}
public class Bus extends Car {
public Bus(){
}
public Bus(String name){
super(name);
}
public void run(){
System.out.println("公交車在跑");
}
}
public class SmallCar extends Car{
public SmallCar(){
}
public SmallCar(String name){
super(name);
}
public void run(){
System.out.println("小轎車在跑");
}
}
public class Drivers {
//假如司機(jī)會(huì)開(kāi)公交車
public void driverBus(Bus bus){
bus.run();
}
//假如司機(jī)會(huì)開(kāi)小車
public void driverSmallcar(SmallCar smallCar){
smallCar.run();
}
}
public class Test {
public static void main(String[] args) {
//調(diào)用這些方法匙瘪,并運(yùn)行
Drivers drivers = new Drivers();
drivers.driverBus(new Bus("公交車司機(jī)"));
drivers.driverSmallcar(new SmallCar("小轎車司機(jī)"));
}
}
這時(shí)候你會(huì)在Drivers類中發(fā)現(xiàn)一個(gè)問(wèn)題铆铆,假如司機(jī)會(huì)多開(kāi)一種車,我們就要?jiǎng)?chuàng)建一個(gè)方法來(lái)執(zhí)行丹喻,這種不斷重復(fù)的行為薄货,容易導(dǎo)致后期代碼擴(kuò)展性差,難以維護(hù)
然后我們創(chuàng)建多態(tài)的例子碍论,看看存在的差異谅猾,代碼如下:
/**
* 定義一個(gè)車類
*/
public class Car {
private String name;
//無(wú)參構(gòu)造方法
public Car(){
}
//有參構(gòu)造方法
public Car(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public void run(){
}
}
public class Bus extends Car {
public Bus(){
}
public Bus(String name){
super(name);
}
public void run(){
System.out.println("公交車在跑");
}
}
public class SmallCar extends Car{
public SmallCar(){
}
public SmallCar(String name){
super(name);
}
public void run(){
System.out.println("小轎車在跑");
}
}
public class Drivers {
public void driversRun(Car car){
car.run();
}
}
public class Test {
public static void main(String[] args) {
//調(diào)用這些方法,并運(yùn)行
Drivers drivers = new Drivers();
drivers.driversRun(new Bus("公交車司機(jī)"));
drivers.driversRun(new SmallCar("小轎車司機(jī)"));
}
}
這時(shí)你會(huì)發(fā)現(xiàn)鳍悠,假如司機(jī)還會(huì)開(kāi)其他的車税娜,你不需要再在司機(jī)類中添加新的方法,你只需要添加會(huì)開(kāi)這種車的類并繼承父類car藏研,這種代碼比較容易維護(hù)敬矩。
這種多態(tài)的編寫方式稱之為向上轉(zhuǎn)型,但是如果你要調(diào)用子類獨(dú)有的方法必須向下轉(zhuǎn)型你才能調(diào)用蠢挡。