java基礎05_繼承_抽象_介面_多型
一、繼承1、繼承的格式及特點: 1).格式:子類使用關鍵字:extends2).Java中繼承的特點: 1).父類中“私有成員”,“構造方法”不能被繼承; 2).Java中只能“單繼承”,子類只能繼承一個父類; 1. 繼承後的特點_成員變數和成員方法_方法重寫:
總體特點:訪問時先在子類中找,找到,就執行;找不到,再去父類中找; 1).當子類定義了跟父類一模一樣的方法時,這種情況叫:重寫 2).有時候我們要特意的去重寫父類中的方法,通常是因為:子類需要保留父類的功能,但希望改寫父類的行為,這時子類就要重寫父類的方法。 3).“特意的去重寫”就要知道重寫的語法格式: 1).子類方法的方法名、形參列表必須跟父類方法一模一樣。 2).子類方法的訪問許可權修飾符,可以跟父類相同,或者比父類更寬: Java中的訪問修飾符四種:從寬到窄 public(公有)、protected(受保護)、什麼都不寫(預設)、private(私有)方法重寫要注意的事項: 1.方法重寫時, 方法名與形參列表必須一致。 2.方法重寫時,子類的許可權修飾符必須要大於或者等於父類的許可權修飾符。 3.方法重寫時,子類的返回值型別必須要小於或者 等於父類的返回值型別。 4.方法重寫時, 子類丟擲的異常型別要小於或者等於父類丟擲的異常型別。 Exception(最壞) RuntimeException(小壞) 4).注意: 1).“私有方法”不能被繼承,所以也不能被重寫;為了防止“重寫失敗”,Java為我們提供了一種註解“@Override”,作用:給“編譯器”看的,告訴編譯器:我下面的方法是重寫父類的方法的,請按照重寫的語法規則驗證,如果不符合重寫規則,編譯器則編譯失敗。 1. 繼承後的特點_構造方法 1. .當構造子類物件前,JVM總會先構造一個父類物件,並且將這個父類物件儲存在子類物件空間內部。 2. .預設情況下,JVM會去呼叫父類的“預設無參”構造方法建立父類物件。因為子類的任何構造方法的第一行都隱式的有一句程式碼:呼叫父類中“無參”的構造方法。 super();3).如果父類沒有無參構造方法,而定義了有參的構造方法,這時,子類的構造方法中,必須顯示的使用super(實參)呼叫父類中有參的構造方法。注意:當子類繼承父類時,一定要觀察父類的“構造方法情況”,通常子類會提供跟父類中一樣形式,一樣數量的構造方法4、this和super關鍵字: 1).this和super的區別: super關鍵字代表了父類空間的引用。super關鍵字的 作用: 1. 子父類存在著同名的成員時,在子類中預設是訪問子類的成員,可以通過super關鍵字指定訪問父類的成員。Super預設是從父類開始執行,this預設是從本類開始執行,尋找其所要尋找的成員。 2. 建立子類物件時,預設會先呼叫父類無參的構造方法,可以通過super關鍵字指定呼叫父類的構造方法。super關鍵字呼叫父類構造方法要注意的事項: 1. 如果在子類的構造方法上沒有指定呼叫父類的構造方法,那麼java編譯器會在子類的構造方法上面加上super()語句。 2. super關鍵字呼叫父類的建構函式時,該語句必須要是子類建構函式中的第一個語句。因為子類可能會用到父類的屬性,所以必須先初始化父類。 3. super與this關鍵字不能同時出現在同一個建構函式中呼叫其他的建構函式。因為兩個語句都需要第一個語句。super關鍵字與this關鍵字的區別: 1. 代表的事物不一致。 1. super關鍵字代表的是父類空間的引用。 2. this關鍵字代表的是所屬函式的呼叫者物件。 2. 使用前提不一致。 1. super關鍵字必須要有繼承關係才能使用。 2. this關鍵字不需要存在繼承關係也可使用。 3. 呼叫建構函式的區別: 1. super關鍵字是呼叫父類的建構函式。 2. this關鍵字是呼叫本類的建構函式。二、抽象類及抽象方法定義格式及成員: 1).抽象類的定義格式:使用:abstract class 1).格式: public abstract class Person{ } 2).抽象類中的成員: 1).普通成員變數;(私有,儲存資料) 2).構造方法;(為成員變數賦值) 3).普通成員方法:(被子類繼承的) 4).抽象方法:(強制子類繼承,並重寫) 2).抽象方法的定義格式:使用:abstract abstract class Person{ public abstract void work();//強制子類繼承並重寫; }3)注意事項: 1).“抽象類”中可以不定義抽象方法; 2).如果包含“抽象方法”,那麼這個類必須是“抽象類”; 3).抽象類不能被例項化(建立物件)。它就是純粹的做父類用的。 4).抽象類不能被例項化,但可以包含構造方法,構造方法的作用:可以使子類使用super(...)語句呼叫這個構造方法,併為成員屬性賦值。 5).抽象方法不能被修飾為:private,因為private的方法不能被繼承,也就不能被重寫;而抽象方法就是讓子類重寫的,衝突;此外abstract也不能與static或final共同修飾一個方法。 6).子類繼承抽象類後,必須重寫抽象類中所有的抽象方法,否則子類也必須是一個抽象類; 7).當定義父類時,到底是普通類還是抽象類? 1).如果包含抽象方法,父類必須定義為“抽象類”; 2).如果沒有抽象方法,父類定義為普通類或抽象類都可以;8).抽象類可以繼承普通類與抽象類; 1. 介面
1).什麼是“介面”:介面是一個比抽象類更抽象的一種類;2).介面的作用: 1).彌補Java單繼承的弊端,通過介面可以實現子類功能的擴充套件;1、介面的定義格式及成員特點: 1).定義介面: public interface 介面名{//注意:沒有class關鍵字 } 2).介面會被編譯成.class檔案; 3).介面同抽象類一樣,不能被例項化;就是做“父級類”使用的; 4).介面中成員:六種 1).公有、靜態、常量;–可以被繼承,但不能被改寫;可以通過“介面名”,“子類類名”, “子類物件名”呼叫。 public static final int num = 10; 2).公有、抽象方法:–被子類繼承並強制重寫; public abstract void show(); 3).公有、預設(default)方法(不是抽象的,有方法體)–可以被繼承,子類也可以重寫; public default void show2(){ … } 4).公有、靜態方法(有方法體)–不能被繼承,只屬於介面,只能通過“介面名”呼叫 public static void show3(){ } 5).私有、靜態(有方法體)–不能被繼承,只能在此介面內部使用。被內部的default方法,公有、靜態方法呼叫 private static void show4(){ } 6).私有方法(有方法體)–不能被繼承,只能在此介面內部使用。被內部的default方法呼叫。 private void show5(){2、子類實現介面: 1).子類實現介面,使用關鍵字:implements2).子類實現介面後,必須重寫介面中所有的“抽象方法”,否則子類必須是“抽象類”。 其它可以被繼承的成員會被子類繼承。3、介面的多實現: 1).子類可以在繼承一個類的同時,實現一個或多個介面; 子類也可以不繼承,而直接實現一個或多個介面:子類:子類可以在繼承一個類的同時,實現一個或多個介面 class Zi_1 extends Fu implements IA,IB{//必須先繼承,後實現 //必須實現父類以及所有父介面中的所有的抽象方法 }子類:子類也可以不繼承,而直接實現一個或多個介面: class Zi_2 implements IA,IB{ //必須實現父介面中的所有的抽象方法 }注意: 1. 介面中,有多個抽象方法時,實現類必須重寫所有抽象方法。如果實現多個介面的抽象方法有重名的,只需要重寫一次。 2. 介面中,有多個預設方法時,實現類都可繼承使用。如果實現多個介面的預設方法有重名的,必須重寫一次。 3. 當一個類,既繼承一個父類,又實現若干個介面時,父類中的成員方法與介面中的預設方法重名,子類就近選擇執行父類的成員方法。 4. 公有、靜態、常量衝突:如果實現多個介面的常量有重名的,則常量不能訪問,訪問出異常。
1. 介面和介面的多繼承
1).類(抽象類)和類(抽象類)之間:繼承關係 2).類(抽象類)和介面之間:實現關係 3).介面和介面之間:繼承關係,而且可以多繼承注意: 1).介面不能繼承類; 2).介面不能實現介面; 4).介面和介面的多繼承的衝突:1)、一個介面能繼承另一個或者多個介面,這和類之間的繼承比較相似。介面的繼承使用 extends 關鍵字,子介面繼承父介面的方法。如果父介面中的預設方法有重名的,那麼子介面需要重寫一次,若有重名的抽象方法,只需重寫一個。注意:子介面重寫預設方法時,default關鍵字可以保留。子類重寫預設方法時,default關鍵字不可以保留。四、多型 1).什麼是“多型”:指一類事物的多種形態;2).Java中“多型”的程式碼格式: 父級型別 變數名 = new 子級型別(); 父級型別:可以是類、抽象類、介面 子級型別:必須是能new的子類物件 1. 當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類重寫後方法。 2. 多型的好處,體現在,可以使程式編寫的更簡單,並有良好的擴充套件。父類型別作為方法形參,利於程式擴充套件,父類型別作為方法的返回值,利於程式擴充套件。
多型時訪問的總體規則:多型時,大部分情況下訪問的都是父類的內容,只有當子類重寫父類的非靜態方法時,呼叫的是子類的。多型向下轉型的注意事項: 1).向下轉型時,轉換的子類型別必須是之前指向的那個子類型別,不能其它子類型別; 強轉有風險,轉換需謹慎: Java提供了一個運算子:instanceof,可以判斷一個變數是否是某種類型別; 多型要注意 的細節: 1. 多型情況下,子父類存在同名的成員變數時,訪問的是父類的成員變數。 2. 多型情況下,子父類存在同名的非靜態的成員函式時,訪問的是子類的成員函式。 3. 多型情況下,子父類存在同名的靜態的成員函式時,訪問的是父類的成員函式。 4. 多型情況下,不能訪問子類特有的成員。總結:多型情況下,子父類存在同名的成員時,訪問的都是父類的成員,除了在同名非靜態函式時才是訪問子類的。