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

Java之理解多態(tài)詳解

 更新時(shí)間:2021年12月19日 10:18:45   作者:real_xyttttt  
大家好,本篇文章主要講的是Java之理解多態(tài)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

一、多態(tài)的概念

? ? ? ?繼承關(guān)系使一個(gè)子類(lèi)能繼承父類(lèi)的特征,并且附加一些新特征。子類(lèi)是它的父類(lèi)的特殊化,每個(gè)子類(lèi)的實(shí)例都是其父類(lèi)的實(shí)例,但是反過(guò)來(lái)不成立。例如:每個(gè)圓都是一個(gè)幾何對(duì)象,但并非每個(gè)幾何對(duì)象都是圓。因此,總可以將子類(lèi)的實(shí)例傳給需要父類(lèi)型的參數(shù)。參考案例如下:

public class PolymorphismDemo{
/** Main method */
public static void main(String[] args){
  displayObject(new Circle(1,"red",false));
  displayObject(new Rectangle(1,1,"black",true));
}
 
public static void displayObject(GeometriicObject object){
  System.out.println("Created on "+ object.getDateCreated()+".Color is"+object.getColor());
}
}

Created on Mon Mar 09 19:25:20 EDT 2011.Color is red

Created on Mon Mar 09 19:25:20 EDT 2011.Color is black

? ? ? ?方法displayObject具有GeometriicObject類(lèi)型的參數(shù)??梢酝ㄟ^(guò)傳遞任何一個(gè)GeometriicObject的實(shí)例來(lái)調(diào)用displayObject。使用父類(lèi)對(duì)象的地方都可以使用子類(lèi)的對(duì)象。這就是通常說(shuō)的多態(tài)。簡(jiǎn)單來(lái)說(shuō),多態(tài)意味著父類(lèi)型的變量可以引用子類(lèi)型的對(duì)象。

二、多態(tài)的特點(diǎn)

?多態(tài)的前提:繼承(即必須有子父類(lèi)關(guān)系。)在使用多態(tài)后的父類(lèi)引用變量調(diào)用方法時(shí),會(huì)? ?調(diào)用子類(lèi)重寫(xiě)后的方法。?定義格式:父類(lèi)類(lèi)型 變量名=new 子類(lèi)類(lèi)型();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?父類(lèi)引用指向子類(lèi)對(duì)象,如:Animal a = new Cat();?多態(tài)中,編譯看左邊,運(yùn)行看右邊

三、instanceof操作符

? ? ? ?instanceof是Java的關(guān)鍵字。Java關(guān)鍵字中的每個(gè)字母都是小寫(xiě)的。

? ? ? ?為了更好地理解類(lèi)型轉(zhuǎn)換,可以認(rèn)為它們類(lèi)似于動(dòng)物、北極熊、熊貓之間的關(guān)系,其中動(dòng)物類(lèi)Animal是北極熊類(lèi)Polar bear和熊貓類(lèi)Panda類(lèi)的父類(lèi)。北極熊是動(dòng)物,所以,總是可以將?Polar bear的實(shí)例安全地賦值給Animal變量。該關(guān)鍵字用法是判斷某個(gè)對(duì)象是否屬于某種數(shù)據(jù)類(lèi)型,返回值為布爾類(lèi)型。

 
        Fu Zz=new Xu();
        Fu Zzz=new yiting();
        if(f1 instanceof Xu){
            System.out.println("Zz是Xu的類(lèi)型");
        }
        else{
            System.out.println("Zzz是yiting的類(lèi)型");
        }

四、多態(tài)的轉(zhuǎn)型

1、向上轉(zhuǎn)型

? ? ? ?總是可以將一個(gè)子類(lèi)的實(shí)例轉(zhuǎn)換為一個(gè)父類(lèi)的變量,稱(chēng)為向上轉(zhuǎn)換,因?yàn)樽宇?lèi)的實(shí)例總是它的父類(lèi)的實(shí)例。

作用:

減少一些重復(fù)的代碼對(duì)象實(shí)例化的時(shí)候可以根據(jù)不同需求實(shí)例化不同的對(duì)象

