1. 程式人生 > >java基礎-單利模式/繼承/多型

java基礎-單利模式/繼承/多型

單利模式: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()。因為這三類方法的呼叫物件在編譯時就可以確定。