关于 jVM的问题

来源:百度知道 编辑:UC知道 时间:2024/06/08 03:02:03
class insect
{
private int i=9;
protected int j;
insect()
{
System,.out.print("i="+i+"j="+j);
j=39;
}
private static int x1=printinit("static insect");
static int printinit(String s)
{
print(s);
return 47;
}
}
public class beetle extends insect
{
private int k=printinit("beetle.k");
public beetle()
{
System.out.print("k="+k);
System.out.print("j=" +j);
}
private static int x2=printinit("static beet");
public static void main(String [] args)
{
System..out.println("beetle constructor");
beetle b=new beetle();
}
}

输出:
static insect
static beet
beetle constructor
i=9 j=0
beetle k
k=47 j=39

这道题目就是JVM搞的鬼把
会先输出static insect和static beetle 而不是beetle constructor就是JVM搞的鬼把

要真说是JVM搞的鬼,其实也没错。。。这是java代码运行时静态变量的一些规则。
首先在运行beetle的main函数前,先加载beetle类(并不是实例化,是加载其中的成员和方法,另一个角度讲main也是在其中的方法嘛,不加载就没法运行了),而beetle类有父类insect,因此先加载insect类,并初始化其静态成员和运行起静态代码块,因此执行
private static int x1=printinit("static insect");
而其他非静态成员(包括私有、保护、共有)都是在实例化时才会初始化。
然后是加载beetle 类,同理初始化其静态成员,因此执行
private static int x2=printinit("static beet"); 。
至此加载结束,开始运行main函数中代码,先是System..out.println("beetle constructor");
然后beetle b=new beetle(); 这里实例化了beetle类,此时其父类insect 的其他成员先被初始化,然后并调用其默认构造方法
insect()
{
System,.out.print("i="+i+"j="+j);
j=39;
}
然后是beetle的其他成员被初始化,在这里就是
private int k=printinit("beetle.k");
然后其构造方法被调用
public beetle()
{
System.out.print("k="+k);
System.out.print("j=" +j);
}
至此运行结束