静态初始化器的具体用法问题?

xuemyi 2009-06-23 10:13:21
public class demo{
static String str = "aaaa";
static{
System.out.println(str);
System.out.println("bbb");
}
demo(){
str = "cccc";
System.out.println(str);
}
public static void main(String a[]){
System.out.println(str);
demo mydemo = new demo();
}
}



输出什么结果,高手可以来解释一下静态初始化器是怎么工作的?是不是先与构造函数执行????
...全文
398 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
WYhack 2009-06-23
  • 打赏
  • 举报
回复
我七楼回答的有句话错了,在8楼写的很清楚了,一运行就很明白了~~~~~~~~~~~~
WYhack 2009-06-23
  • 打赏
  • 举报
回复
public class Demo{
static String str = "aaaa";
static{
System.out.println(str);
System.out.println("bbb");
}
Demo(){
str = "cccc";
System.out.println("构造函数执行~~~~~"+str);
}
public static void main(String a[]){
System.out.println("构造函数执行之前:str="+str);
Demo mydemo = new Demo();
System.out.println("构造函数执行之后:str="+str);
}
}

这个可以看的很清楚!!!!
WYhack 2009-06-23
  • 打赏
  • 举报
回复
public class demo{
static String str = "aaaa";
static{
System.out.println(str);//即使没有任何对象,静态初始化器都要执行,所以前两行输出是aaaa,bbb
System.out.println("bbb");
}
demo(){
str = "cccc";
System.out.println(str);
}
public static void main(String a[]){
System.out.println(str);//这里的输出要看构造函数的执行情况,这种情况本句输出的是aaaa,如果构造函数先执行,
//则修改了str变量,System.out.println(str)将输出cccc,下面的那种情况!
demo mydemo = new demo();

//但是要注意一点,无论demo mydemo = new demo()与System.out.println(str)位置如何,都是System.out.println(str)先执行,也就是先输出的意思,可以试一下
//具体原因还在研究中,不知道为啥是这样!!!


public class demo{
static String str = "aaaa";
static{
System.out.println(str);
System.out.println("bbb");
}
demo(){
str = "cccc";
System.out.println(str);
}
public static void main(String a[]){

demo mydemo = new demo();
System.out.println(str);//这种情况本句输出的是cccc,因为构造函数修改了静态变量str
}
}
callwww 2009-06-23
  • 打赏
  • 举报
回复
这样给你解释吧:
static 与实例无关,哪怕你创建实例后,你在销毁实例后,static里面的东西依然存在,直到线程over
JAVA在执行程序的时候首先装载类,然后找mian()
所以,在装载类的时候,遇到static马上执行,
因此,

public class demo{
static String str = "aaaa";
static{
System.out.println(str);
System.out.println("bbb");
}
demo(){
str = "cccc";
System.out.println(str);
}
public static void main(String a[]){
System.out.println(str);
demo mydemo = new demo();
}
}

首先执行static String str="aaaa";
接着执行static{
System.out.println(str);
System.out.println("bbb");
}
然后装载完毕,进入main()
执行System.out.println(str);
接着执行demo mydemo = new demo();
打印结果为:
aaaa
bbb
aaaa
cccc
如果不明白,你可以去看看我发的那个“测试下你是否真的理解JAVA运行机制和执行顺序 ”
superspring 2009-06-23
  • 打赏
  • 举报
回复
输出

aaaa
bbb
aaaa
cccc


静态初始化器是针对类的

构造函数是针对对象的

当然是现有类,再有对象

所以静态初始化器先于构造函数。

kimsung 2009-06-23
  • 打赏
  • 举报
回复
静态块给内存分配类的时候就会被执行。
和静态变量一样。
所以最先会被调用。
huadis 2009-06-23
  • 打赏
  • 举报
回复
static语句块只执行一次,当该类第一次被初始化时调用,且只运行一次,在构造函数之前
xuemyi 2009-06-23
  • 打赏
  • 举报
回复
能否给个详细解答?
knightzhuwei 2009-06-23
  • 打赏
  • 举报
回复
static语句块在类装载的时候执行 当然先于构造函数

62,616

社区成员

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

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