同意AIHUA(牙神三空杀) 关于静态块的说明。其实那个无名的函数就是其默认的构造函数。 例如你可以这样写: Vector v = new Vector(){ { addElement("a"); } } 你一new那个代码就执行了。
我个人认为是装载时机不同,正如AIHUA(牙神三空杀)所说
AIHUA(牙神三空杀) 说的关于静态的方法和块是正确的, 而下面的那个解释则不完全。JVM在载入类的时候按照定义的循序依次初始化各个静态属性, 如果没有调用构造函数。只调用了静态的属性,那些非静态的属性是不会初始化的。如果调用了构造函数,那么JVM就依次开始初始化非静态的属性。而 { System.out.println("Hello, World"); } 是属于非静态属性那么按照上面的说法,在构造函数执行前,就已经初始化了。 如果上面的如果楼主只运行了main函数,那么Hello, World就不会出现如果楼主在main函数中添加 panfeng test = new panfeng(); 那么将出现Hello, World;
static{}在main之前调用,所以有东西 {}之间的部分,编译器是当作无参的构造函数处理的,但是注意一下情况: public class A { { System.out.println("Hello, World"); } public A(){System.out.println("go");} { System.out.println("after"); } public static void main(String[] args) { new A(); } } 结果是Hello,world after go 明白了吧,这些代码无论放哪,都是相当于加到构造函数的最前面
static
{
System.out.println("Hello, World");
}
则在类载入的时候执行,然后才调用main/构造/静态
----------------------
而
{
System.out.println("Hello, World");
}感觉上是一个函数,可是没有函数名字,不知道如何调用既然没有调用,自然不会执行
自己看看书吧
例如你可以这样写:
Vector v = new Vector(){
{
addElement("a");
}
}
你一new那个代码就执行了。
而下面的那个解释则不完全。JVM在载入类的时候按照定义的循序依次初始化各个静态属性,
如果没有调用构造函数。只调用了静态的属性,那些非静态的属性是不会初始化的。如果调用了构造函数,那么JVM就依次开始初始化非静态的属性。而
{
System.out.println("Hello, World");
}
是属于非静态属性那么按照上面的说法,在构造函数执行前,就已经初始化了。
如果上面的如果楼主只运行了main函数,那么Hello, World就不会出现如果楼主在main函数中添加 panfeng test = new panfeng();
那么将出现Hello, World;
{}之间的部分,编译器是当作无参的构造函数处理的,但是注意一下情况:
public class A
{
{
System.out.println("Hello, World");
}
public A(){System.out.println("go");}
{
System.out.println("after");
}
public static void main(String[] args)
{
new A();
}
}
结果是Hello,world
after
go
明白了吧,这些代码无论放哪,都是相当于加到构造函数的最前面