zoukankan      html  css  js  c++  java
  • 【Java基础】继承中的代码块和构造方法的执行顺序探索

    本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题。首先来看一个例子

    /**
     * Created by lili on 15/10/19.
     */
    
    class Person{
        static {
            System.out.println("执行Person静态代码块");
        }
    
        {
            System.out.println("执行Person构造代码块");
        }
        public Person(){
            System.out.println("执行Person构造方法");
        }
    }
    
    class Student extends Person{
        static {
            System.out.println("执行Student静态代码块");
        }
    
        {
            System.out.println("执行Student构造代码块");
        }
        public Student(){
            System.out.println("执行Student构造方法");
        }
    }
    public class ExtendsStaticConstruct {
        public static void main(String args[]){
            Student student = new Student();
        }
    
    }

    执行结果如下:

    执行Person静态代码块
    执行Student静态代码块
    执行Person构造代码块
    执行Person构造方法
    执行Student构造代码块
    执行Student构造方法
    
    Process finished with exit code 0

    说明程序的执行顺序是:

      静态代码块 ---》    构造代码块 ----》  构造方法

    执行流程解释:
      new的是Student类,但是Student是继承子Person类,所以在加载Student类时先要加载Person类,而静态的内容是随着类的加载而加载的,所以先打印“执行Person静态代码块”,后执行Student的静态代码块。

      加载完类后,开始走main方法,执行Student构造方法上,即初始化Student,但是Student是继承自Person,必须先初始化Person,所以先调用Person类的空参构造方法进行初始化,但是Person类的构造代码块优先于构造方法执行,所以Person类的构造代码块先执行,构造方法后执行。然后再执行Student类的构造代码块和构造方法。

      这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层初始化,即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初始化工作,先进性成员变量的初始化,成员变量的初始化顺序是:默认初始化,即int为0这种--》显示初始化,例如给int型显示初始化了值--》构造方法初始化,所以是这里执行到了构造方法。

          但是一定要注意,父类初始化选择的构造方法却和子类中super 选择的构造相关,下面代码很好的解释了这点。

    /**
     * Created by lili on 15/10/19.
     */
    
    class Person{
        static {
            System.out.println("执行Person静态代码块");
        }
    
        {
            System.out.println("执行Person构造代码块");
        }
    
        public Person(){
            System.out.println("执行Person无参构造方法");
        }
    
        public Person(String name){
            System.out.println("执行Person构造方法"+ name);
        }
    }
    
    class Student extends Person{
    
        static {
            System.out.println("执行Student静态代码块");
        }
        {
            System.out.println("执行Student构造代码块");
        }
        public Student(String name){
            super(name);
            System.out.println("执行Student构造方法" + name);
        }
        public Student(){
            super();
            System.out.println("执行Student无参构造方法");
        }
    
    
    
    
    }
    public class ExtendsStaticConstruct {
        public static void main(String args[]){
            Student student1 = new Student("lili");
    
            System.out.println("--------------------");
            Student student2 = new Student();
    
        }
    
    }

    结果:

    执行Person静态代码块
    执行Student静态代码块
    执行Person构造代码块
    执行Person构造方法lili
    执行Student构造代码块
    执行Student构造方法lili
    --------------------
    执行Person构造代码块
    执行Person无参构造方法
    执行Student构造代码块
    执行Student无参构造方法
    
    Process finished with exit code 0
    

      

  • 相关阅读:
    GB/T 38879-2020 颗粒 粒度分析 彩色图像分析法
    GB/T 30431-2020 实验室气相色谱仪
    GB/T 50165-2020 古建筑木结构维护与加固技术标准
    GB/T 51405-2019 船厂总体设计标准
    GB/T 38922-2020 35kV及以下标准化继电保护装置通用技术要求
    GB/T 38953-2020 微电网继电保护技术规定
    GB/T 38886-2020 高温轴承钢等最新国家标准(2020-6-19)
    pytest_02(使用pychar执行pytest)
    pytest-01(安装pytest及运行规则)
    python-05(关于map函数的使用)
  • 原文地址:https://www.cnblogs.com/gslyyq/p/4892070.html
Copyright © 2011-2022 走看看