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

java一个笔试题目,求解释。
public class Test1 {
public static int k=0;
public static Test1 t1 = new Test1("t1");
public static Test1 t2 = new Test1("t2");
public static int i=print("i");
public static int n=99;
public int j=print("j");

{
print("构造快");
}
static {
print("静态快");
}
public Test1(String str) {
System.out.println((++k) + ":" + str +
"     i=" + i + "  n=" + n);
++i;++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str +
"     i=" + i + "  n=" + n);
++n;
return ++i;
}

public static void main(String[] args) {
Test1 t = new Test1("init");
}
}

为什么上题的输出结果是:

1:j     i=0  n=0
2:构造快     i=1  n=1
3:t1     i=2  n=2
4:j     i=3  n=3
5:构造快     i=4  n=4
6:t2     i=5  n=5
7:i     i=6  n=6
8:静态快     i=7  n=99
9:j     i=8  n=100
10:构造快     i=9  n=101
11:init     i=10  n=102
,请教各位。。。。。。。。。。
------解决方案--------------------
public class Test1
{
public static int k = 0;
public static Test1 t1 = new Test1("t1");
public static Test1 t2 = new Test1("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造快");
}
static
{
print("静态快");
}

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

public static int print(String str)
{
System.out.println((++k) + ":" + str + "     i=" + i + "  n=" + n);
++n;
return ++i;
}

public static void main(String[] args)
{
Test1 t = new Test1("init");
}
}

------解决方案--------------------
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
------解决方案--------------------
每天回帖加分 必须的 楼主加油
------解决方案--------------------
比较乱,我也是对这些比较模糊,那位大神给详细的讲解一下。
------解决方案--------------------
http://blog.csdn.net/ysjian_pingcx/article/details/19605335 自己看把
------解决方案--------------------
这都多少遍了

静态>实例

静态变量>静态快

实例变量>构造块>构造方法
------解决方案--------------------
考的是基础,楼主基础要打牢才能往高处发展。
------解决方案--------------------
程序在加载一个类的时候,分几步:
一,先找到该类,加载进内存;
二,把类里的静态成员初始化,并赋默认值,(基本类型为0,boolean 为false),引用类型为null;静态块分配空间,但是不执行内部代码
三,赋值初始值,执行静态块,块.
四,执行构造方法.

上面程序的执行顺序是这样的:
1.找到Text1,加载进内存
2.把类里的静态成员初始化,得到结果是
  k=0(这个0不是赋值的0,而是系统默认的0);t1=null;t2=null;i=0;n=0;静态块分配空间,但是不执行内部代码.
3.给静态成员赋值 
  k=0(这个0是赋值的0);t1=new Test("t1");
到这的时候,Test又new了一个对象,同样按照上面的步骤执行对t1的实例化(这有点像递归)
{
 1.找到Text1,加载进内存
 2....(注意,因为这里的静态成员已经在Test1分配到内存了,因为静态成员只加载一次,所以这里不会再给静态成员赋值)
 4.到了j,因为j不是静态的,所以j是属于t1的,这个时候,给j赋值,就要执行j的print方法了,所以会先输出t1的print("j");
   1:j     i=0  n=0
 5.赋值完后,开始代码.先是静态块(这里的静态块在Test中已经分配内存了,因为静态成员只加载一次,所以这里不会执行静态块),然的是块(这个块属于t1,所以会执行){print("构造快");}
   输出 2:构造快     i=1  n=1; 
 6.接着构造方法
   输出 3:t1     i=2  n=2
}
t2同t1地样实现,所以接着输出
 4:j     i=3  n=3
 5:构造快     i=4  n=4
 6:t2     i=5  n=5
这个时候Test的赋值到了i,执行t的print("i");
 接着输出 7:i     i=6  n=6
然后n=99;然后是j的print("j");接着是静态块,然后是Test的块,最的构造方法.

这里需要注意的是,静态的只加载一次,但为什么在t1,t2的时候不输出静态块的内容,而在Test中输出呢,原因是静态块在Test1时已经加载了,但是没有初始化,初始化的步骤是在Test中进行的,而t1和t2中根本就没有加载该静态块,更谈不上初始化了.

参考资料 http://www.cnblogs.com/alexlo/archive/2013/03/05/2944573.html