public class HelloWorld { public static void main(String[] args) {
// TODO Auto-generated method stub
Hello a=new Hello();
Hello b=new Hello();
}}class Hello
{
static
{
System.out.println("Hello ,World");
}
}
我也很困惑为什么
还请大家解释下
谢谢
解决方案 »
- jpcap抓包的小问题,求解!
- jtable 限定cell输入个数和类型的问题
- 请大峡帮帮忙,下面是一个求素数的程序问题
- 急急...请问怎样在文件中添加新的内容??
- 求解线程问题
- Java的基础问题 可是书上确没有写 关于 System.out.print()
- 一个编译错误
- 呵呵,不好意思,刚才刚问完一个问题,现在又有一个问题!还是高分!在线等待
- 这个编译错误怎么解决?
- 请教!jdbc web(win2000/tomcat) database(solaris oracle8i)
- jscrollpane如何始终显示下方视图,就像QQ一样??——在线求解
- 关于JAVA初始化的问题(主动调用与被动调用)
当执行: Hello a=new Hello();时,将Hello类装入内存时,执行类的初始化,从而:执行
static
{
System.out.println("Hello ,World");
} 当执行第二条的:Hello b=new Hello();时,由于Hello类已在内存,就不用再装入了,从而:不再执行
那个static{...}
第一条是Hello a=new Hello();执行输出语句;
第二条是Hello b=new Hello();执行输出语句。
而且用Class.forName()加载类也会触发类初始化。所以下面代码会也会打印。public class HelloWorld{
public static void main(String[] args) throws ClassNotFoundException{
Class.forName("Hello");
}
}class Hello{
static {
System.out.println("Hello ,World");
}
}
再多说两句。类的加载和类的初始化不是同一件事。这里其实是类初始化的问题。
用new去新建一个类对象的时候有两种情况。
1. 如果类没有被加载,这时候类会被加载并初始化。
2. 如果类已经加载,但是没有初始化,就会进行初始化。
3. 类已经加载并初始化。那就会不在加载,当然也不在执行初始化。而初始化工作里面其中一项就是执行静态语句块里面的代码。这样明白啦吗?
Class.forName()加载类也会触发类初始化,访问运行时常量也会触发类初始化。
public class HelloWorld{
Hello hello;
public static void main(String[] args) throws ClassNotFoundException{
// 类Hello已经被加载啦,但是没有初始化,所以静态语句并没有运行。
System.out.println(Hello.HELLO_WORLD);
// 接触下面这行的注释后,静态语句块就会被执行
//Hello a = new Hello();
}
}class Hello{
public static final String HELLO_WORLD = "Hello ,World"; static {
System.out.println(HELLO_WORLD);
}
}
既然是初始化时执行static代码块, Hello a=new Hello();
Hello b=new Hello(); 那为什么对b初始化时不执行static代码块呢?
当加载类字节码时,会立即执行static代码块里的代码,
当第二次用到className时,因为字节码已经加载,所以直接实例化就行了
所以只会打印1次
类加载和类初始化都是只会做一次。对象初始化可以有多次。
你那两个new语句,实际上是初始化了两个对象。
// 类Hello已经被加载啦,但是没有初始化,所以静态语句并没有运行。
System.out.println(Hello.HELLO_WORLD);
错了!
执行System.out.println(Hello.HELLO_WORLD);这条语句,并没有将类Hello加载。
这是因为:编译器已经将System.out.println(Hello.HELLO_WORLD);优化成了
System.out.println("Hello ,World");了。
什么情况下类会装载而不会进行类的初始化?如下就是一例:
Class hello_c=Hello.class;
它会装入类Hello而不会对类Hello进行类的初始化。
不过这个与楼主的问题有什么关系呢?楼主用的是new Hello();作用就是:当它发现类Hello没有装载或已装载而没有初始化,new总是要对类Hello进行装载并初始化的[类的初始化,永远只做一次]。
书上有说的..