在继承当中这些方法及代码块执行顺序是什么样的

Posted 李三岁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在继承当中这些方法及代码块执行顺序是什么样的相关的知识,希望对你有一定的参考价值。

在Java中,尤其是我们的Java基础中,我们会学习到我们的静态代码块,构造代码块,局部代码块,也会学习到构造方法和不同方法,那么这些执行顺序是什么样呢,我们下面来一起看一看:
我们这里需要创建两个类,分别是Person(普通类),Demo(测试类)

Person(普通类)

public class Person {
    static {
        System.out.println("静态代码块");
    }

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

    public Person (){
        System.out.println("构造方法");
    }

    public void Common(){
        System.out.println("普通方法");
        {
            System.out.println("局部代码块");
        }
    }
}

Demo(测试类)

public class Demo {
    public static void main(String[] args) {
        /**
         * Person p = new Person();
         *   静态代码块
         *   构造代码块
         *   构造方法
         * p.Common();
         *   普通方法
         *   局部代码块
         */
        Person p = new Person();
        p.Common();
        /**
         * 再这里我们发现了一个问题,当我们第二次创建对象的时候我们的静态代码块没有出现,那么这个是为什么呢?
         * 在这里我们需要记住两件事情:
         * 1)当我们第一次加载类的时候会执行我们的静态代码块,暂时可以理解为我们在第一次创建对象时会执行一次,之后不会再次执行
         * 2)我们的构造代码块,时在每次new对象之前都会执行一次
         * Person p2 = new Person();
         *   构造代码块
         *   构造方法
         * p2.Common();
         *   普通方法
         *   局部代码块
         */
        Person p2 = new Person();
        p2.Common();
    }
}

上述只是简单的代码块之前的顺序,那么在我们的继承关系中他们的执行顺序又是什么样的呢,下面我们再来测试以下:
我们这里需要创建三个类,分别是Super(父类),Sub(子类),Demo(测试类)

Super(父类)

public class Super {
    static {
        System.out.println("我是父类静态代码块");
    }

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

    public Super (){
        System.out.println("我是父类构造方法");
    }

    public void Common(){
        System.out.println("我是父类普通方法");
        {
            System.out.println("我是父类局部代码块");
        }
    }    
}

Sub(子类)

public class Sub extends Super{
    static {
        System.out.println("我是子类静态代码块");
    }

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

    public Sub (){
        System.out.println("我是子类构造方法");
    }

    //重写了父类的Common方法
    public void Common(){
        System.out.println("我是子类重写后的普通方法");
        {
            System.out.println("我是子类重写后的局部代码块");
        }
    }
}

Demo(测试类)

public class Demo {
    public static void main(String[] args) {
        /*每一段都是单独的*/
        /**
         * Super s = new Super();
         *   我是父类静态代码块
         *   我是父类构造代码块
         *   我是父类构造方法
         * s.Common();
         *   我是父类普通方法
         *   我是父类局部代码块
         */
        Super s = new Super();
        s.Common();
        /**
         * Sub a = new Sub();
         *   我是父类静态代码块
         *   我是子类静态代码块
         *   我是父类构造代码块
         *   我是父类构造方法
         *   我是子类构造代码块
         *   我是子类构造方法
         * a.Comm();
         *   我是子类普通方法
         *   我是子类局部代码块
         */
        Sub a = new Sub();
        a.Common();
        /**
         * Super sp = new Sub();
         *   是父类静态代码块
         *   我是子类静态代码块
         *   我是父类构造代码块
         *   我是父类构造方法
         *   我是子类构造代码块
         *   我是子类构造方法
         * sp.Common();
         *   是子类重写后的普通方法
         *   我是子类重写后的局部代码块
         */
        Super sp = new Sub();
        sp.Common();
    }
}

以上是关于在继承当中这些方法及代码块执行顺序是什么样的的主要内容,如果未能解决你的问题,请参考以下文章

java代码执行顺序

IT十八掌作业_java基础第五天_静态代码块类的继承和接口

代码逻辑题之继承-静态代码块-main方法执行顺序

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺

java基础第五天_静态代码块类的继承和接口

静态代码块静态变量构造方法及构造块执行顺序