• java中代码执行顺序


    静态代码块 -- >构造代码块 --> 构造方法
    静态代码块:只执行一次
    构造代码块:每次调用构造方法都执行

    http://blog.csdn.net/wuhaiwei002/article/details/55226155

    JAVA是一门面向对象的编程语言,这里考虑“类”里面在程序开始执行时的执行顺序。 
    先看一个实例:

    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();
        }
    }

    执行结果: 
    这里写图片描述

    说明: 
    一般的类里面包含: 
    1、静态代码块(静态区、静态变量等) 
    2、构造代码块({ }中间的内容) 
    3、构造方法

    其执行顺序也是1、2、3先后执行,这里需要注意的是:考虑继承特性。 
    子类与父类的执行顺序是: 
    1、先执行父类的静态代码块(父1) 
    2、子类的静态代码块(子1) 
    3、父类构造代码块(父2) 
    4、父类构造方法(父3) 
    5、子类构造代码块(子2) 
    6、子类构造方法(子3)

    当一个类从被JVM装载开始,各种代码的执行顺序大致如下:

    被JVM装载-> 
    执行父类的相关代码-> 
    如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行-> 
    如果有静态代码块,以与静态初始化一样的方式执行-> 
    如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法-> 
    执行非静态代码块-> 
    执行本类的构造函数-> 
    执行其他代码。

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

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

  • 相关阅读:
    if、else if 、else及switch...case使用小记(C#)
    c#基础知识
    流与文本文件操作(C#)
    .NET中的异常处理机制(一)
    .NET中的异常处理机制(二)
    在引用类型变量上调用虚方法和非虚方法的区别
    各位客官!鼠标点击一个Button之后究竟发生了什么?您知道么?(C#)
    接口和抽象类的使用场景以及多类继承存在的问题(c#)
    面向对象SOLID设计原则之Open-Closed原则
    stack和stack frame
  • 原文地址:https://www.cnblogs.com/ConfidentLiu/p/8430327.html
Copyright © 2020-2023  润新知