java在初始化的时候也有很多讲究,因为java中出现了类,所以在初始化的时候就有可能使用到创建新对象,所以,对于初始化的顺序要求的比较严格,请看下面一个程序,是thinking in java中的一个程序,被我稍加改编,这样可以更好的说明几个初始化的要点:
class cup
{
cup(int marker)
{
system.out.println("cup(" + marker + ")");
}
void f(int marker)
{
system.out.println("f(" + marker + ")");
}
}
class cups
{
static cup c1=new cup(1);
cup c3=new cup(3);
static cup c2= new cup(2);
cups()
{
system.out.println("cups()");
}
cup c4=new cup(4);
}
public class explicitstatic
{
cups c=new cups();
{
system.out.println("hello");
}
public static void main(string[] args)
{
system.out.println("inside main()");
cups.c1.f(99);
explicitstatic x=new explicitstatic();
}
static cups x = new cups();
}
大家可以手动执行一下这个程序,考虑一下结果是什么,然后参照下面的答案对照一下,看看是否正确:
cup(1)
cup(2)
cup(3)
cup(4)
cups()
inside main()
f(99)
cup(3)
cup(4)
cups()
hello
我总结了四个初始化的要点,如下:
1、如果有static,即静态成员定义,首先初始化static的变量,如,在类cups中c3在c2前面,可是在输出的结果中,你可以发现,c2是在c3前执行的,这就是因为,所有的static都在第一时间被初始化。
2、static只初始化一次,在第二次创建类的对象的时候,就不会去执行static的语句,如,在第二次执行new cups()的时候,就只输出了cup(3)和cup(4),显然,static的两个创建对象的语句没有做。
3、变量的初始化在方法前。如,在cups类中,方法cups()在语句cup c4=new cup(4)之前,可是输出结果的时候,打印的cups()却在cup(4)之后。
4、在含有main的类中执行顺序是先做static,然后就是main,而不是像其它类一样,除了static就按顺序做下来。如,在main函数中,如果去掉语句explicitstatic x=new explicitstatic(),则cups c=new cups()和system.out.println("hello")都不会执行。另外,留个小问题,如果去掉了system.out.println("hello")外的括号会怎么样呢?
闽公网安备 35060202000074号