很简单,程序是按顺序执行的,在执行peek()的时候,j=1还没被执行,所以就返回0的结果。 如果将类Z修改如下: class Z { static int j = 1; static int peek() { return j; } static int i = peek(); } 输出结果就是1了,因为这回事j=1先执行。
类的初始化顺序:父静子静,父构子构 这样也输出1 int peek() { return j; } int i = peek(); //静态的先初始所以int peek() { return j; } j==1 static int j = 1;
这个涉及到类装载时的初始化顺序 首先将所有的声明的值域赋值成default(即0, false, or null). 然后再执行值域的显示初始化动作和初始化块的执行 那么来看看执行顺序 1.i,j被赋值为0 2.初始化i,而i=peek();调用peek方法返回j,而此时j的值是0(还未执行显示初始化) 3.初始化j,此时j才=1如果调用Z.Peek()那么结果就是1不错的问题~我以前也搞不明白呵呵,后来研究了他的初始化的动作就明白了~
如果将类Z修改如下:
class Z {
static int j = 1;
static int peek() { return j; }
static int i = peek();
}
输出结果就是1了,因为这回事j=1先执行。
类的初始化顺序:父静子静,父构子构
这样也输出1
int peek() { return j; }
int i = peek();
//静态的先初始所以int peek() { return j; } j==1
static int j = 1;
首先将所有的声明的值域赋值成default(即0, false, or null).
然后再执行值域的显示初始化动作和初始化块的执行
那么来看看执行顺序
1.i,j被赋值为0
2.初始化i,而i=peek();调用peek方法返回j,而此时j的值是0(还未执行显示初始化)
3.初始化j,此时j才=1如果调用Z.Peek()那么结果就是1不错的问题~我以前也搞不明白呵呵,后来研究了他的初始化的动作就明白了~
然后,初始化Z的非静态变量;
最后调用构造函数,在调用本类之前,首先初始化父类,又回到开头。在初始化的时候,首先将所有的值赋初值(0,0.0,0L, false, null);
然后按照先后顺序一一赋值。
class Z {
static int peek() { return j; }
static int i = peek();
static int j = 1;
}
public class Test {
public static void main(String[] args) {
System.out.println(Z.i); //1
System.out.println(Z.i); //2
}}
为什么 2这个位置输出的也是0,按按理说1已经把j初始化了并赋了值,为什么在调用次会重新初始化??
搞不懂