阿里笔试题 关于类的静态加载顺序 求高人解答
要求写出程序输出内容:
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题,当时就虚了,一道都不会做。。怎么破!
------解决方案--------------------基本功不够扎实 这题肯定栽
------解决方案--------------------首先我承认,第一遍做的时候我也做错了。
后来自己就加了多个断点不断的调试以及设计了多个实验。算是了解了一些吧。
同时也算是谢谢楼主了,这算是帮我学习了。
首先加载的顺序为:
先父类的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了
------解决方案--------------------