欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

static 之 静态初始化块

程序员文章站 2024-03-17 16:22:34
...

初始化块

在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。

1.初始化块用法:

Java 中可以通过初始化块进行数据赋值。如:

public class Test {
    public static void main(String[] args) {
        String name;//定义成员变量
        {
            name = "test";//通过初始化块为变量赋值
        }
    }
}

2.初始化块被调用的条件

只有在创建类的实例时才会调用初始化块,当没有实例化类时,不会执行初始化块。如:
1. 没有创建类的实例,运行main函数,不会触发初始化块
代码块

package com.yubai.javatest.test;
public class Test {
    public static String str;

    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }
    public static void main(String[] args) {
        System.out.println(",....");
    }
}

运行结果
static 之 静态初始化块

2. 创建类的实例,运行main函数,会按着顺序依次触发初始化块
代码块

package com.yubai.javatest.test;
public class Test {
    public static String str;

    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(",....");
    }
}

运行结果

static 之 静态初始化块

3. 创建类的实例,运行main函数,会按着顺序依次触发初始化块,构造函数
代码块

package com.yubai.javatest.test;
public class Test {
    public static String str;
     {
        System.out.println("初始化1");
    }
    {
        System.out.println("初始化2");
    }
    public Test() {
        System.out.println("构造函数");
    }

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(",....");
    }
}

运行结果
static 之 静态初始化块

4. 运行main函数,调用方法,没有创建类的实例,不会触发构造函数和初始化块
代码块

package com.yubai.javatest.test;

public class Test {
    public static String str;
    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }

   static{
        str = "aaa";
        System.out.println("静态初始化2");
    }

    public Test() {
        System.out.println("构造函数");
    }

    public static void test1(){
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
    }

    public static void test2(){
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
    }

    public static void main(String[] args) {
        //Test t = new Test();
        test1();
        test2();
    }
}

运行结果
static 之 静态初始化块

3. 初始化块被调用次数

随着创建类的对象的而被调用。就是说,创建几次对象,初始化块和构造函数就被调用几次
代码块1

package com.yubai.javatest.test;

public class Test {
    public static String str;

    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }

    static {
        str = "aaa";
        System.out.println("静态初始化2");
    }

    public Test() {
        System.out.println("构造函数");
    }

    public static void test1() {
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
    }

    public static void test2() {
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
    }

    public static void main(String[] args) {
        Test t1 = new Test();
        t1.test1();

        Test t2 = new Test();
        t2.test1();
    }
}

运行结果
static 之 静态初始化块

代码块2

package com.yubai.javatest.test;

public class Test {
    public static String str;

    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }

    static {
        str = "aaa";
        System.out.println("静态初始化2");
    }

    public Test() {
        System.out.println("构造函数");
    }

    public static void test1() {
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
    }

    public static void test2() {
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
    }

    public static void main(String[] args) {
        Test t1 = new Test();
        t1.test1();
        t1.test1();
    }
}

运行结果
static 之 静态初始化块

4. 初始化块作用:

当需要初始化成员变量的值是一个很复杂的逻辑时,通常选用初始化块

一般很少使用初始化块

总结:

  1. 只要没有创建类的实例,则不会触发初始化块和构造函数
  2. 构造函数和初始化块的顺序:按代码的顺序执行初始化块,再执行构造函数
  3. 初始化块和构造函数调用次数和创建对象的次数一致

静态初始化块

如果使用 static 修饰初始化块,就称为静态初始化块。

1.静态初始化块用法:

static{
代码块
}

2.静态初始化块被调用的条件

静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。

1. 静态初始化块被执行条件示例
代码块:

package com.yubai.javatest.test;
public class Test {
    public static String str;

    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }

    static{
        str = "aaa";
        System.out.println("静态初始化2");
    }

    public static void main(String[] args) {

    }
}

运行结果:
static 之 静态初始化块

运行结果解释:
当运行此类时,运行结果只会输出静态初始化2,因为静态初始化块只在类加载时执行。

即使main函数中没有写任何代码也不会因此不执行静态初始化块,因为静态初始化块的执行只与类是否加载有关。

当类被加载时,就会立马执行静态初始化块,然后开始执行main函数中的代码。所以当我再main函数中添加打印代码时,输出结果先输出静态初始化2,然后输出打印信息。如图:
static 之 静态初始化块

static 之 静态初始化块

2.静态初始化只会执行一次

代码块

package com.yubai.javatest.test;

public class Test {
    public static String str;

    {
        System.out.println("初始化1");
    }

    {
        System.out.println("初始化2");
    }

    static {
        str = "aaa";
        System.out.println("静态初始化2");
    }

    public Test() {
        System.out.println("构造函数");
    }

    public static void test1() {
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 --- 调用test1");
    }

    public static void test2() {
        System.out.println("测试初始化块被调用的次数,和静态初始化块被调用的次数 ------ 调用test2");
    }

    public static void main(String[] args) {
        test1();
        test2();
    }
}

运行结果
static 之 静态初始化块

3. 静态初始化块作用:

当我们需要某个对象只能执行一次时,就会用到静态初始化块的概念。

比如:向数据库添加对象,删除对象,修改对象,查询对象。每个操作不需要每次都要连接数据库。

我们可以在静态初始化块中连接好数据库,之后的每个操作就不需要再连接,直接可以用连接好的数据库操作对象

举例:当我们用电脑查询网页,还是打游戏,下载软件,还是敲代码等等每个操作,都需要开机。如果每次操作都要执行开机这个步骤,就显得很麻烦。所以我们的解决办法是使电脑一直处于开机状态,直到晚上睡觉前再关闭电脑。
应用在实例中,静态初始化块负责开机,只需要开一次,之后的每个操作就不需要再开机。睡觉前关闭电脑。

应用实例:连接数据库
代码块

public class MongoDBTest {
    public static final String HOST = "127.0.0.1";
    private static final int PORT = 27017;
    private static final String DB_NAME = "testDB";
    private static Mongo mongo;
    private static DB db;

    static{
        //连接数据库仓库
        mongo = new Mongo(HOST,PORT);
        //通过数据库仓库连接数据库仓库中的数据库:testDB
        db = mongo.getDB(DB_NAME);
    }
    ...

4.总结

1.静态初始化块只有在类加载时执行,与main函数中的代码逻辑无关。
2.静态初始化只会执行一次。

相关标签: java static