解决方案 »

  1.   

    看到两道java题,当时就虚了,一道都不会做。。怎么破!
      

  2.   

    首先我承认,第一遍做的时候我也做错了。
    后来自己就加了多个断点不断的调试以及设计了多个实验。算是了解了一些吧。
    同时也算是谢谢楼主了,这算是帮我学习了。
    首先加载的顺序为:
    先父类的static成员变量-》子类的static成员变量-》父类的成员变量-》父类构造-》子类成员变量-》子类构造
    也就是说最先被加载的是所有static申明的成员变量,之所以被申明为静态,特点就是共享,即使实例化多个对象,但是是共用一个static声明的变量的。
    也就是说,首先所有的static被载入,但是还未执行,下一步开始执行,自上而下,首先执行完第一行之后执行public static StaticTest t1 = new StaticTest("t1"); 
    实例化这个对象的时候,由于静态的已经被载入,所以就直接执行
    public int j = print("j"); 这一句,然后执行
    {         print("构造快");     }           {         print("静态块");     } 
    最后执行构造函数,
    然后实例化t2,
    最后实例化对象。做几个例子测试出该效果,推出什么原理大家自己理解吧。
    第一个,public static StaticTest t1 = new StaticTest("t1");改为
    public StaticTest t1 = new StaticTest("t1");  
    结果:加载出错
    第二个,把public int j = print("j");也改为静态的。如果说的不对,请大家指出。谢谢
      

  3.   


    看了你的分析,然后自己顺着理了一便,慢慢明白起来了,分析的蛮有道理。 
    其实{ print("静态块")}前面有个“static” 忘了写了,不然也不能说是静态块,粗心了。
    还有一个知识点就是关于向前引用的问题,像结果中n开始为什么会0,后面有变为99。这个可以参考一下:
     http://androidguy.blog.51cto.com/974126/1230298
      

  4.   

    我觉得这道题目的静态块,是不是应该这样static {
        print("静态块");
    }因为,这样考点就基本全了~~~
      

  5.   

    类加载顺序:
     *  1.加载类的静态属性(非静态不管)
     *  这里加载的是:public static int k = 0;
     *  然后加载:public static StaticTest t1 = new StaticTest("t1");
     *  因为此处进行了类的实例化所以
     *  1.1加载类的非静态属性
     *  这里是:public int j = print("j");
     *  运行完这个方法接着
     *  1.2顺序加载类中的非static代码块(static暂时不加载)
     *  这里是:print("构造快");和print("静态块");
     *  运行完接着
     *  1.3加载类的构造方法
     *  这里是:public StaticTest(String str)
     *  运行完(一个静态属性的实例就完成了)
     *  2.继续加载类的静态属性
     *  这里加载的是:public static StaticTest t2 = new StaticTest("t2");
     *  2.1重复(1.1-1.3)
     *  3.继续加载类的静态属性
     *  这里加载的是:public static int i = print("i");
     *  运行完接着
     *  4.继续加载类的静态属性
     *  这里加载的是:public static int n = 99;
     *  不管你n原来是多少现在为99
     *  接着
     *  5.(如果有static代码块,在这里先加载,这个里面没有所以加载主函数)加载主函数
     *  这里加载的是:StaticTest t = new StaticTest("init");
     *  因为此处进行了类的实例化所以
     *  5.1
     *  重复1.1-1.3
     *  5.2
     *  因为public static int print(String str)这个方法返回++n
     *  所以n从99开始累加
     *  运行完OK了
      

  6.   

    对的,粗心大意了,应该有static的,谢谢指正。
      

  7.   

    原题是有static关键字的,我粗心忘写了,谢谢指正。
      

  8.   

    感谢楼主的问题,让自己又巩固了一下知识!安顺序之行代码!当程序执行到创建静态对象t1的时候,创建一个t1对象!创建t1对象时之行public int j,不会之行public static int i,因为静态变量属于类,不属于对象!
      

  9.   

    估计LZ没仔细看过think in java,上面的例子比这个更复杂
      

  10.   


    我有个疑问.
    static被载入时,int值应该为空吧.
    运行到创建t1的实例时,还没有运行static i的初始化代码吧? 
    为什么创建t1实例的时候,可以直接做i++?
      

  11.   


    我有个疑问.
    static被载入时,int值应该为空吧.
    运行到创建t1的实例时,还没有运行static i的初始化代码吧? 
    为什么创建t1实例的时候,可以直接做i++?
    这和java的向前引用有关,可以看看这篇文章:
    http://androidguy.blog.51cto.com/974126/1230298
      

  12.   

    请看http://blog.csdn.net/hyl713/article/details/11925071
      

  13.   

    很不错,转换后的class更容易理解
      

  14.   


    这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 
      

  15.   

    很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。
    你看完我写的,就明白了 ... 
      

  16.   

    很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。
    你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~
      

  17.   

    很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。
    你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~呵呵,如果说第一个,那就 ... 哈哈 !
      

  18.   

    很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。
    你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~呵呵,如果说第一个,那就 ... 哈哈 !其实,这道题目,主要是因为第二个static语句,再次调用了该类的构造函数,使得给大家一些误区了。
      

  19.   


    这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 大哥,日至在哪呢?进不去呢
      

  20.   


    这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 大哥,日至在哪呢?进不去呢由于楼主评分完毕,更悲剧的是,他根本没进我的帖子看,于是,我关掉了访问权限!sorry!
    加个Q,我告诉你:1078577864
      

  21.   

    这里面有一个递归初始化的过程,可以参考JLS初始化那块的内容
    大概意思是说,可能会有多个进程执行初始化,因此初始化过程是同步的。
    这个题目里面可以看到有一个递归初始化过程。
    JLS上面说,当一个进程企图初始化时,首先需要acquire一把锁,这道题实行static对象的初始化时,是获得了这把锁的,但是当前进程会发现这个类正在初始化,而且是当前进程发起的,所以只要release LOCK and complete,效果就是,当前进程以为静态块都加载完了,接下来该轮到instance variable initializer,然后是instance initialization block,然后是construct部分,OK,第一个静态对象加载完成。记得CSDN上某位大神说把static去掉就会StackOverflowError,因为如果不是静态的话会一直递归的初始化下去。
    第二个静态对象执行过程和第一个类似。
    这时候还是执行到static int i = print("i");了,这时会答应i的语句
    i已经搞定,现在可以到static block了,剩下的过程都好理解了。。
      

  22.   

    http://bbs.csdn.net/topics/390705686?page=1#post-396796266
    23楼。有注释你去看看去