• java中初始化块、静态初始化块和构造方法


     

     (所谓的初始化方法init()是另一回事, 在构造方法之后执行, 注意不要混淆)

    在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。

    非静态初始化块(构造代码块):
    作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。
    与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。
    应用:将所有构造函数共性的东西定义在构造代码块中。

    静态初始化块:
    作用:给类进行初始化。随着类的加载而执行,且只执行一次
    与构造代码块的区别:
    1)构造代码块用于初始化对象,每创建一个对象就会被执行一次;静态代码块用于初始化类,随着类的加载而执行,不管创建几个对象,都只执行一次。
    2)静态代码块优先于构造代码块的执行
    3)都定义在类中,一个带static关键字,一个不带static

    构造函数、非静态初始化块、静态代码块都是用于初始化,三者的执行顺序依次是:静态代码块>构造代码块>构造函数。
    其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块初始化了。

    静态初始化块的作用就是当JVM在装载类时,你想让它做一些事情,那么,就可以用静态初始化块。这几者的执行顺序是:

    (JVM在装载类时)先装载类的静态成员,再执行静态初始化块(同样,当一个类有继承自某类时,则会先装载该父类,那么,父类的装载或执行顺序,也都如句子所述)。

    (在创建类的实例时)先执行实例初始化块,再执行构造方法;但对于一棵继承树中,会先调用父类的构造方法,那么其执行顺序也如句子所述。

    例子:
    Class A{ int n = 0;}
    那么你创建对象 A a = new A();之后就可以使用a.n属性

    Class A{  {  int a= 0;  }  } 
    放在块里面n就不是A的成员,就不能使用a.n属性

    前者把n作为对象的成员;后者只是实例化一个对象时声明一个局部变量a。有本质区别。

    public class Test {
    static {
    System.out.println("我是静态块");
    }
    }
    当创建Test 类的一个对象的时候,比如new Test() ,是这样,首先是类加载,然后才能new对象,静态块在类加载的时候就执行了,这就说明静态块在new对象之前就会执行,而且一个类在第一次被使用的时候 会被加载,然后在整个应用程序的生命周期当中不会再次被加载了,就加载这一次,所以这就说明,静态块就执行一次,不会执行第二遍!


    以下是对象的构造函数和初始化块的执行流程分析:

  • 相关阅读:
    华为OJ平台——DNA序列
    华为OJ平台——整数的二进制中1的个数
    华为OJ平台——首次不重复字符
    Unity-iPhone has Conflicting Provisioning Settings
    升级MAC OS到10.13, 10.14系统后UNITY工程无法加载资源的解决办法
    Unity各平台内置宏定义
    Xcode官方xip直接离线下载地址(更新到Xcode 9.4.1)
    Machine Learning In Action
    Unity3D Errors And Fix
    Crash for small compressed texture on some Android device
  • 原文地址:https://www.cnblogs.com/zedosu/p/6514396.html
Copyright © 2020-2023  润新知