首先,我们写一个父类:
package com.wangyj.demo; public class Widget { public Widget(){ Sy("父类构造器"); } public synchronized void doSomething() { } public String test() { Sy("父类test 方法"); return ""; } }
父类
然后定义一个子类:
package com.wangyj.demo; public class LoggingWidget extends Widget { public LoggingWidget(){ Sy("子类构造方法"); } @Override public synchronized void doSomething() { Sy(toString()+ " call doSomething"); (); } public static void main(String[] args) { LoggingWidget widget = new LoggingWidget(); widget.doSomething(); } }
子类
运行结果如下:
运行结果
分析:
我们使用jdk 自带的工具javap进行反编译。进入到.class文件所在的目录执行命令 javap -c -l -v LoggingWidget;
输出结果如下:
javap返回结果1-1
javap 返回结果图1-2
javap 返回结果图1-3
从javap 返回结果图1-3中可以看出,main方法的执行顺序 先执行的 #12 的LoggingWidget的构造器,再观察javap 返回结果图1-2的LoggingWidget的构造器中执行了#1方法,#1便是父类的init 方法;然后main方法中又执行了子类的init方法
最后 执行doSomething()方法。从而可知,创建子类的时候先调用了父类的init方法,然后调用了自身的init 方法。
结论:
子类创建时,先调用的是父类的构造器方法,然后再次调用的子类的构造器方法。只会创建一个子类对象,不会创建父类对象,但是通过调用父类的init 方法,可以加载父类的方法。