/*
如何保證對象的唯一性:1.不允許其他程序用new來創建該類對象。2.在該類創建一個本類實例。3.對外提供一個方法讓其他程序可以獲取該對象的引用。
*/
public class Test{public static void main(String[] args){//Subject sub = Subject.oSub;//這種方法不可控,一般不訪問成員Subject sub = Subject.getInstance();//我們可以在方法中增加條件,根據條件是否返回對象的引用,增加程序的可控性!new Student().show(sub);new Teacher().show(sub);}
}class Subject{public String sub;public static Subject oSub = new Subject();private Subject(){sub = "計算機科學與技術";}public static Subject getInstance(){//oSub = new Subject();//if(****) 增加 if 判斷 可以 增加程序的可控性return oSub;}public String getSubject(){return sub;}public void setSubjcet(String name){sub = name;}
}/*靜態成員變量和普通成員變量的顯示初始化的不同之處:以下面的例子為例:靜態變量的顯示初始化編譯之后不會放進 構造函數中!(想一想啊,如果放進了構造函數中,那不就是產生對象了嗎?那可能嗎?它是靜態的,是屬于類的!普通成員變量是屬于對象的,所以顯示初始化會放進構造函數中)所以不會使構造函數一直調用,最終棧溢出而普通成員變量的顯示初始化編譯之后回放進構造函數中, 這樣就會導致構造函數一直被反復調用!class Subject{public String sub;//public Subject ss = new Subject();public static Subject oSub = new Subject();//惡漢式//public static Subject oSub = null;//懶漢式private Subject(){//oSub = new Subject();//oSub是靜態變量,加上這一句就會導致oSub顯示初始化時棧溢出!sub = "計算機科學與技術";}public static Subject getSubject(){ return oSub;//return oSub = new Subject();}
}
*/class Student{public void show(Subject sub){System.out.println(sub.sub);}
}class Teacher{public void show(Subject sub){System.out.println(sub.sub);}
}