• java 静态、main、继承 的执行顺序


    静态块:用static申明,JVM加载类时执行,仅执行一次

    构造块:类中直接用{}定义,每一次创建对象时执行

    public class Study_static {
        public static char text = 'a'; //静态对象
    
        public Study_static(){ //构造函数
            System.out.println('c');
        }
    
        {             //构造块
        System.out.println('b');
        }
    
        static{         //静态块
        System.out.println(text);
        }
        
        public static void main(String[] args){
            Study_static a = new Study_static();
    
        }
    }                


    输出结果:

    执行顺序优先级:静态块>main()>构造块>构造方法

    所以先执行静态块,再tudy_static a = new Study_static();该语句创建对象,则又会调用构造块,输出构造块,再执行构造函数。

    然而,这里的静态块,并不是仅仅静态块,而是静态域,包含了静态变量,静态块,这两者的执行顺序就是按照位置顺序进行。

    总结:

    1.静态块其实就是给类初始化的,而构造代码块是给对象初始化的。

    2.静态代码块只会运行一次

    3.静态块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
    一个类中可以有多个静态代码块,执行顺序按照位置决定。

    分析:

      因为静态部分是依赖于类,而不是依赖于对象存在的,所以静态部分的加载优先于对象存在。

      当找到main方法后,因为main方法虽然是一个特殊的静态方法,但是还是静态方法,此时JVM会加载main方法所在的类,试图找到类中其他静态部分,即首先会找main方法所在的类。

    执行顺序大致分类:

      1.静态属性,静态方法声明,静态块。

      2.动态属性,普通方法声明,构造块。

      3.构造方法。

        

    1.1 静态:

      当加载一个类时,JVM会根据属性的数据类型第一时间赋默认值(一举生成的)。然后再进行静态属性初始化,并为静态属性分配内存空间,静态方法的声明,静态块的加载,没有优先级之分,按出现顺序执行,静态部分仅仅加载一次。至此为止,必要的类都已经加载完毕,对象就可以被创建了。

    1.2 普通:

      当new一个对象时,此时会调用构造方法,但是在调用构造方法之前,(此刻1.1已经完成,除非被打断而暂停)执行动态属性定义并设置默认值(一举生成的)。然后动态属性初始化,分配内存,构造块,普通方法声明(只是加载,它不需要初始化,只有调用它时才分配内存,当方法执行完毕后内存立即释放),没有优先级之分,按出现顺序执行。最后进行构造方法中赋值。当再次创建一个对象,不再执行静态部分,仅仅重复执行普通部分。

      注意:如果存在继承关系,创建对象时,依然会首先进行动态属性进行定义并设默认值,然后父类的构造器才会被调用,其他一切都是先父类再子类(因为子类的static初始化可能会依赖于父类成员能否被正确初始化),如果父类还有父类,依次类推,不管你是否打算产生一个该父类的对象,这都是自然发生的。

    总结:只要按照这个步骤,遇到这一类问题就可以解决了。     

              1-3:类加载过程,不涉及构造方法

              1-5: 实例化过程,涉及构造方法

      1.类中所有属性的默认值(一举而成)

      2. 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)

      3. 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)

      4.  调用父类的构造方法,

          首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)

          然后父类构造方法

      5.  调用子类的构造方法,

          首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)

          然后子类构造方法

  • 相关阅读:
    无线网破解软件|一键式破解无线网|BT17软件包下载[笔记本+软件就行]
    Boost环境配置及遇到的问题解决方案
    HDU 4255 A Famous Grid
    uva 10306
    系统学习Linux的11点建议
    linux shell except tcl login ssh Automatic interaction
    常用网址记录
    am335x Qt SocketCAN Demo hacking
    a demo for how to use QThread
    OK335xS CAN device register and deiver match hacking
  • 原文地址:https://www.cnblogs.com/double-orange/p/10566063.html
Copyright © 2020-2023  润新知