class Z {
static int peek() { return j; }
static int i = peek();
static int j = 1;
}
public class Test08 {
public static void main(String[] args) {
System.out.println(Z.i);
}}为什么输出结果会是 0 能解释下吗??
解决方案 »
- DocFlavor问题
- java怎么将网页通过javamail发送到别人的邮箱,在邮件正文显示网页内容,而不是他的网页源代码
- 数据库操作~大家怎么用的
- 请教一个Swing的输出修改方案..
- 用jdbc连接数据库的方法是什么;那位高手指点一下
- 有谁用过SQL Server 2000的JDBC?
- 那位大哥请帮忙!20分送分题!!!
- 急!急!急!各位老大,我的开发环境为 jdk1.2 + TexTPad 怎样才能................????
- 大家来讨论一下,作为一个“程序人”,他的人生价值到底在哪里??!!
- 求大神看看这段代码哪有问题
- 一个关于"&"的疑问
- 进行C/S界面设计,如何选择工具?
如果将类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初始化了并赋了值,为什么在调用次会重新初始化??
搞不懂