java基礎-單利模式/繼承/多型
阿新 • • 發佈:2018-11-22
單利模式:23種設計模式
- 單例類只能有一個例項。
- 單例類必須自己建立自己唯一的例項。
- 單例類必須給所有其他物件提供這個例項。
- 餓漢式單利模式
/* 餓漢式單利模式 */ class MySingleTon{ private static MySingleTon singleton=new MySingleTon(); //建立唯一例項 private MySingleTon(){ //建構函式 } public static MySingleTon getinstance(){ //提供一個全域性的訪問點 return singleton ; } }
- 懶漢式單利模式
- 執行緒安全:是否競態條件?》臨界區程式碼塊>原子性操作>加鎖(互斥,自旋,讀寫);
/* 懶漢式單利模式 */ class MySingleTon1{ private static Object lock=new Object(); private static MySingleTon1 mysingleton1=null; private MySingleTon1(){ } //可重入函式也叫執行緒安全函式 public static MySingleTon1 getinstance(){ //提供一個全域性訪問點。 if(mysingleton1==null){ //雙重鎖,如果已經有例項,這邊直接返回。麼有他對於單執行緒來說cpu效率太低 synchronized (lock){ if(mysingleton1==null){ //當鎖關閉的時候,第一個mysinleton1下面已經有執行緒了,這裡返回那些漏網的。 mysingleton1=new MySingleTon1(); } } } return mysingleton1; //返回一個類例項 } }
- 內部類單例模式:靜態內部類。
/* 內部類單利模式 */ class Overclass{ private Overclass(){//建構函式 } private static class innerClass{ //只有訪問靜態內部類的時候才會建立物件。 private static Overclass overclass=new Overclass();//static內部類特點,呼叫外部類非靜態,傳入一個外部類物件。 private static innerClass innerClass=null; private static Object lock=new Object(); private innerClass(){ } public static innerClass getinstance(){ //執行緒安全函式。提供一個訪問物件。 if(innerClass==null){ synchronized(lock){ //執行緒安全 if(innerClass==null){ innerClass=new innerClass(); } } } return innerClass.overclass; } } }
繼承:一種機制,可以進行程式碼的重用,基類(父類,超類) 子類(派生類)
-
面試問題1:派生類繼承了父類的什麼??
除建構函式外的所有屬性。 -
super:
-
super(a) :呼叫基類的建構函式 。這個必須放在第一行。
-
super.date :訪問基類的資料成員。
-
super.fun: 呼叫基類的成員方法。
-
基類和派生類的之間的相互賦值 : base=derieve(多型的基礎)
-
過載(overloade): 函式名相同,引數列表不同。並不一定在同一個類中,繼承關係中也可以構成過載。
-
重寫/覆蓋(overwrite):函式名相同,引數列表相同,返回值型別相同。 可以遵守協變型別。
-
協變型別:在匯出類(子類)的覆寫基類(父類)的方法的返回值可以是基類方法返回值的匯出型別。
基類(父類)中的方法:Fu f(){}
那麼在匯出類(子類)中重寫該方法可以是:Zi f(){}
注:返回值型別 Zi 繼承自 Fu -
派生類構造物件的初始化順序:
base.static{} //基態的靜態塊;
derieve.static{} //派生類的靜態塊
base.instance{} //基態的例項塊
base.init{} //基態的建構函式
derieve.instance{} //派生類的例項塊
derieve.init{} //派生類的建構函式
- (public)基類的資料成員在派生類當中的訪問許可權
型別 | 同包子類 | 同包非子類 | 不同包子類 | 不同包非子類 |
---|---|---|---|---|
public(公有) | y | y | y | y |
private(類訪問許可權) | n | n | n | n |
protected(繼承/包 訪問許可權) | y | y | y | n |
預設許可權(包訪問許可權) | y | y | n | n |
多型:基類引用了派生類的物件,並且基類和派生類有同名的覆蓋方法。
- class物件
- 位置:class物件放在方法區。class物件放的是當前類的資訊。
- 方法表:在編譯的時候生成的。
- 方法表和型別一一對應。class物件也和型別一一對應。並不是一個物件一個class物件。
- 靜多型:在編譯的時候確定。呼叫的是基態的fun
- 動多型: 在執行的時候確定。呼叫的是子類的fun
- 建構函式能否發生多型?可以。
- invokevirtual :(動多型)一種動態分派的呼叫指令:也就是引用的型別並不能決定方法屬於哪個型別。
- invokestatic :靜多型
- invokespecial:invokespecial只能呼叫三類方法:方法;private方法;super.method()。因為這三類方法的呼叫物件在編譯時就可以確定。