• java中静态初始化块、初始化块和构造方法的理解 (转载)


    在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对象之前就会执行,而且一个类在第一次被使用的时候 会被加载,然后在整个应用程序的生命周期当中不会再次被加载了,就加载这一次,所以这就说明,静态块就执行一次,不会执行第二遍!


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

  • 相关阅读:
    两个数据库比较 对比视图存储过程及表结构差异
    导入/导出Excel
    比较两个数据库的表结构差异
    根据当月数据库自动生成下个月数据库--3
    根据当月数据库自动生成下个月数据库--2
    根据当月数据库自动生成下个月数据库--1
    ubuntu 分屏工具
    ubuntu 分屏工具
    中英文对照 —— 色彩的描述
    中英文对照 —— 色彩的描述
  • 原文地址:https://www.cnblogs.com/maowh/p/3593247.html
Copyright © 2020-2023  润新知