饿汉式实例化问题?
public class Earth { //定义私有构造方法,并在构造方法中打印输出“地球诞生” private Earth(){ System.out.println("地球诞生"); } //定义私有静态类对象并完成实例化 private static Earth instance=new Earth(); //定义公有静态方法返回类内的私有静态对象 public static Earth getInstance(){ return instance; } } public class Test { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("第一个地球创建中。。。。"); Earth one; one = Earth.getInstance();//此处设置了一个断点,程序在执行完此步内的构造方法后才会输出地球诞生 System.out.println("第二个地球创建中。。。。"); Earth two; two = Earth.getInstance(); System.out.println("第三个地球创建中。。。。"); Earth three; three = Earth.getInstance(); System.out.println("问:三个地球是同一个么?"); System.out.println(one); System.out.println(two); System.out.println(three); } }
如上代码所示,第一次实例化对象时候,程序进入Earth类中会执行私有的构造方法,然后再去公有的静态方法中返回本类中的实例化对象,对第二个对象实例化的时候,程序直接执行公有的静态方法返回本类的实例化对象了,并没有执行私有的构造方法,为什么?
而且我还有一个问题,既然我在Earth中创建的本类对象是static的,所以在类加载的时候就应该执行,那么类加载的时候就应该有earth对象的实例化了,也就是说再类加载的时候就调用私有构造方法了,那为什么我在Test类中给one赋对象引用的时候才第一次调用私有构造方法?
疑惑很大,谢谢了先
98
收起
正在回答
1回答
你需要清楚static的初始化过程以及类加载过程。
1、static变量的初始化,它只能初始化一次,如果前面已经初始化过了,那么再用到时就不必要再初始化了。
2、类加载是将字节码class文件加载到jvm中或者说到内存中的过程,而不是执行任何的方法和属性,包括构造,构造方法只是在new的时候去执行。
Java零基础入门18
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星