当前位置: 首页 > 面试题库 >

Java 静态和非静态初始化代码块有什么区别

魏君博
2023-03-14
问题内容

我的问题是关于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关键字并进行编译。

这两种方式都使我感到困惑。我应该如何拥有不属于任何方法的代码段?如何调用它?通常,此用法的目的是什么?或者更好的是,在哪里可以找到有关此文档的文档?


问题答案:

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

当加载类时(实际上是在解决时,这是技术性的),按定义的顺序执行类初始化器(自上而下,就像简单的变量初始化器一样)。

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

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

如果你还static从初始化程序块中删除,那么它将成为实例初始化程序,因此int a在构造时进行初始化。



 类似资料:
  • 初始化的区别是什么:1)int i=47;或2)int i;{i=47;在哪些情况下我们需要第一个或第二个?

  • 问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。

  • 最近,当我在LeetCode上做一些练习时,我发现了一些绝妙的解决方案。它使用对象o引用数组,我猜可能是因为在Java,所有的东西都是Object。但当我尝试这种方法时,它出错了。所以我尝试了所有的方法来初始化数组,我想看看它们之间的区别,就像下面这样 只有o3会编译一个错误。我不知道是不是因为初始化的方式。我知道当我使用静态初始化时,它会先分配内存,当使用动态初始化时,它不会。它们之间的其他差异

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 问题内容: 块内初始化之间有什么区别: 以及单独的静态初始化: 问题答案: 静态初始化块允许更复杂的初始化,例如使用条件: 或者,当需要的不仅仅是构造时:使用构建器创建实例时,除了创建静态字段之外,还必须进行异常处理或其他工作。 静态初始化块也在内联静态初始化器之后运行,因此以下内容有效:

  • 问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。