Java 类的实例化顺序和初始化顺序

class B extends A ,然后A类也就是父类里面有静态代码块,静态方法,静态成员变量,构造代码块,普通成员变量,普通方法。
经测试,得到如下结论:

1.父类【静态成员】和【静态代码块】,按照代码中出现的顺序依次执行。
2.子类【静态成员】和【静态代码块】,按照代码中出现的顺序依次执行。
3.父类的【构造代码块】和【普通成员变量被普通成员方法赋值】,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。


Example:

父类:

class Parent{
    static {
        System.out.println("父类:静态代码块");
    }

    {
        System.out.println("父类:构造代码块");
    }

    private static String staticStringInParent = initStaticStringInParent();

    private String stringInParent = initStringInParent();

    public Parent(){
        System.out.println("父类:构造方法");
    }

    private static String initStaticStringInParent(){
        System.out.println("父类:静态方法,被静态成员变量赋值调用");
        return "initStaticStringInParent";
    }

    private String initStringInParent(){
        System.out.println("父类:普通成员方法,被普通成员变量赋值调用");
        return "initStringInParent";
    }
}

子类:

class Child extends Parent{

    private String stringInChild = initStringInChild();
    private static String staticStringInParent = initStaticStringInChild();


    {
        System.out.println("子类:构造代码块");
    }


    static{
        System.out.println("子类:静态代码块");
    }

    public Child(){
        System.out.println("子类:构造方法");
    }



    private static String initStaticStringInChild(){
        System.out.println("子类:静态方法,被静态成员变量赋值调用");
        return "initStaticStringInChild";
    }

    private String initStringInChild(){
        System.out.println("子类:普通方法,被普通成员变量赋值调用");
        return "initStringInChild";
    }
}

测试方法:

/**
 * @author: hyl
 * @date: 2019/10/20
 **/
public class Test {

    public static void main(String[] args) {
        System.out.println("Start");
        new Child();
        System.out.println("End");
    }


}

运行结果:
在这里插入图片描述

根据结果我可以可以看出和开头给的结论是一致的,在编写代码或者面积及笔试时,按照上面结论来做是没问题的。


大家看下下面这段代码的结果是否和你想的一样呢:

/**
 * @author: hyl
 * @date: 2019/10/20
 **/

class Father{
    public static Father father = new Father();
    public int j = 0;

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

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

    public Father(){
        System.out.println("Father Constructor");
    }
}
public class Test1 extends Father{

    public static void main(String[] args) {
        new Father();
    }
}

在这里插入图片描述

很多人会说,这不是和上面的结论就不一样了呢?
其实在在 public static Father father=new Father(); 时,静态代码块虽还未执行,但可以看作它已经加载被确定执行,所以这里并没有执行静态代码块。


文章为ArvinHan原创,如果文章有错的地方欢迎指正,大家互相交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值