java程序类变量问题

来源:百度知道 编辑:UC知道 时间:2024/07/07 21:13:18
class Cat
{
Cat(int i)
{
System.out.println("Cat("+i+")");
}
void f(int i)
{
System.out.println("f("+i+")");
}
}
class Cats
{
static Cat c1;
static Cat c2;
static
{
c1=new Cat(1);
c2=new Cat(2);
}
Cats()
{
System.out.println("Cats()");
}
}
public class StaticInit
{
public static void main(String[] args)
{
System.out.println("main()");
Cats.c1.f(7);
}
//static Cats c=new Cats();//
}

上面这段程序中 // //去掉 结果是
Cat(1)
Cat(2)
Cats()
main()
f(7)

而不去掉 则是 main()
Cat(1)
Cat(2)
f(7)
谁能给我解释下 谢谢

JAVA里的//是注释,那两个//意思就是将static Cats c=new Cats();这句注释掉,使程序不去执行它,只需要前面一个//就可以,后面那个属多余。

在解析这段代码之前,先明确几件事:
1、JAVA初始化的顺序是先“静态”,后“非静态”;
2、静态初始化只有在需要时才进行,也就是说,如果你不创建它的对象,也不去访问它,它是不会进行初始化的;
3、对于静态语句块,如果使用了它,它的静态初始化动作都会得到执行;
4、静态初始化动作只进行一次。

那么,我们来分析一下;
首先,去掉//,也就是static Cats c=new Cats();得到执行:
程序由main()方法进入开始执行,根据上面说的第1条,先执行static Cats c=new Cats();语句,实例化一个Cats对象,根据第3条,静态块都得到执行,所经c1、c2调用cat类的cat(int i)方法,分别打印Cat(1)、Cat(2),之后执行System.out.println("Cats()");打印Cats();
然后继续执行main()方法的System.out.println("main()");语句,打印main(),再执行Cats.c1.f(7);,根据上面第4条,前面已经初始化一次,这里Cats类的静态初始化不再执行,所以c1只调用Cat类的f(int i)方法,打印f(7)

如果加上//注释掉static Cats c=new Cats();:
那么程序由mian()方法进入,先执行System.out.println("main()");打印main(),然后执行Cats.c1.f(7);,这句用到了Cats类c1,所以Cats的静态块初始化得到执行,打印Cat(1)、Cat(2),并调用Cat类的f(int i)方法,打印f(7)。

以上,希望你能看明白。

补充一点:static Cats c=new Cats();和Cats.c1.f(7);这两条语句,无论只执行哪一条,Cats类里的静态块都会执行,如果