static 之 静态初始化块

来源:互联网 发布:a星算法的缺点 编辑:程序博客网 时间:2024/05/29 21:18

    • 初始化块
      • 初始化块用法
      • 初始化块被调用的条件
      • 初始化块被调用次数
      • 初始化块作用
      • 总结
    • 静态初始化块
      • 静态初始化块用法
      • 静态初始化块被调用的条件
      • 静态初始化块作用
      • 总结

初始化块

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

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(",....");    }}

运行结果
这里写图片描述

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(",....");    }}

运行结果

这里写图片描述

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(",....");    }}

运行结果
这里写图片描述

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();    }}

运行结果
这里写图片描述

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();    }}

运行结果
这里写图片描述

代码块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();    }}

运行结果
这里写图片描述

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) {    }}

运行结果:
这里写图片描述

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

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

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

这里写图片描述

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();    }}

运行结果
这里写图片描述

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.静态初始化只会执行一次。

阅读全文
0 0