java类加载的疑问

e3e4p 2010-11-09 05:06:32
public class SingletonTest {

private static SingletonTest singleton = new SingletonTest();

private SingletonTest(){
System.out.println("构造函数调用。。。");
}

public static SingletonTest getInstance(){
return singleton;
}

public static void main(String[] args) {
SingletonTest single = SingletonTest.getInstance();
SingletonTest single2 = SingletonTest.getInstance();
System.out.println(single == single2);
}
}



上面这段代码,输出结果为:

构造函数调用。。。
true

但是不明白,类加载首先加载静态变量,明明两个对象是new了两次,为啥构造函数只调用了一次呢,求解
菜鸟,对类加载不太明了,期待高手指点,谢过了。。。
...全文
100 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
holly2k 2010-11-09
  • 打赏
  • 举报
回复
在java很多书籍里都有写到,某一个类的静态变量,对于该类的任一实例都只会拥有同一个指向对象,因为你的静态变量不是后期实例化的,因此该静态变量的实例将在该类被加载的时候进行,而且只进行一次,以后无论是否该类再调用构造方法进行初始化, 其静态域也只会指向一个对象,LZ调用两次getInstanse方法都只是返回同一个在类加载时便被实例化的对象,LZ试试将main里面的内容全部去掉,你还是会打印出"构造函数调用。。。"字样,那是因为该构造方法是在加载类的时候执行的
lost_guy_in_scut 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 meiyoudao 的回复:]

只new了一次. 这是单例. new了之后,如果你还要使用的话,就不会new了. 这就是单例
[/Quote]
嗯嗯。单例模式。
龙心 2010-11-09
  • 打赏
  • 举报
回复
建议楼主去看一看thinking in java,一本不错的java书,里面讲得很详细。
liukelin 2010-11-09
  • 打赏
  • 举报
回复
楼主的这是饿汉式的单例设计模式,看看这个就会明白了
智鹿软件 2010-11-09
  • 打赏
  • 举报
回复
static的东西属于类而不属于对象,这个类的所有对象共享一份实例
ChDw 2010-11-09
  • 打赏
  • 举报
回复
这里类只加载了一次,所以只会初始化一个对象
OopsJeff 2010-11-09
  • 打赏
  • 举报
回复
只new了一次. 这是单例. new了之后,如果你还要使用的话,就不会new了. 这就是单例
sunyiz 2010-11-09
  • 打赏
  • 举报
回复
之所以你的这段程序还能调用到一次构造方法
完全是因为你写了
private static SingletonTest singleton = new SingletonTest();
这叫变量声明(可以同时初始化)
JAVA程序执行时,会把main方法所在类的变量声明部分全部执行的
sunyiz 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 e3e4p 的回复:]
那当我第二次调用getInstance方法的时候,是直接返回一个实例,这个实例是哪里来的呢?[/Quote]
private static SingletonTest singleton
就是靠的这一半声明来的
你在类中声明了一个对象

getInstance返回给你的就是这个对象
至于这个对象有没有实例化,那getInstance可不管

楼主你把第一行改成
private static SingletonTest singleton;
试试就明白了

就是没有实例化,它也一样返回给你
e3e4p 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunyiz 的回复:]
private static SingletonTest singleton = new SingletonTest();
明明只有一个new嘛,所以只调用了一次构造方法啊

SingletonTest single = SingletonTest.getInstance();
SingletonTest single2 = SingletonTest.getInstance();
这是……
[/Quote]
SingletonTest single = SingletonTest.getInstance();
是不是类加载只做一次,所以
private static SingletonTest singleton = new SingletonTest();只执行一次,
静态变量也只加载一次?
e3e4p 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunyiz 的回复:]
private static SingletonTest singleton = new SingletonTest();
明明只有一个new嘛,所以只调用了一次构造方法啊

SingletonTest single = SingletonTest.getInstance();
SingletonTest single2 = SingletonTest.getInstance();
这是……
[/Quote]
那当我第二次调用getInstance方法的时候,是直接返回一个实例,这个实例是哪里来的呢?
houjin_cn 2010-11-09
  • 打赏
  • 举报
回复
哪里new了两次?
搜遍了也只有一个new:
private static SingletonTest singleton = new SingletonTest();
sunyiz 2010-11-09
  • 打赏
  • 举报
回复
private static SingletonTest singleton = new SingletonTest();
明明只有一个new嘛,所以只调用了一次构造方法啊

SingletonTest single = SingletonTest.getInstance();
SingletonTest single2 = SingletonTest.getInstance();
这是静态方法的调用、调用静态方法不会调用构造方法的

如果你的类的开头没有写
private static SingletonTest singleton = new SingletonTest();
而是
private static SingletonTest singleton = null;
的话,你这个程序连一次构造方法都不会调用到

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