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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王程 中级黑马   /  2012-8-6 15:35  /  1760 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class A
  2. {
  3.    private static A a = new A();

  4.    private B b = B.getInstance();

  5.    private A(){}

  6.   public static A getInstance()
  7.   {
  8.     System.out.println("A被调用");
  9.     return a;
  10.   }

  11.   public void test()
  12.   {
  13.   System.out.println(b);
  14.   }
  15. }


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

  19.   private A a = A.getInstance();

  20.   private B(){}

  21.   public static B getInstance()
  22. {
  23.    System.out.println("B被调用");
  24.    return b;
  25. }

  26.   public void test()
  27.   {
  28.     System.out.println(a);
  29.   }
  30. }


  31. class Test
  32. {
  33.    public static void main(String[] args)
  34.    {
  35.      B b = B.getInstance();
  36.      b.test();
  37.      System.out.println("==========");
  38.      A a = A.getInstance();
  39.     a.test();
  40.   }
  41. }
复制代码
个人认为程序的运行结果是:
B被调用
A类的哈希值
=======
A被调用
B类的哈希值

但是程序运行结果是
B被调用
A被调用
B被调用
A@35ce36
==========
A被调用
null


不知道刚开始的两个输出语句怎么来的,还有最后一个null怎么来的,希望高手解答

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

4 个回复

倒序浏览
这个程序运行过程是这样的,首先在主函数中按顺序得执行B类中的程序,所以首先是“B被调用”而后的return b;返回到了A类中b的实例对象(private B b = B.getInstance(); ),所以就开始执行A类中的程序,所以第二行打印的是“A被调用”,而后的return a;返回到B类中a的实例对象(private A a = A.getInstance();),所以就执行b类则第三行打印的是“B被调用”,接着就开始执行B类中test方法,所以就打印了a的哈希值,这个程序的方法就出栈了,B类里的内存就释放掉了,按主函数的顺序第五航就打印了“=====”紧接着就执行A类中方法,所以第六行打印的就是“A被调用,然后执行return a,在这里用说明一下因为刚才B类执行完内存就已释放掉了,所以里面方法就会空了,当它返回给B类中a的实例对象,因为里面为空所以最后打印结果就是null。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
我把楼主的程序改动了一下,可是运行结果还是看不懂,希望楼上给解释一下
class A
{
        private static A a = new A();

        private B b = B.getInstance();

        private A()
        
        {
                System.out.println("A构造函数");
        }
        
        public static A getInstance()
        {
                System.out.println("A被调用");
                return a;
    }

}
class B
{
        private static B b = new B();
        
        private A a = A.getInstance();

        private B(){System.out.println("B构造函数"); }
        
        public static B getInstance()
        {
                System.out.println("B被调用");
                return b;
        }
}
class Test
{
        public static void main(String[] args)
        {
                B b = B.getInstance();
   
        }
}
回复 使用道具 举报
关于第一个问题,你在类的构造函数前加了private私有化后是不能在被其他类new 对象的,而去掉private后可以编译通过,
但是运行后应该是内存出错,创建了A的对象,A又创建B的对象,都互相调用了,下面是打印的结果at B.<init>(Test.java:17)
                                                                                                                                                                                at A.<init>(Test.java:12)
                                                                                                                                                                                at B.<init>(Test.java:17)
                                                                                                                                                                                at A.<init>(Test.java:12)
                                                                                                                                                                                。。。。。。。。
至于第二个问题,可将主函数的内容一句一句的运行,看打印结果
class Test
{
        public static void main(String[] args)
        {
                B b = B.getInstance();
                //b.test();
                //System.out.println("==========");
                //A a = A.getInstance();
                //a.test();
        }
}
将后面几句话注释后结果为
B被调用
A被调用
B被调用
class Test
{
        public static void main(String[] args)
        {
                //B b = B.getInstance();
                //b.test();
                //System.out.println("==========");
                A a = A.getInstance();
                //a.test();
        }
}
将前面几句话注释掉后打印结果为
A被调用
B被调用
A被调用
由此可见运行B b = B.getInstance()与A a = A.getInstance() A类与B类都会双方调用一次分别产生a的对象与b对象,
当内存中有了a与b对象后就不会产生新的对象了,因为对象是唯一的,所以A a = A.getInstance()只调用了不会产生新的对象了,我花了不少时间还没完全搞懂,这个问题挺复杂的。
回复 使用道具 举报
黑马-唐磊 发表于 2012-8-6 18:32
这个程序运行过程是这样的,首先在主函数中按顺序得执行B类中的程序,所以首先是“B被调用”而后的return b ...

为什么会将实例对象b返回到A类中去呢,而且还会执行A类中的程序,然后又从A类中返回a对象到B类中呢,这个过程到底是怎么执行的啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马