多態(tài)簡(jiǎn)介
多態(tài)就是事物存在的多種形態(tài),比如你在大街上看見(jiàn)一只藏熬且警,你可以說(shuō)這只藏獒真兇猛,也可以說(shuō)這只狗真兇猛岂贩,還可以說(shuō)這個(gè)動(dòng)物真兇猛,以上三種說(shuō)法其實(shí)都是指的這只藏獒。
在Java里面娱局,也是存在多態(tài)的,只要全部符合下面這三種情況咧七,就是多態(tài)
■有繼承
■有方法重寫(xiě)
■有父類(lèi)引用指向子類(lèi)對(duì)象
Cat c1=new Cat();
Animal al=new Cat();//父類(lèi)引用指向子類(lèi)對(duì)象衰齐,自動(dòng)類(lèi)型轉(zhuǎn)換,也叫做向上轉(zhuǎn)型
al.eat();//動(dòng)態(tài)綁定的靜態(tài)綁定
成員變量不存在重寫(xiě)
Cat c2=(Cat)al;//強(qiáng)制轉(zhuǎn)換類(lèi)型继阻,也叫做向下轉(zhuǎn)型
多態(tài)的有點(diǎn)
//多態(tài)的優(yōu)點(diǎn):提高代碼的擴(kuò)展性耻涛。
//開(kāi)發(fā)當(dāng)中注意:要面向抽象編程,不要面向具體編程
public void drive(Benz bc){//用具體的話就會(huì)顯得代碼臃腫瘟檩,用完就要改
bc.run();
}
public void drive(Car c){//用抽象編程可以防止代碼臃腫
c.run();
}
final修飾的類(lèi)無(wú)法被繼承抹缕。
final修飾的方法無(wú)法被重寫(xiě)。
final修飾的局部變量墨辛,-一旦賦值卓研,不可再改變。
final修飾的成員變量必須初始化值睹簇。
final修飾的基本數(shù)據(jù)類(lèi)型奏赘,值不能改變
final修飾的引用數(shù)據(jù)類(lèi)型,指向地址是不能改變的太惠,但是對(duì)象里面的值是可以改變的
抽象的概念
抽象這個(gè)詞說(shuō)白了就是看不懂,畢加索的畫(huà)一般都是被稱(chēng)為抽象的志珍。在java里面可以使用關(guān)鍵字abstract修飾-一個(gè)類(lèi),這樣的類(lèi)被稱(chēng)為抽象類(lèi), abstract修飾的方法叫做抽象方法。抽象類(lèi)或抽象方法一般也是看不懂的垛叨,因?yàn)槔锩婵赡芨揪蜎](méi)有代碼。
抽象類(lèi)的特點(diǎn)
■抽象類(lèi)無(wú)法被實(shí)例化,無(wú)法創(chuàng)建抽象類(lèi)的對(duì)象嗽元。
■雖然抽象類(lèi)沒(méi)有辦法實(shí)例化,但是抽象類(lèi)也有構(gòu)造方法敛纲,該構(gòu)造方法是給子類(lèi)創(chuàng)建對(duì)象用的。這也算是多態(tài)的一種剂癌。
■抽象類(lèi)中不一-定有抽象方法淤翔,但抽象方法必須出現(xiàn)在抽象類(lèi)中。
■抽象類(lèi)中的子類(lèi)可以是抽象類(lèi)佩谷,如果不是抽象類(lèi)的話必須對(duì)抽象類(lèi)中的抽象方法進(jìn)行重寫(xiě)旁壮。
■抽象類(lèi)和抽象方法不能被final修飾?
示例
public abstract A{ ? //abstract是抽象類(lèi)
System.out.println("class A");
}
//抽象方法
public abstract void ml();
public static void main(String[] dawd){
//A a =new A();//抽象類(lèi)不能被實(shí)例化
A a=new B();
a.m1();
? ? ? ? }
}
class B extends A{
public void m1(){
System.out.println(class B中的m1方法);
}
public B(){
super();
System.out.println("class B");
}
}
接口
接口的概述
電腦上面的主板有很多接口,比如內(nèi)存條的接口谐檀,有了這個(gè)接口抡谐,可以插入多個(gè)內(nèi)存條,主板和內(nèi)存條可能不是同一家生產(chǎn)廠商桐猬,但是兩種物體卻能結(jié)合到一起麦撵,正是因?yàn)檫@個(gè)接口的存在。只要廠家遵循這個(gè)接口溃肪,主板和內(nèi)存條就可以隨意更換免胃,提高了可插拔性,接口其實(shí)也是體現(xiàn)著一種規(guī)范 。
在java語(yǔ)言里面使用interface來(lái)聲明- -個(gè)接口惫撰,接口其實(shí)是- -個(gè)特殊的抽象類(lèi)羔沙,在接口里面的方法全部都是抽象的。
關(guān)于接口厨钻,有幾個(gè)需要注意的地方:
■接口中只能出現(xiàn)常量和抽象方法
■接口里面沒(méi)有構(gòu)造方法扼雏,無(wú)法創(chuàng)建接口的對(duì)象
■接口和接口之間支持多繼承,即- -個(gè)接口可以有多個(gè)父接口
■一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,即-一個(gè)類(lèi)可以有多個(gè)父接口
■一個(gè)類(lèi)如果實(shí)現(xiàn)了接口莉撇,那么這個(gè)類(lèi)需要重寫(xiě)接口中所有的抽象方法(建議) ,如果不重寫(xiě)則這個(gè)類(lèi)需要聲明為抽象類(lèi)(不建議)?
接口的作用
●可以使項(xiàng)目分層,都面向接口開(kāi)發(fā)呢蛤,提高開(kāi)發(fā)效率
■降低了代碼之間的耦合度,提高了代碼的可插拔性
開(kāi)發(fā)中盡量使用接口棍郎,少用抽象類(lèi)其障,-個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,卻只能繼承-一個(gè)父類(lèi)將之前的james開(kāi)汽車(chē)的例子修改-下
將Car定義為接口
interface Car{
? ? public void run();
}