java 多態(tài)與抽象類詳解總結(jié)
前言
今天是2021LOL全球總決賽,一直不被大家看好的EDG沖到了決賽對戰(zhàn)韓國隊的DK,可以說EDG面對如此強大的對手,想贏是比較難的,為了給中國隊打氣我立下flag,如果EDG獲勝那我就獎勵自己學(xué)習(xí)到第二天6點,結(jié)果我就來了,,,恭喜EDG!
為了接下來接口的學(xué)習(xí),我們先來學(xué)習(xí)多態(tài)與抽類相關(guān)的一些知識,有助于我們更好的學(xué)習(xí)接口這一重點
多態(tài)
初識多態(tài)
多態(tài)(Polymorphism)按字面的意思就是“多種狀態(tài)”,是面向?qū)ο蟮某绦蛟O(shè)計語言最核心的特征。從一定角度來看,封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的。
什么是多態(tài)?
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個接口,使用不同的實例而執(zhí)行不同操作,舉個例子
彩色打印機和黑白打印機都是打印機,但是你用彩色打印機就可以打印出彩色的文件,用黑白打印機就可以打印出黑白的文件,使用不同的實例來執(zhí)行不同的操作。
多態(tài)的分類
編譯時多態(tài)(設(shè)計時多態(tài)):方法的重載
運行時多態(tài):JAVA運行時系統(tǒng)根據(jù)調(diào)用該方法的實例的類型來決定選擇調(diào)用哪個方法則被稱為運行時多態(tài)。這個也是我們平時所說的多態(tài)
一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法
調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定
多態(tài)的必要條件
繼承
父類引用指向子類對象:Parent p = new Child();
重寫
先來解釋一下第三個:
方法的重寫和重載是java多態(tài)性的不同表現(xiàn),重寫是父類與子類之間多態(tài)性的一種表現(xiàn),重載可以理解成多態(tài)的具體表現(xiàn)形式。
實現(xiàn)多態(tài)
想要實現(xiàn)多態(tài),那我們就先得了解向上轉(zhuǎn)型與向下轉(zhuǎn)型
向上轉(zhuǎn)型
向上類型轉(zhuǎn)換(Upcast):將子類型轉(zhuǎn)換為父類型。 隱式/自動類型轉(zhuǎn)換,是小類型到大類型的轉(zhuǎn)換
對于向上的類型轉(zhuǎn)換,不需要顯示指定,即不需要加上前面的小括號和父 類類型名
例如:
Parent p = new Child();
就是非常典型的一種,前提是Parent是Child的父類,也就是父類引用指向子類實例化。這是自動進行的,是隱式的進行的。
向下轉(zhuǎn)型
向下類型轉(zhuǎn)換(Downcast):將父類型轉(zhuǎn)換為子類型。 將一個指向子類對象的父類引用賦值給一個子類的引用
強制類型轉(zhuǎn)換,是大類型到小類型 –
父類型的引用必須指向轉(zhuǎn)型的子類的對象,即指向誰才能轉(zhuǎn)換成誰。不然也會編譯出錯
例如:
Parent p = new Child(); Child c = (Child)p;
大家應(yīng)該也注意到了,發(fā)生向下轉(zhuǎn)型前發(fā)生了向下轉(zhuǎn)型,這也是向下轉(zhuǎn)型發(fā)生的前提,也就是將一個指向子類對象的父類引用賦值給一個子類的引用。
既然這樣那么問題來了,我們怎么知道這個父類的引用是否指向了這個子類類型的對象呢?父類的子類一多,豈不是非常容易出錯呢?
這個大家其實不需要太擔(dān)心,因為我們有一個運算符instanceof
instanceof運算符
instanceof運算符用于:判斷該運算符前面引用類型變量指向的對象是否是后面類,或者其子類、接口實現(xiàn)類創(chuàng)建的對象。如果是則返回true,否則返回false,
其使用格式如下: 引用類型變量 instanceof (類、抽象類或接口)
例如:
p instanceof Child;//true
instanceof運算符用于強制類型轉(zhuǎn)換之前檢查對象的真實類型以避免類型轉(zhuǎn)換異常,從而提高代碼健壯性。
具體實現(xiàn)
父類引用指向子類實例時,可以調(diào)用子類重寫父類的方法以及直接繼承父類的方法,無法調(diào)用子類特有的方法。
如果要調(diào)用子類的特有方法就得進行向下轉(zhuǎn)型變成子類引用才可以。
靜態(tài)static方法屬于特殊情況,靜態(tài)方法只能繼承,不能重寫。調(diào)用的時候用誰的引用,則調(diào)用誰的版本。
當(dāng)使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調(diào)用子類的同名方法。
接下來來個簡單的例子演示一下吧!
class Father { int age=35; public void high(){ System.out.println("爸爸身高175cm"); } public void hobby(){ System.out.println("爸爸喜歡看新聞"); } public static void sta(){ System.out.println("我是父類的靜態(tài)方法"); } } class Son extends Father { public void high() { System.out.println("兒子今年身高180cm"); } public void hobby() { System.out.println("兒子喜歡打英雄聯(lián)盟"); } public static void sta(){ System.out.println("我是子類的靜態(tài)方法"); } public void self(){ System.out.println("我是兒子的方法"); } } public class Text_3 { public static void main(String[] args){ Father f = new Son(); f.hobby(); f.high(); f.sta(); // f.self();//報錯 Son s = (Son) f; s.hobby(); s.self(); s.sta(); } }
輸出為:
兒子喜歡打英雄聯(lián)盟
兒子今年身高180cm
我是父類的靜態(tài)方法
兒子喜歡打英雄聯(lián)盟
我是兒子的方法
我是子類的靜態(tài)方法
大家注意子類和父類中都有sta()方法,這并不是重寫,它們都是自己類的方法,并無什么關(guān)系。
抽象類與抽象方法
為什么要使用抽象?
當(dāng)父類的某些方法不確定時,可以用abstract關(guān)鍵字來修飾該方法,即:抽象方法,用abstract來修飾該類,即:抽象類。
我們都知道,父類是將子類所共同擁有的屬性和方法進行抽取,這些屬性和方法中,有的是已經(jīng)明確實現(xiàn)了的,有的還無法確定,那么我們就可以將其定義成抽象,在后日子類進行重用,進行具體化。這樣,抽象類也就誕生了。
用abstract修飾的類,即抽象類;用abstract修飾的方法,即抽象方法。
抽象方法
抽象方法不能有方法主體。格式如下:
//動物會叫 public abstract void cry();
抽象類
抽象類是為了把相同的但不確定的東西的提取出來,為了以后的重用。定義成抽象類的目的,就是為了在子類中實現(xiàn)抽象類。其實抽象類就是為了繼承而出現(xiàn)的
abstract定義抽象類 ,抽象類可以沒有抽象方法
抽象類不能直接實例化,只能被繼承,可以通過向上轉(zhuǎn)型完成對象實例
abstract定義抽象方法,不需要具體實現(xiàn)
包含抽象方法的類是抽象類
當(dāng)繼承的父類是抽象類時,需要將抽象類中的所有抽象方法全部實現(xiàn)。如果沒有全部實現(xiàn)那么這個子類必須定義為抽象類,否則報錯。
abstract 不能與static、final、private共存
抽象方法在子類實現(xiàn)時訪問權(quán)限必須大于等于父類方法
格式如下:
abstract class Animal { String name; int age; // 抽象方法 public abstract void cry(); }
希望大家能夠像EDG一樣證明自己,讓那些看不好你的人,好好瞧瞧
加油,少年!
到此這篇關(guān)于java 多態(tài)與抽象類詳解總結(jié)的文章就介紹到這了,更多相關(guān)java 多態(tài)與抽象類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合rocketmq實現(xiàn)分布式事務(wù)
大多數(shù)情況下很多公司是使用消息隊列的方式實現(xiàn)分布式事務(wù)。 本篇文章重點講解springboot環(huán)境下整合rocketmq實現(xiàn)分布式事務(wù),感興趣的可以了解一下2021-05-05java?web實現(xiàn)簡單登錄注冊功能全過程(eclipse,mysql)
前期我們學(xué)習(xí)了javaweb項目用JDBC連接數(shù)據(jù)庫,還有數(shù)據(jù)庫的建表功能,下面這篇文章主要給大家介紹了關(guān)于java?web實現(xiàn)簡單登錄注冊功能的相關(guān)資料,需要的朋友可以參考下2022-07-07Java字符編碼簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java字符編碼簡介,本文主要包括以下幾個方面:編碼基本知識,Java,系統(tǒng)軟件,url,工具軟件等,感興趣的朋友一起看看吧2017-08-08Spring boot配置多數(shù)據(jù)源代碼實例
這篇文章主要介紹了Spring boot配置多數(shù)據(jù)源代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07使用java代碼實現(xiàn)保留小數(shù)點的位數(shù)
因為個人應(yīng)用的需要,所以就寫個簡單點的了。希望大家都給給建議,共同學(xué)習(xí)。需要的朋友也可以參考下2013-07-07Java Web學(xué)習(xí)之Cookie和Session的深入理解
這篇文章主要給大家介紹了關(guān)于Java Web學(xué)習(xí)之Cookie和Session的相關(guān)資料,需要的朋友可以參考下2018-04-04