日期:2014-05-20  浏览次数:20762 次

阿里笔试题 关于类的静态加载顺序 求高人解答
要求写出程序输出内容:


public class StaticTest {

public static int k = 0;
public static StaticTest t1 = new StaticTest("t1");
public static StaticTest t2 = new StaticTest("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");

{
print("构造快");
}

{
print("静态块");
}

public StaticTest(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}

public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
return ++n;
}
public static void main(String[] args) {
StaticTest t = new StaticTest("init");
}

}

jdk1.6下测试输出的内容如下:
1:j i=0 n=0
2:构造快 i=1 n=1
3:静态块 i=2 n=2
4:t1 i=3 n=3
5:j i=4 n=4
6:构造快 i=5 n=5
7:静态块 i=6 n=6
8:t2 i=7 n=7
9:i i=8 n=8
10:j i=9 n=99
11:构造快 i=10 n=100
12:静态块 i=11 n=101
13:init i=12 n=102

我一开始还没觉得复杂,后来越想月复杂,越想月糊涂,求指点
阿里 java 静态类

------解决方案--------------------
本来我是搞清楚的,又搞乱了,这贴顶上去
------解决方案--------------------
看到两道java题,当时就虚了,一道都不会做。。怎么破!
------解决方案--------------------
基本功不够扎实 这题肯定栽
------解决方案--------------------
首先我承认,第一遍做的时候我也做错了。
后来自己就加了多个断点不断的调试以及设计了多个实验。算是了解了一些吧。
同时也算是谢谢楼主了,这算是帮我学习了。
首先加载的顺序为:
先父类的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");也改为静态的。

如果说的不对,请大家指出。谢谢
------解决方案--------------------
果然我基础不行。我只能写出前两步。后面不知道怎么运行了。
------解决方案--------------------
我觉得这道题目的静态块,是不是应该这样

static {
    print("静态块");
}

因为,这样考点就基本全了~~~
------解决方案--------------------
类加载顺序:
 *  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了
------解决方案--------------------