程序很简单:
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是空指针呢?跪求大神解释一下整个程序运行过程中到底发生了什么?
因为你把对象的初始化以静态的方式写了,所以不会每次调用都去new一下那个对象。这个涉及到了类的初始化顺序,其顺序是(静态变量、静态初始化块)>(变量、初始化块)>构造器,User类中调用构造方法前,已经提前调用了User01 u01=User01.getUser01();这句代码,因此会导致User01先输出。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。