那么A a1=A.getInstance(); A a2=A.getInstance();不就是两个了么??
一般是这样用 Class Afactory{ A a=null; public getA(){ if(A!=null){ a= new A(); return a; }else{ return a; } } }这样如果调用两次getA()的话实际上是一个对象有两个引用?
这样用的目的和结果是:保证系统中永远都只会有一个该类的实例,sun的教材称为(Singleton)单子模式,要使用这种模式实现保证对象的单一性的两个要点是1.getInstance()一定是static的,2.构造方法必须是private的,保证用户只能通过static方法getInstance()来取得该类的唯一实例,而不能通过常规的new XXX()来实例化,象这样的不论定义多少个引用, A a1=A.getInstance(); A a2=A.getInstance(); ……… …… …… … 它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。 第一次回答,不知道说明白了没有。
getInstance() 不完全是单子模式 你可以直接看JDK里面怎么写的
getInstance() 提供一个获得对象实例的统一方式,类似Factory的。最典型的是Calendar, 我贴部分代码如下 public static Calendar getInstance() { Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault()); cal.sharedZone = true; return cal; } private static Calendar createCalendar(TimeZone zone, Locale aLocale) { // If the specified locale is a Thai locale, returns a BuddhistCalendar // instance. if ("th".equals(aLocale.getLanguage()) && ("TH".equals(aLocale.getCountry()))) { return new sun.util.BuddhistCalendar(zone, aLocale); } // else create the default calendar return new GregorianCalendar(zone, aLocale); } 可见,getInstance 只是一种得到实例的方法而已,不一定都是singleton 模式
按照6楼的说法 它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。 第一次回答,不知道说明白了没有。 A a1=A.getInstance(); A a2=A.getInstance(); 如果我这么写的话,a1,a2实际上是同一个对象的不同引用,那么a1改变了,a2也跟着改变了,类似指针?
就是这个类只能有一个对象所以在getInstance方法里构造一个对象
返回的总是同一个对象。再一种可能处于设计考虑。
比如现在用spring就很少有new。
原因最好看一下设计模式的书。
我看过《设计模式》感觉不错。
A a2=A.getInstance();不就是两个了么??
Class Afactory{
A a=null;
public getA(){
if(A!=null){
a= new A();
return a;
}else{ return a;
}
}
}这样如果调用两次getA()的话实际上是一个对象有两个引用?
A a1=A.getInstance();
A a2=A.getInstance();
………
……
……
…
它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。
第一次回答,不知道说明白了没有。
你可以直接看JDK里面怎么写的
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
cal.sharedZone = true;
return cal;
} private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
} // else create the default calendar
return new GregorianCalendar(zone, aLocale);
}
可见,getInstance 只是一种得到实例的方法而已,不一定都是singleton 模式
它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。
第一次回答,不知道说明白了没有。
A a1=A.getInstance();
A a2=A.getInstance(); 如果我这么写的话,a1,a2实际上是同一个对象的不同引用,那么a1改变了,a2也跟着改变了,类似指针?
A1,A2,都是只是引用,而不是真正的对象,他们的共同点是,引用的对象是同一个,准确的说,是A1引用的对象改变了,意味着A2引用的对象也改变了,因为他们引用的是同一个对象,而你说的,A1改变,A2跟着改变的说法是有问题的,因为A1引用和A2引用 两个引用本身是没有关系的,比如A1,跑去引用NULL了,而A2,依然引用的是原来的那个对象,对象本身没有改变。引用的确类似于指针,它们存贮都是实际对象的内存地址,而不是对象本身,不知道说明白了没有。
A a1=A.getInstance();
A a2=A.getInstance(); a1.getValue=5;
a2.getValue=5;
a1.add(1);
a1.getValue=6;
a2.getValue=6;
楼上是不是这个意思??A a1=new A();
A a2=a1;
和上面说的是不是就是一致的?
把构造方法私有
用getInstance()来得到
保证只有一个对象的产生···
别的类要调用到它的话,只能用A.getInstance()来拿到它的对象··
不能用new