猿问

静态初始化代码块与非静态初始化代码块之间的区别是什么?

静态初始化代码块与非静态初始化代码块之间的区别是什么?

我的问题是关于静态关键字的一种特殊用法。可以使用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关键词,并使其编译。

在这两方面我都很困惑。我怎么会有一个不属于任何方法的代码部分?怎么可能调用它呢?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关这方面的文档?


繁华开满天机
浏览 818回答 3
3回答

皈依舞

带有静态修饰符的代码块表示班级,等级初始化程序;没有静态修饰符,代码块是实例初始化器。类初始化器按照定义的顺序(自上而下,就像简单的变量初始化器一样)在类加载时执行(实际上,当类被解析时,但这是一个技术性问题)。实例初始化器按照类实例化时定义的顺序执行,在紧接执行构造函数代码之前,在超级构造函数调用之后立即执行。如果你把static从…int a,它将成为一个实例变量,您无法从静态初始化器块访问该变量。这将无法用错误编译“非静态变量a不能从静态上下文中引用”。如果你也移除static从初始化程序块中,它随后成为实例初始化程序,因此int a在构造时初始化。

慕仙森

UFF!什么是静态初始化器?静态初始化程序是static {}Java类中的代码块,并且在调用构造函数或main方法之前只运行一次。好的!告诉我更多.。是一个代码块static { ... }在任何java类中。并在调用类时由虚拟机执行。不return支持语句。不支持任何论点。不this或super是支持的。嗯,我在哪里可以用呢?可以在任何你觉得还好的地方使用:)那么简单。但是我看到大多数情况下,它是在数据库连接、API init、日志记录等操作中使用的。不要只是叫!例子在哪里?package&nbsp;com.example.learnjava;import&nbsp;java.util.ArrayList;public&nbsp;class&nbsp;Fruit&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Inside&nbsp;Static&nbsp;Initializer."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;fruits&nbsp;array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList<String>&nbsp;fruits&nbsp;=&nbsp;new&nbsp;ArrayList<>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fruits.add("Apple"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fruits.add("Orange"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fruits.add("Pear"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;print&nbsp;fruits &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;fruit&nbsp;:&nbsp;fruits)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fruit); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("End&nbsp;Static&nbsp;Initializer.\n"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Inside&nbsp;Main&nbsp;Method."); &nbsp;&nbsp;&nbsp;&nbsp;}}输出?内部静态初始化器。苹果桔黄色的梨结束静态初始化器。内部主要方法。希望这能帮上忙!
随时随地看视频慕课网APP

相关分类

Java
我要回答