最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多態(tài)到底都有啥好處

 更新時(shí)間:2021年05月21日 09:47:04   作者:wasane  
Java中的多態(tài)性有兩種類型:編譯時(shí)多態(tài)(靜態(tài)綁定)和運(yùn)行時(shí)多態(tài)(動態(tài)綁定)。方法重載是靜態(tài)多態(tài)的一個(gè)例子,而方法重寫是動態(tài)多態(tài)的一個(gè)例子,接下來通過本文給大家分享Java多態(tài)到底教了我干啥?有啥好處,一起了解下吧

多態(tài)到底是啥,就是當(dāng)子類繼承父類的方法時(shí),對其繼承下來的方法按照自己的方式重新定義(覆蓋重寫)。

1.向上轉(zhuǎn)型。

之前繼承有提到過。父類引用指向子類對象。這時(shí)的引用只能調(diào)用子類覆蓋重寫了的方法,不能調(diào)用子類特有方法。自動轉(zhuǎn)換

public class Main {
	public static void main(String[]args) {
		Father f = new Son();
		f.money();
		
		
	}
}	
class Father{
	void money() {
		System.out.println("父類的錢");
	}
}
class Son extends Father{
	void money() {
		System.out.println("子類的錢");
	}
	void SonPlay() {
		System.out.println("爸爸我能打游戲嗎?");
	}
}

運(yùn)行結(jié)果:

假如我要該引用區(qū)調(diào)用子類特有的方法(不是覆蓋重寫)呢? 會報(bào)錯(cuò) (下面的向下轉(zhuǎn)型就是解決這個(gè)問題)

下面舉個(gè)例子

不同語言輸出"HelloWorld"

(1)父類為正常類

public class Language{ //編程語言類
	void HelloWorld() { //輸出HelloWorld
		
	}
}
public class CLanguage extends Language{ //C語言類繼承編程語言類
	void HelloWorld() { //輸出HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
}
public class JavaLanguage extends Language{ //Java繼承編程語言類
	void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
}

提供一個(gè)函數(shù)調(diào)用

public class Test {
	public static void main(String[]args) {
		
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//或者
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
		
	}
	public static void inputHelloWorld(Language language) {
		language.HelloWorld();
	}
}

在不改變函數(shù)的形參(父類)下,實(shí)參(子類)的改變不會讓程序報(bào)錯(cuò)。也就是說,我只需要關(guān)心的是函數(shù)的形參是與Language類相關(guān)的類(本身或者子類對象)就行,而無需考慮傳入的實(shí)參到底是哪個(gè)子類對象。

運(yùn)行結(jié)果:

假如父類是接口或者是抽象類呢?也可以

(2)父類為接口

假如父類真的就是為了提供某標(biāo)準(zhǔn),或者父類無需實(shí)現(xiàn)內(nèi)容等情況,可以考慮吧父類變成接口,接口也支持多態(tài)。

public class Test {
	public static void main(String[]args) {
 
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//或者
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
		
	}
	public static void inputHelloWorld(Language language) {
		language.HelloWorld();
	}
}
 
interface  Language{ //編程語言類
	public void HelloWorld() ; //輸出HelloWorld
		
	
}
class CLanguage implements Language{ //C語言類繼承編程語言類
	public  void HelloWorld() { //輸出HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
}
class JavaLanguage implements Language{
	public  void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
}

運(yùn)行結(jié)果:

當(dāng)然,抽象類作為父類也可以實(shí)現(xiàn)多態(tài)哦。

2.向下轉(zhuǎn)型。

把父類引用指向子類對象的引用在強(qiáng)轉(zhuǎn)為不同子類對象。 轉(zhuǎn)完之后的對象可以調(diào)用子類特有方法

(解決上述的調(diào)用子類的特有方法會報(bào)錯(cuò))

public class Main {
	public static void main(String[]args) {
		Father f = new Son();
		//f.money();
		Son s = (Son)f;
		s.SonPlay();
		
	}
}	
class Father{
	void money() {
		System.out.println("父類的錢");
	}
}
class Son extends Father{
	void money() {
		System.out.println("子類的錢");
	}
	void SonPlay() {
		System.out.println("爸爸我能打游戲嗎?");
	}
}

運(yùn)行結(jié)果:

在舉上面的編程語言輸出HelloWorld例子,假如我要求inputLanguage方法對于傳入的實(shí)參中的子類對象進(jìn)行判斷,假如傳入的對象是C語言類就輸出新增的特有的方法,Java類也是一樣

這里就有點(diǎn)像簡單工廠模式(實(shí)參是啥我new啥)了,這里是實(shí)參是啥,我強(qiáng)轉(zhuǎn)之后,我調(diào)用對應(yīng)的方法。

public class CLanguage implements Language{ //C語言類繼承編程語言類
	public  void HelloWorld() { //輸出HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
	public void CReadMe() { //新增C語言子類特有方法
		System.out.println("我是C語言");
		
	}
}
public class JavaLanguage implements Language{
	public  void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
	public void JavaReadMe() {//新增Java子類特有方法
		System.out.println("我是Java");
	}
}

修改inputHelloWorld函數(shù)

public class Test {
	public static void main(String[]args) {
 
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//或者
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
	}
	public static void inputHelloWorld(Language language) {
		
		if(language instanceof CLanguage) { 
			CLanguage clanguage = (CLanguage) language;
			clanguage.CReadMe();
		}else if(language instanceof JavaLanguage) {
			JavaLanguage javalanguage = (JavaLanguage)language;
			javalanguage.JavaReadMe();
		}
        language.HelloWorld();
	}
}

運(yùn)行結(jié)果:

總得來說,多態(tài)可以使函數(shù)在其父類形參不變下,實(shí)參可以傳入多個(gè)不同的子類對象。

相關(guān)文章

