我写了一段代码:
public class Child{
int y ;
private static final int z = getZ();
static {
System.out.println("The value of z is "+z);
}
public int getX(){
System.out.println("get x");
return 10;
}
public int getY(){
Child ch = new Child();
System.out.println("get y");
ch.y = getX();
return y;
}
public static int getZ(){
System.out.println("get z");
return new Child().getY();
}
public Child(){
System.out.println("Child constructor");
}
public static void main(String...args){
Child ch = new Child();
System.out.println("the value of z in main is "+z);
}
}
输出是:
得到z
儿童建设者
儿童建设者
得到你
得到x
z的值为0
儿童建设者
main中z的值为0
有人可以解释一下为什么z的值是0而不是10?
编辑: - 谢谢大家,我得到了第一个问题的答案。我仍然有一个疑问,据我所知,静态块是在加载类之后以及在实例化类的第一个对象之前执行的。那么SOP(" z的值是" + z)应该在SOP之前执行(" Child构造函数")!是啊?
答案 0 :(得分:7)
看看getY():
public int getY(){
Child ch = new Child();
System.out.println("get y");
ch.y = getX();
return y;
}
前三行无关紧要 - 它们不会更改此实例中y
的值,这是返回的内容。
你在坦率的意大利面条代码中创建了大量无意义的对象,在初始化你正在构造实例的同一个类时被调用。我建议你尝试让你的代码 lot 比这更简单。应该尽可能避免使用静态初始化器,更不用说那些遍布房屋的人不做任何有用的工作。
答案 1 :(得分:5)
因为getY()
将ch.y
设置为10,但会返回this.y
的值。
答案 2 :(得分:2)
在GetY中你返回this.y,它永远不会被设置。
答案 3 :(得分:2)
在getY()上,您返回了未初始化的y变量,而不是Child ch实例。
答案 4 :(得分:1)
因为在getY()方法中你正在构造一个新的CHild对象,你正在为变量y的那个实例赋值10,当你返回y时,它将是当前的实例变量y。 我希望它能解释一下。
答案 5 :(得分:0)
在第二点,静态字段和静态块按文本顺序初始化/执行。
例如:
public class StaticTest()
{
static
{
System.out.println("s1 in block 1 :" + s1);
}
private static String s1 = "s1";
static
{
System.out.println("s1 in block 2 : " + s1);
}
public static void main(String args[])
{
new StaticTest();
}
}
这个输出将是 -
块1中的s1:
块2中的s1:s1