A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王龙彪 中级黑马   /  2012-8-6 00:28  /  1480 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package cn.heima;

  2. class A {
  3.     private static A a = new A();
  4.     private B b = B.getInstance();

  5.     private A() {
  6.     }

  7.     public static A getInstance() {
  8.         System.out.println("A.getInstance返回的a是:" + a);
  9.         return a;
  10.     }

  11.     public void test() {
  12.         System.out.println("A中test:a = "+ a);
  13.         System.out.println("A中test:b = "+ b);
  14.     }
  15. }

  16. class B {
  17.     private static B b = new B();
  18.     private A a = A.getInstance();

  19.     private B() {
  20.     }

  21.     public static B getInstance() {
  22.         System.out.println("B.getInstance返回的b是:" + b);
  23.         return b;
  24.     }

  25.     public void test() {
  26.         System.out.println("B中test:a = " + a);
  27.         System.out.println("B中test:b = " + b);
  28.     }
  29. }

  30. class Test {
  31.     public static void main(String[] args) {

  32.         A testa = A.getInstance();
  33.         B testb = B.getInstance();
  34.         System.out.println("==========");
  35.         testa.test();
  36.         testb.test();
  37.     }
  38. }
复制代码
打印结果是:
A.getInstance返回的a是:null
B.getInstance返回的b是:cn.heima.B@1fb8ee3
A.getInstance返回的a是:cn.heima.A@61de33
B.getInstance返回的b是:cn.heima.B@1fb8ee3
==========
A中test:a = cn.heima.A@61de33
A中test:b = cn.heima.B@1fb8ee3
B中test:a = null
B中test:b = cn.heima.B@1fb8ee3

问题是那个a 为什么是null 呢

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览

RE: static的问题

这是一个关于两个类的两个对象相互指向 和类的初始化顺序的问题。
当执行A testa = A.getInstance();时,先加载类A 执行A中静态成员a 先赋值为null(因为这时还没有执行到A的构造函数的),然后执行private B b = B.getInstance(); 。同理A的情况初始化B类。
是B中的 b为null ,当执行到B类中的private A a = A.getInstance();就打印了A.getInstance返回的a是:null ,并使B中的a为null(这里是为了说更清楚点,其实A类中的a和B中的a是一个对象实例)。
然后继续初始化B类执行B的构造函数。把B初始化完后,再执行了B中的getInstance方法,就打印了第二句。
再继续初始化A类(执行A的构造函数) 之后调用了A中的getInstance方法,从而打印了第三句。
而第四句是因为执行了主函数中的B testb = B.getInstance();而打印的。  
我个人认为这个程序主要考察的是类的初始化顺序的知识,但是又使这两个类个相互指向了。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马