Java中的静态初始化器

我的问题是关于static关键字的一个特定用法。 可以使用static关键字来覆盖不属于任何函数的类中的代码块。 例如下面的代码编译:

public class Test {
    private static final int a;    
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

如果你删除static关键字,它会抱怨,因为变量afinal 。 但是可以删除finalstatic关键字并进行编译。

这两种方式让我感到困惑。 我应该如何拥有一个不属于任何方法的代码部分? 如何调用它? 一般来说,这种用法的目的是什么? 或者更好的是,我可以在哪里找到关于此的文档?


带有静态修饰符的代码块表示一个类初始化程序; 没有静态修饰符,代码块就是一个实例初始化器。

当类被加载时(实际上,当它被解析,但是这是一个技术性),类初始化符按照它们被定义的顺序(从上到下,就像简单变量初始化符一样)执行。

实例初始化器按照在实例化类时定义的顺序执行,紧接在构造函数代码执行之前,立即在调用超级构造函数之后执行。

如果从int a移除static ,它将成为一个实例变量,您无法从静态初始化程序块访问该实例变量。 这将无法编译错误“非静态变量不能从静态上下文中引用”。

如果你还从初始化块中移除static ,它将成为一个实例初始化器,所以int a在构造时被初始化。


UFF! 什么是静态初始化器?

静态初始化器是java类中的static {}代码块,并且在构造函数或main方法被调用之前只运行一次。

好! 告诉我更多...

  • 是任何java类中的一块代码static { ... } 。 并在调用类时由虚拟机执行。
  • 不支持return语句。
  • 不支持任何参数。
  • 不支持thissuper
  • 嗯我可以在哪里使用它?

    可以在任何你感觉良好的地方使用:)这很简单。 但是我发现在进行数据库连接,API初始化,日志记录等时大部分时间都用到了它。

    不要只吠! 示例在哪里?

    package com.example.learnjava;
    
    import java.util.ArrayList;
    
    public class Fruit {
    
        static {
            System.out.println("Inside Static Initializer.");
    
            // fruits array
            ArrayList<String> fruits = new ArrayList<>();
            fruits.add("Apple");
            fruits.add("Orange");
            fruits.add("Pear");
    
            // print fruits
            for (String fruit : fruits) {
                System.out.println(fruit);
            }
            System.out.println("End Static Initializer.n");
        }
    
        public static void main(String[] args) {
            System.out.println("Inside Main Method.");
        }
    }
    

    输出???

    内部静态初始化器。

    苹果

    橙子

    结束静态初始化器。

    主要方法内。

    希望这可以帮助!


    static块是一个“静态初始化器”。

    它在加载类时自动调用,并且没有其他方法可以调用它(甚至不通过Reflection)。

    我个人只有在编写JNI代码时才使用它:

    class JNIGlue {
        static {
            System.loadLibrary("foo");
        }
    }
    
    链接地址: http://www.djcxy.com/p/78807.html

    上一篇: Static initializer in Java

    下一篇: In what order do static/instance initializer blocks in Java run?