- class Insect {
- int i = 9;
- int j;
- Insect(){
- prt("i = "+i+",j = "+j);
- j =39;
- }
- static int x1 = prt("static Insect.x1 initialized");
- static int prt(String s){
- System.out.println(s);
- return 47;
- }
- }
- class Beetle extends Insect{
- int k = prt("beetle.k initialized");
- Beetle(){
- prt("k = "+k);
- prt("j = "+j);
- }
- static int x2 = prt("static Beetle.x2 initialized");
- static int prt(String s){
- System.out.println(s);
- return 63;
- }
- public static void main(String[] args) {
- prt("Beetle constructor");
- Beetle b = new Beetle();
- }
- }
- 打印结果:
- static Insect.x1 initialized
- static Beetle.x2 initialized
- Beetle constructor
- i = 9,j = 0
- beetle.k initialized
- k = 63
- j = 39
复制代码 程序从入口开始执行,所以从main开始执行,prt("Beetle constructor");这句话用到了prt这个方法,因为Beetle类中有这个方法,所以需要加载Beetle这个类,又因为Beetle类继承了Insect这个类,Java虚拟机在加载子类时会先加载父类,所以先加载了Insect这个类。
因为父类中有static int x1 = prt("static Insect.x1 initialized")以及static int prt(String s),都是静态的,所以在父类被加载时,静态成员和静态方法也一起被JVM加载了,所以就输出了第一句话static Insect.x1 initialized。
父类加载完成后,加载子类,子类中也有静态成员与静态方法,所以第二句也就出来了。static Beetle.x2 initialized
当所需要的类都被加载完成后,接下来就执行了prt("Beetle constructor");语句,所以第三句话就这么来的Beetle constructor。
接下来执行Beetle b = new Beetle();
因为要new一个对象,所以用到了Beetle的构造函数,子类的构造函数默认的第一句是一句隐式super();调用的父类无参的构造函数,所以prt("i = "+i+",j = "+j);这句话就被执行了,所以第四句语句就这么来的i = 9,j = 0。调用完父类的无参构造函数后,调用了子类无参的构造函数,Beetle(){prt("k = "+k);prt("j = "+j);}因为用到了K这个值,所以int k = prt("beetle.k initialized");这句话就被执行了,beetle.k initialized这句就被打印出来了,接下来最后两句楼主应该能看懂的,就是两句输出语句。
|