class Insect { int i = 9; int j; Insect(){ prt("i = "+i+",j = "+j);// 7,这句代码又调用了prt 函数,这时候 j 还没有赋值,等于0。所以又打印了一句“i = 9,j = 0 ”。 j =39; } static int x1 = prt("static Insect.x1 initialized");// 1,主函数蓝色那句代码执行,类加载进内存后会先初始化父类的静态定义,由于这句话调用了prt 方法,所以执行下面那个 // 函数了 static int prt(String s){ System.out.println(s);//2, 上面那句代码1调用了这个函数,这个函数就执行了,打印了传入的参数 "static Insect.x1 initialized" ,然后返回了47,上面的x1就等于47了 return 47; } } class Beetle extends Insect{ int k = prt("beetle.k initialized");//9,这句再次调用了prt函数,打印了参数 "beetle.k initialized" ,返回63,k就等于63 Beetle(){ prt("k = "+k);//8,最后是初始化子类构造函数,这里用到 k 的值,所以转而执行上面那句,执行完上面那句后,k的值等于63,调用prt函数打印的就是k = 63 。 prt("j = "+j);//10,这句用到父类的静态变量,通过父类构造函数的初始化,j的值已经变成39,这样调用prt函数打印的就是 j = 39 。至此结束 } static int x2 = prt("static Beetle.x2 initialized");// 3, 然后是初始化子类的静态定义,这句话调用了子类的 prt 方法,所以又去执行了下面子类的prt方法 static int prt(String s){ System.out.println(s);//4,同样,上面的代码3调用了这个方法,方法执行,打印传入的参数 "static Beetle.x2 initialized " ,返回63,x2就等于63了 return 63; } public static void main(String[] args) { prt("Beetle constructor");//5,初始化动作做完后,就开始真正执行这句代码了,这句代码是调用了上面 4 那个方法,就打印了传入的参数"Beetle constructor" Beetle b = new Beetle();//6,然后开始执行这句话,这个就相对简单了,创建子类对象,由于子类构造函数第一句默认是super(),所以先初始化父类构造函数 //转入执行上面的 7 } } |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |