日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java多态和继承_Java学习--继承与多态

發(fā)布時(shí)間:2023/12/19 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多态和继承_Java学习--继承与多态 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。