类是怎么样初始化的

hailun 2008-03-11 08:13:30
声明,不记得这题是从哪里弄来的,如果原作者发现请见谅

问,输出结果是什么(当然要在IDE里运行前说出结果)
import java.util.Calendar;
public class Test{
public static final Test INSTANCE = new Test();
private int size = 6;
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);
private Test(){
size = THIS_YEAR - 1930;
}
public int getSize(){
return size;
}

public static void main(String[] args){
System.out.println(INSTANCE.getSize());
}
}

因为我想的结果与答案不一致,也在群里问了很多朋友,但答案太多了,现在也没有弄明白,期待回复,谢谢
...全文
272 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailun 2008-03-15
  • 打赏
  • 举报
回复
二楼的代码看起来还是不太明白
不知道是static的还是非static的先被初始化呢
hailun 2008-03-13
  • 打赏
  • 举报
回复
二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test();
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧

如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
hailun 2008-03-13
  • 打赏
  • 举报
回复
二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test();
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧

如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
hailun 2008-03-13
  • 打赏
  • 举报
回复
二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test();
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧

如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值

hailun 2008-03-13
  • 打赏
  • 举报
回复
二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test();
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧

如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值

hailun 2008-03-13
  • 打赏
  • 举报
回复
二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test();
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧

如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值

hailun 2008-03-13
  • 打赏
  • 举报
回复
二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test();
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧

如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值

老紫竹 2008-03-13
  • 打赏
  • 举报
回复
我已经回复了!请看5楼!
hailun 2008-03-13
  • 打赏
  • 举报
回复
补充一点,在看THINK IN JAVA的时候,上面不是说先初始化static,然后才是非static的吗?如果是这样的话
那么第二个static也应该被初始化呀
hailun 2008-03-13
  • 打赏
  • 举报
回复
回5楼
有一点不明白,一点需确认
执行顺序如下

不明白的地方
1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR); //那么它也是静态的啊,为什么它没有被初始化呢,还是因为它"应该"被初始化,但由于new了,所以它要在new其后执行吗?

需确认的地方
6 完成初始化,调用getSize(), 返回了-1930
即使调用了getSize()方法,那么也要等待所有的初始化完毕才会被执行吗?,如果执行过程中size值再被改变,那么它的值是后来被改变的还是调用getSize()这个方法的呢?
谢谢
nihuajie05 2008-03-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 java2000_net 的回复:]
执行顺序如下
1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法
2 test 按照顺序初始化类级变量,注意,此时静态变量由前面一步做,所以不会初始化其它的变量,此时size = 6;
3 然后调用构造器 size=0-1930 = -1930, 因为没有初始化的静态变量,默认值为0
4 返回
5 继续调用THIS_YEAR的初始化
6 完成初始化,调用getSize(), 返回了-1930
[/Quote]
penglewen 2008-03-12
  • 打赏
  • 举报
回复
类的初始化顺序问题,前面几位讲得很详细.
foreveryone 2008-03-12
  • 打赏
  • 举报
回复
OK,见识了
张振宇 2008-03-11
  • 打赏
  • 举报
回复
import java.util.Calendar;
public class Test{
public static final Test INSTANCE = new Test(); //(2)
private int size = 6; //(1)
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR); //(4)
private Test(){
size = THIS_YEAR - 1930; //(3)
}
public int getSize(){
return size;
}

public static void main(String[] args){
//System.out.println("THIS_YEAR="+THIS_YEAR);
System.out.println(INSTANCE.getSize()); // (5) }
}

java 类中的成员变量初始化顺序是这样的:
1. 所有普通类型变量
2. 所有静态类型变量
上面程序中所作的标记,如(1),(2),标明了编译器执行的步骤。
(1)首先初始化size,值为6
(2)初始化INSTANCE,由于INSTANCE创建了一个Test对象,此时将调用Test构造函数
(3)构造函数中执行size = THIS_YEAR - 1930,由于此时THIS_YEAR还没有被初始化,其值为0(基本类型int的默认值),所以此时size=-1930.
(4)初始化THIS_YEAR ,THIS_YEAR = 2008.
(5)初始化完毕,执行main函数,INSTANCE.getSize()=-1930.

注意:此时堆中已经有了INSTANCE和THIS_YEAR,INSTANCE指向一个Test对象(Test.INSTANCE指向自己,Test.THIS_YEAR=2008,Test.size=-1930),THIS_YEAR=2008.

这就是整个过程,关于类的初始化顺序问题,《Thinking in java》第四章有很详细的描述 :)
老紫竹 2008-03-11
  • 打赏
  • 举报
回复
执行顺序如下
1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法
2 test 按照顺序初始化类级变量,注意,此时静态变量由前面一步做,所以不会初始化其它的变量,此时size = 6;
3 然后调用构造器 size=0-1930 = -1930, 因为没有初始化的静态变量,默认值为0
4 返回
5 继续调用THIS_YEAR的初始化
6 完成初始化,调用getSize(), 返回了-1930
keyboardsun 2008-03-11
  • 打赏
  • 举报
回复


package com.sample.action;

import java.util.Calendar;
public class Test{
public static final Test INSTANCE = new Test();
private static int size = 6;
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);
static{
size = THIS_YEAR - 1930;
}
private Test(){
}
public int getSize(){
return size;
}
public static void main(String[] args){
System.out.println(INSTANCE.getSize());
}
}


jianpc 2008-03-11
  • 打赏
  • 举报
回复
-1930
在进行new Test()操作的时候,THIS_YEAR还没赋值,把这句话放在public static final Test INSTANCE = new Test(); 之前就好了。
dracularking 2008-03-11
  • 打赏
  • 举报
回复
取得值时THIS_YEAR还没来得及初始化
chen09 2008-03-11
  • 打赏
  • 举报
回复
把程序改成下面这个,你就明白了。

import java.util.Calendar;

public class Test {
public static Test INSTANCE = new Test();
private int size = 6;
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);

private Test() {
System.out.println("new Test()");
System.out.println("THIS_YEAR:"+THIS_YEAR);
size = THIS_YEAR - 1930;
}

public int getSize() {
System.out.println("getSize()");
return size;
}

public static void main(String[] args) {
System.out.println(INSTANCE.getSize());
}

static {
//INSTANCE = new Test();
THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);
System.out.println("static:"+THIS_YEAR);
}
}

输出:
new Test()
THIS_YEAR:0
static:2008
getSize()
-1930

也就是说,先构造函数(new Test()),再THIS_YEAR赋值(static:2008)。

然后你把上面//INSTANCE = new Test();的注释去掉试试?
输出:
new Test()
THIS_YEAR:0
new Test()
THIS_YEAR:2008
static:2008
getSize()
78

OK,得到78这个结果了吧?
搞这个没有太大意思,不要钻牛角了。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