package project2;
	class Animal{
		int num=100;
		void say(){
			System.out.println("It's an Animal.");
		}
	}
 
	class Cat extends Animal{
		int num=50;
		void say(){
			System.out.println("It's a Cat.");
		}	
		void bark(){
			System.out.println("喵喵喵!");
		}
	}
 
	public class project2{
		public static void main(String[] args) {
			Animal cat=new Cat();//向上轉(zhuǎn)型	
			System.out.println(cat.num);
			cat.say();
//			cat.bark();
		}
	}

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

100
It's a Cat.

向上轉(zhuǎn)型不要強(qiáng)制轉(zhuǎn)型,父類(lèi)引用指向的或者調(diào)用的方法是子類(lèi)的方法,這個(gè)叫動(dòng)態(tài)綁定。向上轉(zhuǎn)型后父類(lèi)引用不能調(diào)用子類(lèi)自己的方法。

2、向下轉(zhuǎn)型

? ? ? ?把一個(gè)父類(lèi)的實(shí)例轉(zhuǎn)換為它的子類(lèi)變量。必須使用轉(zhuǎn)換標(biāo)記(子類(lèi)名)進(jìn)行顯示轉(zhuǎn)換,向編譯器表明你的意圖。為使轉(zhuǎn)換成功,必須確保要轉(zhuǎn)換的對(duì)象是子類(lèi)的一個(gè)實(shí)例。

作用:

? ? ? ? 向上轉(zhuǎn)型時(shí) ,會(huì)遺失子類(lèi)對(duì)象獨(dú)有的其他方法;可以通過(guò)向下轉(zhuǎn)型再重新轉(zhuǎn)回。

package project2;
class Animal{
	int num=100;
	void say(){
		System.out.println("It's an Animal.");
	}
}
 
class Cat extends Animal{
	int num=50;
	void say(){
		System.out.println("It's a Cat.");
	}	
	void bark(){
		System.out.println("喵喵喵!");
	}
}
 
public class project2{
	public static void main(String[] args) {
		Animal cat=new Cat();//向上轉(zhuǎn)型
		Cat cat2=(Cat) cat;//向下轉(zhuǎn)型
		System.out.println(cat2.num);
		cat2.say();
		cat2.bark();
	}
}

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

50
It's a Cat.
喵喵喵!

五、方法重寫(xiě)

提示:要重寫(xiě)一個(gè)方法,需要在子類(lèi)中使用和父類(lèi)一樣的簽名來(lái)對(duì)該方法進(jìn)行定義。

子類(lèi)從父類(lèi)中繼承方法。有時(shí),子類(lèi)需要修改父類(lèi)中定義的方法的實(shí)現(xiàn),這稱(chēng)為方法重寫(xiě)。

以下幾點(diǎn)值得注意:

重寫(xiě)的方法必須與被重寫(xiě)的方法具有一樣的簽名,以及一樣或者兼容的返回類(lèi)型。兼容的含義是重寫(xiě)方法的返回類(lèi)型可以是被重寫(xiě)方法的返回類(lèi)型的子類(lèi)型。僅當(dāng)實(shí)例方法可訪問(wèn)時(shí),它才能被重寫(xiě)。如果子類(lèi)中定義的方法在父類(lèi)中是私有的,那么這兩個(gè)方法完全沒(méi)有關(guān)系。與實(shí)例方法一樣,靜態(tài)方法也能被繼承。但是,靜態(tài)方法不能被重寫(xiě)。如果父類(lèi)定義的靜態(tài)方法在子類(lèi)中被重新定義,那么在父類(lèi)中定義的靜態(tài)方法將被隱藏??梢允褂谜Z(yǔ)法“父類(lèi)名.靜態(tài)方法名”調(diào)用隱藏的靜態(tài)方法。防止繼承和重寫(xiě)

? ? ? ?一個(gè)被final修飾的類(lèi)和方法都不能被繼承。被final修飾的數(shù)據(jù)域是一個(gè)常數(shù)。

? ? ? ?有時(shí)候,可能希望防止類(lèi)被繼承。在這種情況下,使用final修飾符表明一個(gè)類(lèi)是最終類(lèi),是不能作為父類(lèi)的。Math類(lèi)就是一個(gè)最終類(lèi)。String、StringBuilder和StringBuffer類(lèi)以及所有基本數(shù)據(jù)類(lèi)型的包裝類(lèi)也都是最終類(lèi)。例如,如下類(lèi)A 就是最終類(lèi),不能被繼承:

