java多态和继承_Java学习--继承与多态
1.何時(shí)使用繼承
1.1符合 *** is a ***的規(guī)則,即雙方可以相互依存,亦可保持獨(dú)立;
1.2可實(shí)現(xiàn)代碼復(fù)用
即當(dāng)大家的代碼塊具有相似或類似時(shí),我們可以抽象出一些公共的屬性及方法作為父類,子類可以 繼承父類而使用這些代碼片段。同時(shí)也能保持自己的獨(dú)立性。
2.抽象
2.1定義:
在一段段的繼承關(guān)系中,可以清晰地形成一座金字塔格式,底部的子類將會(huì)越來越強(qiáng)大,因?yàn)槠淅^承了上部的多種屬性及方法,而越在上部的類就越簡(jiǎn)單也即越抽象。甚至可追溯到這個(gè)父類中的方法無法滿足子類,形成了一種抽象方法,含有這種抽象方法的類即為抽象類。
語法如下:
public abstract class 類名 {
}
2.2抽象的特性
抽象類由于過于抽象,將無法實(shí)現(xiàn)方法,也即實(shí)現(xiàn)也無意義,固抽象類不能實(shí)例化。
public abstract class Animal{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public Animal(){
}
public Animal(String name){
this.name = name;
}
public void sleep(){
}
}
如果一個(gè)方法過于抽象,不能實(shí)現(xiàn),其一定要寫在抽象類中,不加方法體,固:
抽象方法一定位于抽象類中;
抽象方法沒有方法體;
不過,抽象類中的方法不一定都是抽象方法。
注意:
如果子類繼承了抽象類,需對(duì)抽象方法做出修改,否則,此子類也必須是抽象子類。
3.final關(guān)鍵字
——final是java語言中的一個(gè)關(guān)鍵字,被譯為最終的不可改變的
——final修飾的類無法被繼承
——final修飾的方法無法被重寫
——final修飾的變量一旦被賦值,將不可再次賦值
——final修飾的引用一旦指向某個(gè)對(duì)象之后,就不能再指向其他對(duì)象,所以被final修飾后的引用指向的對(duì)象將不會(huì)被垃圾回收機(jī)制回收。但該對(duì)象中的內(nèi)存可以被修改,因?yàn)槠湫揎椀囊檬且粋€(gè)地址,地址不能被改變,但其對(duì)象中的內(nèi)容可以改變。
——final修飾的實(shí)例變量常常與static一起使用,被稱為常量,與static一起使用將有效提高運(yùn)行效率。
public final class Animal{
}
public class Person extends Animal{
public void sleep(){
System.out.println("閉眼躺著睡覺...");
}
}
3.1思考
靜態(tài)方法能被繼承嗎?
靜態(tài)方法能被重寫嗎?
靜態(tài)方法可以被繼承,應(yīng)該說是被默認(rèn)繼承了靜態(tài)方法,但不能重寫,應(yīng)該說該靜態(tài)方法被隱藏了。
分析:
1. 靜態(tài)方法和屬性是屬于類的,調(diào)用的時(shí)候直接通過類名.方法名完成,不需要繼承機(jī)制及可以調(diào)用。如果子類里面定義了靜態(tài)方法和屬性,那么這時(shí)候父類的靜態(tài)方法或?qū)傩苑Q之為"隱藏"。如果你想要調(diào)用父類的靜態(tài)方法和屬性,直接通過父類名.方法或變量名完成,至于是否繼承一說,子類是有繼承靜態(tài)方法和屬性,但是跟實(shí)例方法和屬性不太一樣,存在"隱藏"的這種情況。
2. 多態(tài)之所以能夠?qū)崿F(xiàn)依賴于繼承、接口和重寫、重載(繼承和重寫最為關(guān)鍵)。有了繼承和重寫就可以實(shí)現(xiàn)父類的引用指向不同子類的對(duì)象。重寫的功能是:"重寫"后子類的優(yōu)先級(jí)要高于父類的優(yōu)先級(jí),但是“隱藏”是沒有這個(gè)優(yōu)先級(jí)之分的。
3. 靜態(tài)屬性、靜態(tài)方法和非靜態(tài)的屬性都可以被繼承和隱藏而不能被重寫,因此不能實(shí)現(xiàn)多態(tài),不能實(shí)現(xiàn)父類的引用可以指向不同子類的對(duì)象。非靜態(tài)方法可以被繼承和重寫,因此可以實(shí)現(xiàn)多態(tài)。
4.多態(tài)
4.1定義:
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作。對(duì)拓展開放,對(duì)修改關(guān)閉。
4.2使用多態(tài)的好處:
1.消除類型之間的耦合關(guān)系
2. 可替換性
3. 可擴(kuò)充性
4. 接口性
5. 靈活性
6. 簡(jiǎn)化性
4.3實(shí)現(xiàn)步驟:
[1] 編寫父類
[2] 編寫子類,子類一定要重寫/實(shí)現(xiàn)父類的方法
[3] 運(yùn)行時(shí),父類類型 引用 子類對(duì)象 (Pet pet = new Dog())
當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯(cuò)誤;如果有,再去調(diào)用子類的同名方法。可以使程序有良好的擴(kuò)展,并可以對(duì)所有類的對(duì)象進(jìn)行通用處理。
4.4多態(tài)的實(shí)現(xiàn)形式
1.父類類型 引用 子類對(duì)象(基于此而延伸)
實(shí)例:
// 多態(tài)// 同一引用類型Pet pet = null;
// 父類引用 引用 子類對(duì)象pet = new Dog("二狗",100,0,"土狗");
// 呈現(xiàn)多態(tài)pet.eat();
這里的.eat()的方法,是屬于Dog子類中獨(dú)有的方法,父類將子類的方法引用了過來,完成多態(tài),實(shí)現(xiàn)拓展性。
2.父類作為方法的形參實(shí)現(xiàn)多態(tài)
實(shí)例:
public void feed(Pet pet) {
System.out.println(this.getName() + "正在喂" + pet.getName());
pet.eat();
}
Pet作為寵物類的父類,在主人類中被當(dāng)作了方法的形參,實(shí)現(xiàn)了多態(tài)。
3.父類作為方法的返回值實(shí)現(xiàn)多態(tài)
實(shí)例:
public Pet adoptPet(int type) {
Pet pet = null;
if(1 == type) {
pet = new Dog();
}else if(2 == type) {
pet = new Penguin();
}else if(3 == type){
pet = new Cat();
}
return pet;
}
4.5存在于多態(tài)中的類型轉(zhuǎn)換
在多態(tài)實(shí)現(xiàn)的過程中一樣存在這兩種類型轉(zhuǎn)換,即自動(dòng)類型轉(zhuǎn)換(亦稱為向上類型轉(zhuǎn)換)與強(qiáng)制類型轉(zhuǎn)換(向下類型轉(zhuǎn)換)。
自動(dòng)類型轉(zhuǎn)換:子類可以自動(dòng)轉(zhuǎn)換為父類。
Pet pet = null;
pet = new Dog();
同樣,若想要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,需要加強(qiáng)制類型轉(zhuǎn)換符。
子類類型 引用 = (子類)父類對(duì)象
需要注意的是,如果單純這樣轉(zhuǎn)換,編譯不會(huì)報(bào)錯(cuò),但在運(yùn)行過程中將很容易發(fā)生運(yùn)行錯(cuò)誤,許多程序員在編碼的過程中,很容易將子類類型轉(zhuǎn)換為錯(cuò)誤的父類類型,導(dǎo)致父類在調(diào)用子類特有的方法時(shí)發(fā)生找不到方法的可能。所以java為了應(yīng)對(duì)這些問題,創(chuàng)建了 instantceof關(guān)鍵字。
通過instantceof關(guān)鍵字可以判斷其轉(zhuǎn)換的類型是否是我們需要的類型,可參考以下格式:
public class TestInstanceOf {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog instanceof Dog); //trueSystem.out.println(dog instanceof Pet); //trueSystem.out.println(dog instanceof Object); //true}
}
public void play(Pet pet) {
if(pet instanceof Dog) {
Dog dog = (Dog) pet;
dog.catchFlyDisc();
}else if(pet instanceof Penguin) {
Penguin penguin = (Penguin) pet;
penguin.swimming();
}
}
總結(jié)
以上是生活随笔為你收集整理的java多态和继承_Java学习--继承与多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据传输完整性_mysql –
- 下一篇: java 缓存一致性_Java多线程——