MODULE 11 物件導向
- 會定義介面
- 會在介面中定義抽象方法,預設方法,靜態方法,成員變數
- 會呼叫介面中的成員
- 會利用多型的方式new物件
- 知道多型的前提
- 要知道使用多型的好處
- 會在多型的前提下,向下轉型
- 會利用instanceof判斷型別
一.介面
(一)介面的介紹
1.介面:是一個引用資料型別,是一個標準,規則
2.關鍵字:
(1)interface介面
public interface 介面名{}
(2)implements 實現
實現類 implements 介面名{}
3.介面中可以定義的成員
(1)jdk7以及之前:
抽象方法:public abstract -> 即使不寫public abstract,預設也有
成員變數:public static final 資料型別 變數名 = 值 -> 即使不寫 public static final,預設也有
final是最終的,被final修飾的變數不能二次賦值,所以我們一般將 final修飾的變數視為常量
(2)jdk8:
預設方法:public default 返回值型別 方法名(形參){}
靜態方法:public static 返回值型別 方法名(形參){}
(3)jdk9開始:
` 私有方法:private的方法
(二)介面的定義以及使用
1.定義介面:
public interface 介面名{}
2.實現:
public class 實現類類名 implements 介面名{}
3.使用:
(1)實現類實現介面
(2)重寫介面中的抽象方法
(3)建立實現類物件(介面不能直接new物件)
(4)呼叫重寫的方法
(三)介面中的成員
1.抽象方法
(1)定義格式
public abstract 返回值型別 方法名(形參);
(2)注意
不寫public abstract 預設也有
(3)使用
A.定義實現類,實現介面
B.重寫抽象方法
C.建立實現類物件,呼叫重寫的方法
2.預設方法
(1)格式:
public default 返回值型別 方法名(形參){
方法體
return 結果
}
(2)使用
A.定義實現類,實現介面
B.預設方法可重寫,可不重寫
C.建立實現類物件,呼叫預設方法
3.靜態方法
(1)格式
public static 返回值型別 方法名(形參){
方法體
return 結果
}
(2)使用
介面名直接呼叫
預設方法和靜態方法 -> 可以作為臨時加的一個小功能
4.成員變數
(1)格式
public static final 資料型別 變數名 = 值
(2)相關知識點:final
final代表最終的,被它修飾的變數,不能二次賦值,可以視為常量
(3)特點
不寫public static final預設也有
(4)使用
介面名直接呼叫
(5)注意
A.被static final修飾的成員變數需要手動賦值
B.習慣上我們會將static final修飾的成員變數名大寫
(四)介面的特點
1.介面可以多繼承 -> 一個介面可以繼承多個介面
public interface InterfaceA extends InterfaceB,InterfaceC{}
2.介面可以多實現 -> 一個實現類可以實現一個或者多個介面
public class InterfaceImp1 implements InterfaceA,InterfaceB{}
3.一個子類可以繼承一個父類的同時實現一個或多個介面
public class Zi extends Fu implements InterfaceA,InterfaceB{}
4.注意:
繼承也好,實現介面也罷,只要是父類中或者介面的抽象方法,子類或者實現類 都要重寫
當一個類實現多個介面時,如果介面中的抽象方法有重名且引數一樣的,只需要重 寫一次
當一個類實現多個介面時,如果多個介面中預設方法有重名的,且引數一樣的,必須 重寫一次預設方法
(五)介面和抽象類的區別
相同點:
(1)都位於繼承體系的頂端,用於被其他類實現或者繼承
(2)都不能new
(3)都包含抽象方法,其子類或者實現類都必須重寫這些抽象方法
不同點:
(1)抽象類:一般作為父類使用,可以有成員變數,構造,成員方法,抽象方法等
(2)介面:成員單一,一般抽取介面,抽取的都是方法,視為功能的大集合
(3)類不能多繼承,但是介面可以
二.多型
1.物件導向三大特徵:封裝 繼承 多型
2.怎麼學:
(1)不要從字面上理解多型兩個字,要從使用形式上掌握
(2)要知道多型的好處
(3)要知道多型的前提
(一)多型的介紹
1.前提
(1)必須有子父類繼承或者介面實現關係
(2)必須有方法的重寫(沒有重寫,多型沒有意義),多型主要玩的是重寫方法
(3)new物件:父類引用指向子類物件
Fu fu = new Zi() ->理解為大型別接收了一個小型別的資料 -> double b = 10
2.注意
多型下不能直接呼叫子類特有功能
(二)多型的基本使用
(三)多型條件下成員的訪問特點
1.成員變數
看等號左邊是誰,先呼叫誰的變數
2.成員方法
看new的是誰,就先呼叫誰的成員方法,子類沒有找父類
(四)多型的好處
1.問題描述:
如果使用原始的方式neew物件(等號左右兩邊一樣),既能呼叫重寫的,還能調 用繼承的,還能呼叫自己特有的成員,但是多型方式new物件,只能呼叫重寫的, 不能直接呼叫子類特有的成員,那為啥還要用多型呢?
2.多型方式和原始方式new物件的優缺點:
原始方式:
(1)優點:既能呼叫重寫的,還能呼叫父類非私有的,還能呼叫自己特有的
(2)缺點:擴充套件性差
多型好處:
(1)優點:擴充套件性強
Fu fu = new Zi()
double b = 10;
b = 100L;
(2)缺點:不能直接呼叫子類特有功能
形參傳遞父類型別,呼叫此方法父類型別可以接收任意它的子類物件
傳遞哪個子類物件,就指向哪個子類物件,就呼叫哪個子類物件重寫的方法
(五)多型中的轉型
1.向上轉型
(1)父類引用指向子類物件
好比是:double b = 1;
2.向下轉型
(1)好比是強轉,將大型別強轉成小型別
(2)表現方式:
父類型別 物件名1 = new 子類物件() -> 向上轉型 -> double b = 1
子類型別 物件名2 = (子類型別)物件名1 -> 向下轉型 -> int i = (int)b
3.想要呼叫子類特有功能,需要向下轉型
(六)轉型可能會出現的問題
1.如果等號兩邊型別不一致,會出現型別轉換異常(ClassCastException)
2.解決:
在向下轉型之前,先判斷型別
3.怎麼判斷型別:instanceof
判斷結果是boolean型
4.使用:
物件名 instanceof 型別 -> 判斷的是關鍵字前面的物件是否符合關鍵字後 面的型別