  • 解決httpServletRequest.getParameter獲取不到參數(shù)的問題

    解決httpServletRequest.getParameter獲取不到參數(shù)的問題

    這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SSH框架網(wǎng)上商城項(xiàng)目第21戰(zhàn)之詳解易寶支付的流程

    SSH框架網(wǎng)上商城項(xiàng)目第21戰(zhàn)之詳解易寶支付的流程

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第21戰(zhàn)之易寶支付的流程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java中前端傳參含有“+”“=”等特殊字符處理方式

    Java中前端傳參含有“+”“=”等特殊字符處理方式

    這篇文章主要介紹了Java中前端傳參含有“+”“=”等特殊字符處理,比如“+”如果不經(jīng)過處理,傳到Java后臺之后,就變成空格了,“=”就直接沒了,本文對這一問題給大家詳細(xì)講解,需要的朋友可以參考下
    2023-10-10
  • Java當(dāng)中讓事務(wù)回滾的幾種方式

    Java當(dāng)中讓事務(wù)回滾的幾種方式

    這篇文章主要給大家介紹了關(guān)于Java當(dāng)中讓事務(wù)回滾的幾種方式, 事務(wù)回滾通常用于在某些操作失敗時(shí)取消之前已執(zhí)行的所有操作,這樣,我們就可以保證數(shù)據(jù)的一致性,需要的朋友可以參考下
    2023-08-08
  • Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出

    Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出

    這篇文章主要介紹了Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 深入淺析hbase的優(yōu)點(diǎn)

    深入淺析hbase的優(yōu)點(diǎn)

    本文講述了HBase的特征和它的優(yōu)點(diǎn),并簡要回顧了行鍵設(shè)計(jì)的重點(diǎn)之處,它還向你展示了如何在本地配置HBase環(huán)境,使用命令創(chuàng)建表、插入數(shù)據(jù)、檢索指定行以及最后如何進(jìn)行scan操作,感興趣的朋友一起看看吧
    2017-09-09
  • java swing 實(shí)現(xiàn)加載自定義的字體

    java swing 實(shí)現(xiàn)加載自定義的字體

    這篇文章主要介紹了java swing 實(shí)現(xiàn)加載自定義的字體,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實(shí)例

    SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實(shí)例

    這篇文章主要介紹了SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java中Lambda表達(dá)式基礎(chǔ)及使用

    Java中Lambda表達(dá)式基礎(chǔ)及使用

    這篇文章主要介紹了Lambda 是JDK 8 的重要新特性。它允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中),使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊,使Java代碼更加優(yōu)雅,感興趣的小伙伴一起來學(xué)習(xí)吧
    2021-08-08
  • SpringBoot2 集成log4j2日志框架的實(shí)現(xiàn)

    SpringBoot2 集成log4j2日志框架的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot2 集成log4j2日志框架的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

报价| 建湖县| 武汉市| 江津市| 永昌县| 新建县| 华亭县| 诸暨市| 驻马店市| 弥勒县| 舒兰市| 乐平市| 梨树县| 宿松县| 明光市| 陵川县| 河北区| 澄城县| 乐至县| 饶平县| 武宁县| 新疆| 黑龙江省| 栾川县| 嘉荫县| 鄯善县| 枣阳市| 抚顺县| 连州市| 文水县| 江安县| 明溪县| 吕梁市| 赤水市| 育儿| 武穴市| 观塘区| 武定县| 浮山县| 清新县| 武功县|