1. 程式人生 > >單利模式以及繼承和多型

單利模式以及繼承和多型

一丶單利模式
1丶單利類只能有一個例項
2丶單利類必須建立自己的唯一例項
3丶單利類必須給所有其它物件
4丶單利模式必須提供一個全域性的訪問點
(1)惡漢式單利模式

class MySingleTon{
    private static MySingleTon singleTon = new MySingleTon();
    //定義一個static型別的變數,只初始化一次
    private MySingleTon(){//私有化建構函式
        System.out.println("建構函式");
    }
    public static MySingleTon getInstance
(){//提供一個全域性訪問點 return singleTon; } }

(2)懶漢式單利模式`

class SingleTon{
    private static SingleTon2 singleTon = null;
    private SingleTon(){
        System.out.println("建構函式");
    }
    private static SingleTon getInstance(){
                if (singleTon == null){//當singleTon為空時,new一個物件
singleTon = new SingleTon(); } return singleTon; }

這種設計在多執行緒時不能保證執行緒安全,因為當一個執行緒還沒有建立完成時又進入一個執行緒,等於new了兩次物件,所以我們對它作出如下改進:

class SingleTon{
    private static Object lock = new Object();//定義一個父類為Objectd的lock變數
    private static SingleTon singleTon =
null; private SingleTon(){ System.out.println("建構函式"); } //可重入函式,即執行緒安全的函式 private static SingleTon getInstance(){ //臨界區程式碼段 if(singleTon == null){//雙重檢驗 synchronized (lock){//原子性操作 if (singleTon == null){ singleTon = new SingleTon(); } } } return singleTon; }

二丶繼承與多型
(1)繼承:繼承是重用現有類(基類base class、父類parent class、超類super class)建立新類(子類sub class、派生類derived class)的過程,派生類繼承了基類除建構函式外的所有屬性。

class Person{
    private String name;
    private String sex;
    public Person(String name,String sex){
        this.name = name;
        this.sex = sex;
        System.out.println("建構函式");
    }
    public void fun1(){
        System.out.println("This is Person.fun1");
    }
}
class Student extends Person{
    private int number;
    public Student(String N,String S){
        super(N,S);//super關鍵字,對當前物件父類的引用,必須寫在子類建構函式的第一行
        this.number = 001;
    }
    public void fun1(){
        System.out.println("This is student.fun1");
    }
}

super();—>呼叫基類的建構函式
super.data—>訪問基類的資料成員
super.func();—>呼叫基類的成員方法
(3)基類的資料成員在派生類當中的訪問許可權(1表示可以,0表示不可以)
在這裡插入圖片描述
多型
(1)動多型(執行時多型)
在這裡插入圖片描述
輸出結果:

(2)靜多型(編譯時多型),方法覆蓋表現出兩種多型性,當物件引用本類例項時,為編譯時多型,否則為執行時多型。

        Student student = new Student(" "," ");
        System.out.println(person.toString());//編譯時多型,執行Person類的toString()方法
        System.out.println(student.toString());
        person.fun1();