java的多型,instanceof,內部類,介面回撥
1、多型
a、定義:是指允許不同類的物件對同一個訊息作出不同的響應。
即同一個訊息可以根據傳送物件的不同,採取多種不同的行為方式。
(傳送訊息即方法的呼叫)
b、多型實現:屬於動態繫結的一種。比如:一個父類去例項化子類的物件,子類又通過父類定義好的方法,進行了覆寫,
此時用父類例項化的子類物件去呼叫父類的方法,呼叫將是子類覆寫的方法。
c、多型的作用:消除型別之間的耦合關係。
d、舉例:不同的領域,使用相同的工具,做不同的事情。
總結:1、this.print(obj),2、super.print(obj),
其中,1、2步驟輪訓執行,每一次輪訓結束,都將obj向上轉型一次,
然後再次輪訓,直到找到對應匹配項為止。如果找到了對應匹配項,
再找尋該方法是否有子類進行覆寫,如果有,執行子類覆寫的方法。
曉博思路:1、直接在當前型別中找匹配引數項,如果當前型別沒有對應的引數匹配。
則當前傳入的引數進行向上轉型1次,繼續尋找,往復執行,直到找到為止。
找到後,查詢該方法是否有子類的實現。
2、instanceof關鍵字
a、定義:用於判斷一個引用型別變數所指向的物件是否為某個類的例項。
b、級別:和二元運算子屬於同一個級別,比如:== < > ;
c、實際用途:向下強轉時,需要判斷強轉的物件是否屬於對應需要強轉的型別。
如果不是,強轉會出現錯誤。ClassCastException。
3、內部類
a、成員內部類:
a.1、成員內部類與外部類在編譯時,會生成兩個class檔案,其中內部類
的檔名為:外部類名$內部類名.class
a.2、成員內部類可以使用所有的修飾許可權。
b、靜態內部類:
b.1、靜態內部類中可以定義靜態或者非靜態成員。
b.2、靜態的含義就是該內部類可以像其他靜態成員一樣,在該外部類沒有
例項化的物件時,通過類名.的方式例項化內部類。
c、方法內部類
c.1、方法內部類只能定義在該方法內部,且只能在方法內部例項化,在方法外部例項化則不可以。
c.2、方法內部類物件不能使用該內部類所在方法的非final修飾的區域性變數。
d、匿名內部類
d.1、只用到一個例項。
d.2、類定義後馬上就要用到。
d.3、類非常非常的小(官方建議,匿名內部類的程式碼不超過4行)
d.4、給類命名並不會導致你的程式碼更容易理解。
拓展:
d.5、介面式:通過new+space+介面的方式建立匿名內部類,相當於建立了一個類實現了這個介面,而且,能且僅能實現1個介面。
d.6、引數式:通過匿名的方式直接例項化一個類,並且當作引數傳遞給某個方法,
這個方法的區域性變數就可以直接引用剛才建立好的匿名內部類的物件。
4、設計模式
a、單例模式:即整個應用程式有且僅有1個該型別的物件被建立,所有通過單例模式建立的物件返回的均是同一個物件的記憶體地址引用.
(除非之前建立的例項被回收,則再次建立一個新的單例)
package main;
public class Bus extends Car{
//1、現在需要設定單例模式的類中,定義一個自己型別的變數
private static Bus bus;
public static Bus getInstance(){
//2、單例:就是整個應用程式中,只存在該型別的唯一物件
//3、如果當前型別沒有物件,則建立物件,如有當前型別物件已經被建立過,則返回建立過的那個物件的記憶體地址的引用
if(bus == null){
bus = new Bus();
}
return bus;
}
}
5、設計原則
a、開閉原則:即針對可拓展性,為開放原則。針對某個類的修改為封閉原則。
6、介面回撥
a、if you call me, I will call back;
b、回撥就是一種雙向模式,一者呼叫另一者的方法,另一者再反調回來。
package Tast03;
public interface CallBack {
public abstract void paly();
}
package Tast03;
public class Person {
CallBack callBack;
public void doSamething(){
callBack.paly();
}
public CallBack getCallBack() {
return callBack;
}
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
}
package Tast03;
public class RunTime implements CallBack{
public void doArraything(){
Person person = new Person();
person.setCallBack(this);
person.doSamething();
}
public void paly() {
// TODO Auto-generated method stub
}
}
7、內部類的應用場景
a、內部類,仍然是一個獨立的類,在編譯之後,是$符號,連線左邊的外部類與右邊的內部類。
b、內部類不能用普通的方式訪問,內部類是外部類的一個成員,因此內部類可以自由的訪問外部類的成員變數,無論是不是private修飾的。
c、內部類宣告成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員。