请牛人解答一下,关于初始化顺序

sunnylyy 2008-04-23 07:44:35
程序1:
class X{
public X(int i){
System.out.println(i);
}
}
public class Test2 {

static X x = new X(2);

static {
X x = new X(1);
}

public static void main(String[] args){

}
}

//输出2 1

程序2:(换下static的顺序)

class X{
public X(int i){
System.out.println(i);
}
}
public class Test2 {

static {
X x = new X(1);
}

static X x = new X(2);

public static void main(String[] args){

}
}

//输出1 2


有点困惑,静态块的初始化不是在静态变量之前么?哪位给解释解释吧
...全文
252 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
waykim 2008-04-29
  • 打赏
  • 举报
回复
貌似一句话,

顺序
xiguagege 2008-04-26
  • 打赏
  • 举报
回复
可能是我没有说明白
你得到的结果是0,100
说明打印出test.c的时候,c并没被初始化,也就是说“static int c = 100;”这句还没有执行
但是c是类变量,所以是可以访问的,并且有默认初始值的,所以结果为零
证明了初始化顺序是按照定义顺序执行的
virusswb 2008-04-26
  • 打赏
  • 举报
回复
1、静态的东西,静态的东西之间是按照先后顺序
2、字段
3、构造函数
基类先于构造类,就是父类先于子类
sunyujia 2008-04-26
  • 打赏
  • 举报
回复
被声明为static的字段或代码块他们的执行顺序跟声明顺序有关的,先声明先执行.
joejoe1991 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 xiguagege 的回复:]
可能是我没有说明白
你得到的结果是0,100
说明打印出test.c的时候,c并没被初始化,也就是说“static int c = 100;”这句还没有执行
但是c是类变量,所以是可以访问的,并且有默认初始值的,所以结果为零
证明了初始化顺序是按照定义顺序执行的
[/Quote]
咱们的观点是一样的,呵呵。
按顺序初始化。
mike123hl 2008-04-25
  • 打赏
  • 举报
回复
静态按照声明的顺序加载啊
joejoe1991 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 xiguagege 的回复:]
好像28楼的问题和上面我回复的问题是一致的
这个问题是我在看 <Thinking in Java>时遇到的
我发帖问了后有人回复说是类变量可以不初始化直接访问
(http://topic.csdn.net/u/20080420/22/fe5491dd-7908-4c19-b36b-9ed5c91a6272.html)
相当于只执行了变量的申明
所以输出为变量的默认值
[/Quote]

...........
你那个是因为 类成员JVM自动初始化,所以你可以直接用,而方法里面的JVM不会管它,所以你要手动初始化才可以!所以你不可以if

可是这跟我那个问题好像没有什么关系吧??
xiguagege 2008-04-25
  • 打赏
  • 举报
回复
好像28楼的问题和上面我回复的问题是一致的
这个问题是我在看<Thinking in Java>时遇到的
我发帖问了后有人回复说是类变量可以不初始化直接访问
(http://topic.csdn.net/u/20080420/22/fe5491dd-7908-4c19-b36b-9ed5c91a6272.html)
相当于只执行了变量的申明
所以输出为变量的默认值
xiguagege 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 joejoe1991 的回复:]
我感觉一楼说的不对,如果对的话,
那谁解释一下下面这个程序的输出????

Java codepublicclasstest {staticinti=1000;static{
System.out.println(test.c);
}staticintc=100;publicstaticvoidmain(String[] args){
System.out.println(test.c);
}
}

结果:
Java code0100
[/Quote]
我来解释一下好了
照我前面说的一样,按照定义的顺序执行
先是i=1000;然后打印出test.c,此时要注意c为类变量不必初始化就可以访问,且默认值为0,
你可以用String类型试试(static String c = "test";)打印出null,test;
后面的就不用我说了吧
wuqin850 2008-04-25
  • 打赏
  • 举报
回复
这里还有个问题:



public class InitTest {

static int a=21;

static{
System.out.println(InitTest.a);
a=30;
System.out.println(InitTest.b);
}
static int b=30;
static{
System.out.println(a);
System.out.println(b);
}


public static void main(String[] args) {


System.out.println("--------");
}

}


变量b没有初始化,为什么可以调用InitTest.b,虽然是0,那里来的b的地址?
不想被黑 2008-04-25
  • 打赏
  • 举报
回复
哈哈..
有懂了一点.
关注中...
wuqin850 2008-04-25
  • 打赏
  • 举报
回复




public class InitTest {

/**
* @param args
* void
*/

static int a=21;

static{
System.out.println(InitTest.a);
a=30;
System.out.println(InitTest.b);
}
static int b=30;
static{
System.out.println(a);
System.out.println(b);
}


public static void main(String[] args) {


System.out.println("--------");
}

}


证明: 静态是按顺序初始化的
psyl 2008-04-25
  • 打赏
  • 举报
回复
1:静态变量
2:静态块


这两个顺序执行,谁在前面先执行谁
a_nuo 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 anqini 的回复:]
http://blog.csdn.net/anqini/archive/2008/04/24/2319551.aspx
看这个!
[/Quote]
大家可以去看看这里,很详细的代码
joejoe1991 2008-04-25
  • 打赏
  • 举报
回复
我感觉一楼说的不对,如果对的话,
那谁解释一下下面这个程序的输出????

public class test { 

static int i = 1000;

static {
System.out.println(test.c);
}

static int c = 100;


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


结果:
0
100
duzhonghua 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 richard_2010 的回复:]
引用 1 楼 anqini 的回复:
1:静态变量
2:静态块
3:非静态变量
4:非静态块
5:构造体

****父类优先于子类!

应该是按照定义的顺序,不过静态的优先于非静态的,父类优先于子类
[/Quote]
学习
七年 2008-04-25
  • 打赏
  • 举报
回复
我还是推荐这位兄弟讲的:
http://blog.csdn.net/AaronLucas/archive/2008/02/11/2088188.aspx
guoxiaopeng1982 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bootupnow 的回复:]
static初始化语句、static初始化块 按照类定义中的顺序执行!
开始也被偶们老师忽悠鸟,自己写了程序给他瞧也答不上来,直到看了core java,所以还是要多看书,细看书。
hoho~
[/Quote]
很好很强大…………实践派的代表人物…………
anqini 2008-04-25
  • 打赏
  • 举报
回复
http://blog.csdn.net/anqini/archive/2008/04/24/2319551.aspx
看这个!
gshywx 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hujing101 的回复:]
引用 1 楼 anqini 的回复:
1:静态变量
2:静态块
3:非静态变量
4:非静态块
5:构造体

****父类优先于子类!

经典的回答 太好了 一语道破天机
[/Quote]
加载更多回复(16)

62,616

社区成员

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

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