继承 抽象 接口 多态
1.?繼承
概述
繼承就是子類繼承父類的屬性和行為,子類可以直接訪問父類的非私有方法
Java語言是單繼承 多級繼承 一個父類可以有多個子類
提高了代碼的復用性,類與類之間產生了關系,是多態的前提
繼承中方法的覆蓋重寫(聲明不變,重新實現)
父子類之間方法,參數列表相同
子類方法權限大于等于父類
子類方法的返回值范圍小于等于父類方法的返回值
大部分情況下,方法子父類方法聲明是完全一樣的
繼承中構造方法的訪問
構造方法名與類名一致,所以子類無法繼承父類構造
構造方法用于初始化成員變量,子類的初始化過程中,須先執行父類的初始化動作
父類成員變量初始化后,才可以給子類使用
所以子類構造必須調用父類構造,不寫則默認贈送super( ); 寫了則不贈送
子類構造可以通過super關鍵字調用父類重載構造
子類構造中,super構造調用只能有一個且必須是第一個
只有子類構造才能調用父類構造,子類成員方法不能調用父類構造
繼承中成員變量,成員方法的訪問
與多態完全一樣
成員變量:編譯看左,運行看左
成員方法:編譯看左,運行看右
super在繼承中的用法 ?
代表父類的存儲空間標識(可以理解為父親的引用)
子類成員方法中訪問父類的成員變量,方法
子類構造訪問父類構造 super( );
this在繼承中的用法
代表當前對象的引用(誰調用就代表誰)
本類成員方法中訪問本類成員變量,成員方法
本類構造訪問本類另一構造
this調用也必須是構造方法的第一個語句
this和super兩個構造調用不可同時使用
this( ); 沒有 .
繼承圖解
創建子類對象時,先初始化父類空間,再創建其子類對象本身
先把父類構造執行完,再在這個父類內容的外圍寫上子類內容
2.?抽象
概述
子類們重寫父類方法,而子類各自的實現都不盡相同
則父類方法聲明和方法主體,聲明有意義,而方法主體沒有意義
沒有方法主體的方法稱為抽象方法,用abstract修飾
包含抽象方法的類就是抽象類,用abstract修飾
注意
繼承抽象類的子類須重寫父類所有抽象方法,否則該子類也必須聲明為抽象類
抽象類不能創建對象,只能創建非抽象子類的對象
抽象類有構造方法,供子類創建對象時,初始化父類空間使用
不一定包含抽象方法,但是有抽象方法的類必定是抽象類
3.?接口
概述
接口是Java語言中一種引用類型,是方法的集合
接口的作用是制定規則,實現擴展
如果說類的內部封裝了成員變量,構造方法和成員方法,那么接口的內部主要就是封裝了方法
接口定義用interface,也會被編譯成.class文件,但要明確它不是類,而是引用數據類型
接口不能創建對象,但可以被實現(implements,類似繼承),接口實現類需實現接口所有方法
類是單繼承的,接口是可以多實現的(一個類實現多個接口)
Java7抽象方法 ?/ ?Java8默認方法,靜態方法 ?/ ?Java9私有方法(靜態/默認)
接口中的常量
(public static final) 數據類型 變量名 = 值;
接口常量必須賦值,否則無法通過編譯
命名規則:全大寫 _連接 (NUM_OF_PEOPLE)
通過 接口名.常量名 直接訪問
接口中的抽象方法:固定修飾符?public ?abstract?可省略
接口中的默認方法
解決接口升級問題
如果接口如添加新的抽象方法,則所有實現類都須實現此抽象方法
若直接在接口中添加默認方法,則實現類代碼不用更改
可以直接通過接口名稱.默認方法名稱來調用接口的默認方法
defaul關鍵字不能省略(因為接口中的方法默認是public的)
接口默認方法可被繼承,也可重寫,但只能通過實現類對象調用
接口中的靜態方法
靜態與.class文件相關
一個類可實現多個接口,它們的靜態方法可能沖突
所以應通過 接口名稱.方法名( ) 調用靜態方法,不能通過實現類對象調用
接口中的私有方法
解決接口中多個默認方法和靜態方法之間的代碼重復問題
多個默認方法之間有重復的代碼,用一個共有方法將其抽取出來
但這個共有方法不能讓實現類訪問到,應該是私有化的,這就是私有方法
普通私有方法:多個默認方法代碼重復(修飾符只有private,加default報錯,因為權限沖突)
靜態私有方法:多個靜態方法代碼重復(private和static順序無所謂)
注意事項
1.接口沒有靜態代碼塊或者構造方法
2.實現類所實現的多個接口存在重復的抽象方法,只需覆蓋重寫一次即可
3.實現類所實現的多個接口存在重復的默認方法,則實現類必須對沖突的默認方法進行覆蓋重寫
4.父類和接口的默認方法沖突,優先用父類的方法
5.接口之間的多繼承,多個父接口中的抽象方法重復,沒關系
6.多個父接口中的默認方法重復,子接口必須覆蓋重寫此默認方法,且帶著default
4.?多態
概述
指同一行為,在不同對象身上的多種表現形式
面向對象三大特征 : 封裝 繼承 多態
多態的前提:1.繼承/實現 2.方法的重寫 3.父類引用指向子類對象
格式:父類名稱 對象名 = ?new ?子類名稱( );
多態的意義
無論右邊new的是哪個子類對象,左邊都不變,代碼統一
實現父類的引用動態的調用子類的功能
有良好的擴展性
弊端是無法使用子類的特有內容
多態成員變量,成員方法的訪問
與繼承完全一樣
成員變量:編譯看左,運行看左
成員方法:編譯看左,運行看右
向上轉型
其實就是多態寫法
格式:父類名稱 對象名 = ?new 子類名稱( );
含義:創建一個子類對象,把它當作父類來看待使用
向上轉型一定是安全的,從小范圍轉向了大范圍
對象一旦向上轉型為父類,則無法調用子類特有方法
類似于基本類型的自動類型轉換
向下轉型
作用:解決多態的弊端 (無法使用子類的特有內容)
格式:子類名稱 對象名 = (子類名稱) 父類對象;
含義:將父類對象,還原成本來的子類對象
向下轉型須原路返回,否則編譯通過,但運行報錯
類似于基本類型的強制類型轉換
向下轉型之前用instanceof 判斷一下
Instanceof 方法
對象名 instanceof 類名/數據類型 :返回一個boolean值
轉載于:https://www.cnblogs.com/bushishucai/p/9631691.html
總結
以上是生活随笔為你收集整理的继承 抽象 接口 多态的全部內容,希望文章能夠幫你解決所遇到的問題。