/*
如何保证对象的唯一性: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);}
}