CSDN博客

img botree

Java学习之神奇的初始化

发表于2004/7/6 12:24:00  693人阅读

作者: yjwgeg
Friday, March 5 2004 9:50 AM

java在初始化的时候也有很多讲究,因为java中出现了类,所以在初始化的时候就有可能使用到创建新对象,所以,对于初始化的顺序要求的比较严格,请看下面一个程序,是thinking in java中的一个程序,被我稍加改编,这样可以更好的说明几个初始化的要点:

<a href="http://ad.cn.doubleclick.net/click%3Bh=v2|3140|3|0|%2a|a%3B7720504%3B0-0%3B0%3B6694709%3B31-1|1%3B4892528|4910424|1%3B%3B%3fhttp%3a%2f%2fhttp://ad.www.net.cn/ad/zdnet/zdnet_largeformat_index.htm" target="_blank"><img src="http://m2.cn.doubleclick.net/638159/cn_336_280.swf " width="468" height="60" border="0" /></a>

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")外的括号会怎么样呢?

0 0

相关博文

我的热门文章

img
取 消
img