我的问题是关于静电关键字的一个特殊用法.可以使用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个关键字并使其编译.

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

推荐答案

带有挡路修饰符的代码挡路表示初始值设定项为class;没有静电修饰符的代码挡路表示初始值设定项为instance.

类的初始值设定项是在类被加载时(实际上,当它被解析时,但这是一个技术问题)按照它们被定义的顺序执行的(自上而下,就像简单的变量初始值设定项一样).

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

如果从int a中删除static,它将成为一个实例变量,您无法从静态初始值设定项块访问该变量.这将无法编译,错误为"无法从静态上下文引用非静态变量a".

如果还从初始值设定项块中删除了static,那么它将成为实例初始值设定项,因此int a将在构造时初始化.

Java相关问答推荐

使用hibiter中特定字段的where条款自定义映射

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

为什么我的ArrayList索引的索引总是返回-1?

我需要生成一个文件来整合每个特性执行的所有JSON结果

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

使用GridBagLayout正确渲染

Mapstruct不能正确/完全映射属性

测试期间未执行开放重写方法

第三方Jar pom.xml

如何在Cosmos DB(Java SDK)中增加默认响应大小

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

根本不显示JavaFX阿拉伯字母

AWS Java SDK v2.x中没有setObjectAcl方法

组合连接以从两个表返回数据

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

如何调整JButton的大小以适应图标?

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

字符串的Gzip压缩在java11和java17中给出了不同的结果

读取ConcurrentHashMap中的可变对象

ResponseEntity.控制器截断响应的JSON部分