java中父类和子类初始化顺序

顺序

1. 父类中静态成员变量和静态代码块

2. 子类中静态成员变量和静态代码块

3. 父类中普通成员变量和代码块,父类的构造函数

4. 子类中普通成员变量和代码块,子类的构造函数


其中“和”字两端的按照代码先后顺序执行。

举例

先看代码:

Father类

public class Father {
    public String fStr1 = "father1";
    protected String fStr2 = "father2";
    private String fStr3 = "father3";

    {
        System.out.println("Father common block be called");
    }

    static {
        System.out.println("Father static block be called");
    }

    public Father() {
        System.out.println("Father constructor be called");
    }

}
首先是Father类,该类有一个默认构造函数,有一个static的代码块,为了方便查看结果,还有一个普通代码块。

Son类

package com.zhenghuiyan.testorder;

public class Son extends Father{
    public String SStr1 = "Son1";
    protected String SStr2 = "Son2";
    private String SStr3 = "Son3";

    {
        System.out.println("Son common block be called");
    }

    static {
        System.out.println("Son static block be called");
    }

    public Son() {
        System.out.println("Son constructor be called");
    }

    public static void main(String[] args) {
        new Son();
        System.out.println();
        new Son();
    }

}

Son类的内容与Father类基本一致,不同在于Son继承自Father。该类有一个main函数,仅为了测试用,不影响结果。

在main函数中实例化Son。

结果为:

Father static block be called
Son static block be called
Father common block be called
Father constructor be called
Son common block be called
Son constructor be called

Father common block be called
Father constructor be called
Son common block be called
Son constructor be called

总结:

1,在类加载的时候执行父类的static代码块,并且只执行一次(因为类只加载一次);

2,执行子类的static代码块,并且只执行一次(因为类只加载一次);

3,执行父类的类成员初始化,并且是从上往下按出现顺序执行(在debug时可以看出)。

4,执行父类的构造函数;

5,执行子类的类成员初始化,并且是从上往下按出现顺序执行。

6,执行子类的构造函数。

欢迎转载,请标明出处:http://blog.csdn.net/yuxin6866/article/details/53107578


  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
http://blog.csdn.net/methods2011/article/details/8584463 Java的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System.out.println("X"); } public static void main(String[] args) { new Z(); } } class Y{ Y(){ System.out.println("Y"); } } class Z extends X{ Y y=new Y(); static{ System.out.println("tt"); } Z(){ System.out.println("Z"); } } 先不告诉最后结果,我们先来分析下。一步一步推出结果。 1.首先分析一段程序的执行后的结果,我们得先找到程序的入口,然后才能着手分析。 也就是main()方法。 2.我们发现main()方法在X类,要执行main()方法,还得先将X类加载到内存。 3.X类加载完成后,会做什么事情呢?别急,先来看看static的作用,不知道吧。告诉你:static就是在类被第一次加载的时候执行,以后就不再执行。 4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。 5.所以一个输出结果为tttt,没问题了吧。 6.X类的static语句块执行完了,就该执行main()方法啦。 7.new Z();此方法被执行。 8.既然new Z();那么Z类就要被加载。因为Z类继承X类。所以必须先加载X类才行。因为X类已经被加载。所以此时不用再加载X类了。Z类加载好了就要执行Z类的static语句块 9.那么就会打印出tt了吧。 10.都加在完后就要实例化对象了。 11.实例化Z之前,还得先实例化X对吧。因为子类的构造方法都会调用父类的构造方法。 12.那就先实例化X类吧。 13.执行X方法前还得先初始化对不。也就是获取所有属性。那么X类的属性Y就会获取。 14.即X类的Y y=new Y();要被执行。也就是会打印Y。 15.接着执行System.out.println("X"); 16.然后就是执行Z的构造方法 17.同样先获取Z的属性Y y=new Y();打印Y。 18.再执行System.out.println("Z"); 整个过程就是这样了。现在知道结果了吧: tttt tt Y X Y Z http://snow4909.diandian.com/post/2013-02-17/40049419937 记住,面试有可能会标出一些语句的,让你选择这些语句的执行顺序。不过只要知道原理,就没什么难的了。 执行先后顺序: 1、类加载到内存时static 加载进内润 2、调用类的构造方法时先调用父类的构造方法,在调用子类的构造方法 3、类初始化时,先初始化类的属性成员,在执行构造方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值