我们的一道作业题:编程证明类的字段是否比类的构造方法先生成。
本人想的是,在类中写个public static的字段,并初赋值。再写个构造方法,方法内对该字段进行修改。在main方法内,不创建对象,直接输出字段的值,如果值没有改变,说明构造方法先生成,如果字段改变了,说明字段先生成。
但是个人觉得这种方法并不可行,希望大家给点帮助。
[b]
这样是否更具有说服力?[/b]
[code="java"]public class T {
T() {
if (check == null) {
check = "world";
}
if ("Hello".equals(check)) {
System.out.println("字段先于构造方法产生");
} else if ("world".equals(check)) {
System.out.println("构造方法先于字段产生");
} else {
System.out.println("Confused");
}
}
String check = "Hello";
public static void main(String args[]) {
new T();
}
}[/code]
试试这样??
[code="java"]public class T {
String check = "Hello";
T() {
if ("Hello".equals(check)) {
System.out.println("字段先于构造方法产生");
} else {
System.out.println("构造方法先于字段产生");
}
}
public static void main(String args[]){
new T();
}
}[/code]
不是吧,我想楼上的代码看似有道理,实际上应该不能出现LZ想要的正确的结果,当它加载构造方法的时候,发现了check这个变量,就会在该类中查找并加载它,我记得Java核心技术一中是这样说的,在加载时,先是静态代码块,然后是非静态的,在方法与属性的加载中,先是方法,然后才是属性。所以Java代码规范中一个类的规范写法中有一点是这样说的:先定义方法,后属性。解释(根据书中意思,按自己的语言描述):避免加载并非用到的Java代码块。。。
[b]这样会不会更好??[/b]
[code="java"]public class T {
T() {
System.out.println("构造方法");
}
Nothing check = new Nothing();
public static void main(String args[]) {
new T();
}
}
class Nothing {
Nothing(){
System.out.println("字段在初始化时,要用到");
}
}[/code]
臧圩人的这么经典的帖子你不看是你的损失:
JAVA面试题解惑系列(一)——类的初始化顺序http://zangweiren.iteye.com/blog/208122