2 sinat 28050007 sinat_28050007 于 2016.03.09 14:46 提问

java单例初始化为什么不一直循环初始化的问题

程序很简单:

 public class User {
    static User u=new User();
    public static User getUser(){
        return u;
    }

    User01 u01=User01.getUser01();

    public User(){
        System.out.println("User新建一次");
    }

}

public class User01 {
     static User01 u01=new User01();
    public static User01 getUser01(){
        return u01;
    }

    User u=User.getUser();

    public User01(){
        System.out.println("User01新建一次");
    }
}

public class Test {
    public static void main(String[] args) {
        User u=User.getUser();
        User01 u01=User01.getUser01();
            System.out.println(u.u01);
        System.out.println(u01.u);
    }
}

接着我运行test的main函数,得到结果如下:
User01新建一次
User新建一次
User01@40ac8360
null

为什么会有这个结果?为什么没有循环地一直初始化下去呢?为什么最后的u01.u是空指针呢?跪求大神解释一下整个程序运行过程中到底发生了什么!

4个回答

menghuanmusic
menghuanmusic   2016.03.09 14:59
已采纳

因为你把对象的初始化以静态的方式写了,所以不会每次调用都去new一下那个对象。

menghuanmusic
menghuanmusic 回复sinat_28050007: 这个涉及到了类的初始化顺序,其顺序是(静态变量、静态初始化块)>(变量、初始化块)>构造器,User类中调用构造方法前,已经提前调用了User01 u01=User01.getUser01();这句代码,因此会导致User01先输出。
2 年多之前 回复
menghuanmusic
menghuanmusic 回复sinat_28050007: 因为User01 u01=User01.getUser01();这句。你把这个注释了。就好了。
2 年多之前 回复
sinat_28050007
sinat_28050007 那为什么先输出的是User01新建一次呢?不应该是User新建一次先输出么?
2 年多之前 回复
xionglangs
xionglangs   Rxr 2016.03.09 14:50

你这个是单例,不是吧,单例最起码要构造发放私有法。

sinat_28050007
sinat_28050007 是要私有化,我这只是简化问题
2 年多之前 回复
xionglangs
xionglangs 构造方法
2 年多之前 回复
zhengnan110
zhengnan110   2016.03.09 23:12

user在加载的过程中进入user01,所以user01中的u是null。
先输出user01的原因是:在使用user类是会优先加载静态成员,你的静态成员new了user对象,新建对象后首先会加载其成员变量,然后才进入构造方法。所以new user01执行完了,才会执行user的构造方法。

sinat_28050007
sinat_28050007 user在加载的过程中进入user01,所以user01中的u是null。这个因为所以有点唐突~~~~
2 年多之前 回复
sinat_28050007
sinat_28050007   2016.05.06 00:14

关于这个问题的回答,我的博客的“java初始化小结讲得很清楚”

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
单例模式中静态变量初始化与不初始化有什么区别?
单例模式中静态变量初始化与不初始化有什么区别?  public class Singleton {  private static Singleton obj = new Singleton();  public static int counter1;  public static int counter2 = 0;  private Singleton(){  counter1++
Python单例模式的问题
1.Python利用新式类可以使用单例模式,重复申城dui
关于单例对象的初始化
一般情况下对象的初始化会写在构造函数中,但是使用singleton
单例模式中静态类成员变量初始化问题
最近做一个项目,C++语言,使用到了单例模式做设计。在具体编写代码时,使用了静态成员变量和静态函数。代码如下: class Camera { private: //(省略若干代码) static Camera* pCamera ; //(省略若干代码) public: //(省略若干代码) static Camera* getInstance() { if(p
Java学习笔记(注释、对象初始化过程、单例模式)
面向对象9.帮助文档的制作9.1注释- 原则: 1、注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范。 2、注释内容准确简洁 内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。 - 注释格式: 1. 单行(si
单例和只初始化一次
class Dog(object):     __first_new = True     __instance = None     __first_init = True     # 完成了单例     def __new__(cls, new_name):         if cls.__first_new:             cls.__instanc
iOS 初始化单例
// 初始化单例方法 + (instancetype)shareManager { static Manager *manager = nil; static dispatch_once_t oneToken; // dispatch_once 是线程安全的,能够做到在多线程的环境下Block中的代码只会被执行一次 dispatch_once(&oneTo
单例模式---饿汉式(类初始化的时候实例化)
 /**  *  */ package cn.thcic; /**  * 饿汉式(类初始化的时候实例化)单例模式  *  * by Zhiwang Zhang on 2014年7月18日  */ public class Test102 {  // 私有的静态的本类常量  private static final Test102 INSTANCE = new Tes
c++11单实例(singleton)初始化的几种方法(memory fence,atomic,call_once)
单实例模式(singleton)下要求一个类只能有一个实例,如何保证只创建一个实例?类的静态成员延迟初始化要求静态成员只能被初始化一次,也有类似的问题。 在单线程环境下,这事儿很好办。Singleton* Singleton::getInstance() { if (m_instance == nullptr) { m_instance = new Singleton;
带参数的单例模式遇到的问题
今天使用带参数的单例模式的时候遇到一个问题,先看代码: private APTest(Context c) { mContext = c; } public static APTest singleton(Context context) { synchronized (lock) { if(gInstance == null) { gInstance = new