public final class A{
  //Data fields,constructors, and methods omitted
}

? ? ? ?也可以定義一個(gè)方法為最終,最終方法不能被它的子類(lèi)重寫(xiě)。例如如下,不能被重寫(xiě):

public class Test {
  //Data fields,constructors, and methods omitted
 
  public final void m() {
    // Do something
 }
}

注:修飾符public、protected、private、static、abstract以及final可以用在類(lèi)和類(lèi)的成員上,只有final修飾符還可以用在方法中的局部變量上。方法內(nèi)的final局部變量就是常量。

六、小結(jié)

為了重寫(xiě)一個(gè)方法,必須使用與它的父類(lèi)中的方法一樣的簽名、一樣或者兼容的返回類(lèi)型來(lái)定義子類(lèi)中的方法。實(shí)例方法只有在可訪問(wèn)時(shí)才能重寫(xiě)。這樣,私有方法是不能重寫(xiě)的,因?yàn)樗遣荒茉陬?lèi)本身之外訪問(wèn)的。如果子類(lèi)中定義的方法在父類(lèi)中是私有的,那么這兩個(gè)方法是完全沒(méi)有關(guān)系的噢!靜態(tài)方法與實(shí)例方法一樣可以繼承。但是,靜態(tài)方法不能重寫(xiě),如果父類(lèi)中定義的靜態(tài)方法在子類(lèi)中重新定義,那么父類(lèi)中定義的方法被隱藏??梢允褂帽磉_(dá)式obj instanceof AClass 測(cè)試一個(gè)對(duì)象是否是一個(gè)類(lèi)的實(shí)例??梢允褂胒inal修飾符來(lái)表明一個(gè)類(lèi)是最終類(lèi),是不能被繼承的;也可以表明一個(gè)方法是最終的,是不能被重寫(xiě)的。

到此這篇關(guān)于Java之理解多態(tài)詳解的文章就介紹到這了,更多相關(guān)Java多態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn)

    Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下
    2014-02-02
  • SpringCloud中的OpenFeign調(diào)用解讀

    SpringCloud中的OpenFeign調(diào)用解讀

    OpenFeign是一個(gè)顯示聲明式的WebService客戶端,使用OpenFeign能讓編寫(xiě)Web Service客戶端更加簡(jiǎn)單OpenFeign的設(shè)計(jì)宗旨式簡(jiǎn)化Java Http客戶端的開(kāi)發(fā),本文給大家介紹SpringCloud之OpenFeign調(diào)用解讀,感興趣的朋友一起看看吧
    2023-11-11
  • SpringBoot security安全認(rèn)證登錄的實(shí)現(xiàn)方法

    SpringBoot security安全認(rèn)證登錄的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot security安全認(rèn)證登錄的實(shí)現(xiàn)方法,也就是使用默認(rèn)用戶和密碼登錄的操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Netty分布式pipeline傳播inbound事件源碼分析

    Netty分布式pipeline傳播inbound事件源碼分析

    這篇文章主要為大家介紹了Netty分布式pipeline傳播inbound事件的源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • java文件上傳下載代碼實(shí)例

    java文件上傳下載代碼實(shí)例

    這篇文章主要介紹了java文件上傳下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解

    Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解

    這篇文章主要介紹了Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類(lèi)的數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)單來(lái)說(shuō) Stream 的 map 使得其中的元素轉(zhuǎn)為另一種元素的映射(map)方法,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)人機(jī)猜拳游戲

    Java實(shí)現(xiàn)人機(jī)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)人機(jī)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)

    基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)

    下面小編就為大家分享一篇基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java 類(lèi)加載機(jī)制詳細(xì)介紹

    Java 類(lèi)加載機(jī)制詳細(xì)介紹

    這篇文章主要介紹了Java 類(lèi)加載機(jī)制詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java通過(guò)正則表達(dá)式獲取域名簡(jiǎn)單示例

    Java通過(guò)正則表達(dá)式獲取域名簡(jiǎn)單示例

    在Java中可以使用正則表達(dá)式來(lái)從字符串中匹配和提取域名,下面這篇文章主要給大家介紹了關(guān)于Java通過(guò)正則表達(dá)式獲取域名的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評(píng)論