对于继承,多态先执行哪一段一直都搞不太清楚。为了弄清楚,今天写了一段代码测试了一下,不多说先上代码- class Father{
- private int x=3;
- public int y=5;
- Father(){
- System.out.println("Father run");
- }
- static {
- System.out.println("Father staticCode run");
- }
- {
- System.out.println("Father structCode run");
- x++;
- y++;
- }
- public void show() {
- System.out.println("x="+x+",y="+y);
- }
- }
- class Child extends Father {
- private int x=13;
- public int y=15;
- Child(){
- System.out.println("child run");
- }
- static {
- System.out.println("child staticCode run");
- }
- {
- System.out.println("child structCode run");
- x++;
- y++;
- }
- public void show() {
- System.out.println("x="+x+",y="+y);
- }
- }
- public class Test {
- public static void main(String[] args) {
- Father f=new Child();
- f.show();
- Child c=new Child();
- c.show();
-
- }
- }
复制代码 打印结果如下:
Father staticCode runchild staticCode run
Father structCode run
Father run
child structCode run
child run
x=14,y=16
Father structCode run
Father run
child structCode run
child run
x=14,y=16
根据打印结果分析:
第一个创建对象是多态,应该是子类继承了父类的父类的静态代码块和构造代码块,当new一个子类对象时,静态代码块随着类的加载而加载,所以先执行两个静态代码块,再执行继承过来的原父类的构造代码块,但为什么接着是执行父类的构造方法,而再执行子类的构造代码块呢?{:soso_e132:}接着再执行子类的构造函数方法没有问题,最后f.show()执行的是子类的show方法这一点也比较疑惑{:soso_e132:}
第二个创建的对象,child的引用指向child类的对象,因为静态代码块随着类的加载只执行一次,所以这次没有执行静态代码块,先执行的原父类中的构造代码块,这次依然是父类的构造函数先于子类的构造代码块执行,再次疑惑,{:soso_e132:}后面两项没什么疑惑的。
分析的不对和疑惑的地方敬请各位批评和指点!!
|