欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

之前繼承有提到過。父類引用指向子類對象。這時的引用只能調(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("爸爸我能打游戲嗎?");
	}
}

運行結(jié)果:

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

下面舉個例子

不同語言輸出"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!\")");
	}
}

提供一個函數(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ù)的形參(父類)下,實參(子類)的改變不會讓程序報錯。也就是說,我只需要關(guān)心的是函數(shù)的形參是與Language類相關(guān)的類(本身或者子類對象)就行,而無需考慮傳入的實參到底是哪個子類對象。

運行結(jié)果:

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

(2)父類為接口

假如父類真的就是為了提供某標準,或者父類無需實現(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!\")");
	}
}

運行結(jié)果:

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

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

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

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

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("爸爸我能打游戲嗎?");
	}
}

運行結(jié)果:

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

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

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();
	}
}

運行結(jié)果:

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

相關(guān)文章

  • java微信小程序步數(shù)encryptedData和開放數(shù)據(jù)解密的實現(xiàn)

    java微信小程序步數(shù)encryptedData和開放數(shù)據(jù)解密的實現(xiàn)

    這篇文章主要介紹了java微信小程序步數(shù)encryptedData和開放數(shù)據(jù)解密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java流程控制語句最全匯總(中篇)

    Java流程控制語句最全匯總(中篇)

    這篇文章主要介紹了Java流程控制語句最全匯總(中篇),本文章內(nèi)容詳細,通過案例可以更好的理解數(shù)組的相關(guān)知識,本模塊分為了三部分,本次為中篇,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于ReentrantLock原理全面解讀

    關(guān)于ReentrantLock原理全面解讀

    這篇文章主要介紹了關(guān)于ReentrantLock原理全面解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 使用java實現(xiàn)各種數(shù)據(jù)統(tǒng)計圖(柱形圖,餅圖,折線圖)

    使用java實現(xiàn)各種數(shù)據(jù)統(tǒng)計圖(柱形圖,餅圖,折線圖)

    用Jfree實現(xiàn)條形柱狀圖表,java代碼實現(xiàn)??山?jīng)常用于報表的制作,代碼自動生成后可以自由查看??梢宰杂膳渲脠D表的各個屬性,用來達到自己的要求和目的。本文給大家介紹使用java實現(xiàn)各種數(shù)據(jù)統(tǒng)計圖(柱形圖,餅圖,折線圖),需要的朋友可以參考下
    2015-10-10
  • java正則實現(xiàn)各種日期格式化

    java正則實現(xiàn)各種日期格式化

    本文給大家分享的是使用java結(jié)合正則表達式來實現(xiàn)各種日期的格式化功能,代碼非常的簡單,有需要的小伙伴可以參考下。
    2015-05-05
  • java自定義ClassLoader加載指定的class文件操作

    java自定義ClassLoader加載指定的class文件操作

    這篇文章主要介紹了java自定義ClassLoader加載指定的class文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java實現(xiàn)自定義LinkedList類的示例代碼

    Java實現(xiàn)自定義LinkedList類的示例代碼

    LinkedList類跟ArrayList類不同,它通過指針以及結(jié)點的操作對鏈表進行增刪改查。本文就來和大家分享下Java如何為實現(xiàn)自定義LinkedList類,需要的可以參考一下
    2022-08-08
  • java使用Jco連接SAP過程

    java使用Jco連接SAP過程

    這篇文章主要介紹了java使用Jco連接SAP過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot為啥不用配置啟動類的實現(xiàn)

    SpringBoot為啥不用配置啟動類的實現(xiàn)

    這篇文章主要介紹了SpringBoot為啥不用配置啟動類的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)

    AC自動機算法常被認為是Trie樹+KMP算法的結(jié)合體,它是一個多模式匹配算法,在模式匹配領(lǐng)域被廣泛應用。本文將詳細為大家介紹AC自動機的原理與實現(xiàn)方法,感興趣的可以了解一下
    2022-12-12

最新評論