單利模式以及繼承和多型
阿新 • • 發佈:2018-11-02
一丶單利模式
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();