Java中的静态初始化和非静态初始化

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

1. Java中的初始化

Java与C++的一个不同之处在于,Java不仅有构造函数,还有一个“初始化块”(Initialization Block)的概念。Java中的初始化块在创建Java对象时隐式执行,并且是在构造函数之前执行。

2. 静态初始化

// 定义
static {
    ...
}

静态初始化块执行的优先级高于非静态初始化块,在对象装载到JVM中时执行一次,仅能初始化类成员变量,即static修饰的数据成员。

3. 非静态初始化

// 定义
{
    ...
}

非静态初始化块在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块在构造函数之前执行。

4. Demo

  • Example
class Test {
    
    static {
        System.out.println("Run static initailization block.");
    }
    
    {
        System.out.println("Run nonstatic initailization block.");
    }
    
    public Test() {
        System.out.println("Run Test constructor.");
    }
    
    public static void main(String[] args) {
        Test t = new Test();
    }
}
  • Result
Run static initailization block.
Run nonstatic initailization block.
Run Test constructor.

5. 总结

从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器之前执行。初始化块是一段固定执行的代码,它不能接受任何参数。因此初始化块对同一个类的所有对象所进行的初始化处理完全相同。如果有一段初始化处理代码对所有的对象完全相同,且无需接受任何参数,就可以把这段初始化处理代码提取到初始化块中。通过把多个构造器中的相同代码提取到初始化块中定义,能更好地提高初始化代码的复用。静态初始化块是类相关的,系统将在类加载时执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比非静态初始化块先执行。用途:例如在JNI调用时,需要加载动态链接库,就可以在静态代码块中加载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,834评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,728评论 0 11
  • 父类 static 块 1 执行 父类 静态成员staticSam1初始化 父类 静态成员staticSam2初始...
    YCix阅读 1,359评论 0 0
  • 刚才略略担心了一下我写的页数,其实,没有必要,因为导师本来说的就是百页之内。所以,我尽我所能,把我需要说的说清楚,...
    米亚MIA阅读 163评论 0 0
  • 1.首先要引入一个头文件 2.具体代码
    YvanLiu阅读 710评论 0 0