饿汉式实例化问题?

饿汉式实例化问题?

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赋对象引用的时候才第一次调用私有构造方法?

疑惑很大,谢谢了先

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

你需要清楚static的初始化过程以及类加载过程。

1、static变量的初始化,它只能初始化一次,如果前面已经初始化过了,那么再用到时就不必要再初始化了。

2、类加载是将字节码class文件加载到jvm中或者说到内存中的过程,而不是执行任何的方法和属性,包括构造,构造方法只是在new的时候去执行。

  • 飞翔的小马哥 提问者 #1
    一下发现我问题所在,谢谢老师,还有一个问题,我这一个语句: one = Earth.getInstance(); 当我执行这个语句时,在Earth类里执行语句的顺序是什么? 希望能说的详尽一些,还是先谢谢了
    2017-08-20 23:29:24
  • irista23 回复 提问者 飞翔的小马哥 #2
    在Earth这个类被加载时,静态变量instance已经实例化,此时类的私有构造方法就会被调用,这时单例类的唯一实例对象就被创建出来。当调用getInstance()时返回实例对象给one。
    2017-08-21 11:24:00
  • 飞翔的小马哥 提问者 #3
    非常感谢!
    2017-08-22 08:58:36
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师