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

为什么必须在构造函数完成之前初始化最终变量?

裴兴言
2023-03-14
问题内容

为什么必须在构造函数完成之前初始化最终变量?

public class Ex
{
  final int q;
}

当我编译这段代码时,我得到这样的错误

err:变量q可能尚未初始化


问题答案:

官方理由是,它是由定义的Java语言规范8.3.1.2:

必须在声明该类的每个构造函数的末尾绝对分配一个空白的最终实例变量;否则会发生编译时错误。

空白的final是其声明缺少初始化程序(即您所描述的内容)的final变量。



 类似资料:
  • 问题内容: 有没有在Java构造函数中使用最终变量的解决方案?问题是,如果我初始化一个最终字段,例如: 那么我就不能在构造函数中使用它。Java首先运行构造函数,然后运行字段。有没有一种解决方案可以让我访问构造函数中的final字段? 问题答案: 我不太明白你的问题。那 执行如下:

  • 问题内容: 我有以下这段代码: 现在在控制台中,构造函数要在的构造函数之前执行。 我想知道为什么会这样。 问题答案: 这是因为在编译时,编译器会将在声明位置完成的每个初始化都移到类的每个构造函数中。因此,类的构造函数可以有效地编译为: 因此,显然构造函数是在类的语句之前执行的。同样,如果您的类中还有其他构造函数,则初始化将移至所有它们。 让我们看一个简单类的字节码: 编译该类,并执行命令- 。您将

  • 假设你有这个代码片段 例如,如果编译器决定让它看起来像 这将是一个问题,因为calculateWaitTime()生成一个新线程,该线程可能会将集合视为null或其中没有1。 那么问题又来了,这种重新排序可能吗?或者所有在构造函数之外初始化的最终字段都是在构造函数之前初始化的,或者至少总是由编译器移动到构造函数的顶部

  • 问题内容: 为什么必须始终在Java中初始化局部变量(包括基元)?为什么相同的实例变量不适用? 问题答案: 基本上,要求在读取变量之前为其分配值是一件好事。这意味着您不会意外阅读您不想要的内容。是的,变量可以具有默认值-但如果编译器可以证明您正在尝试读取尚未分配的内容,那么编译器是否可以捕获错误不是更好吗?如果要为局部变量提供默认值,则始终可以显式分配。 现在,对于局部变量来说,这很好-但是对于实

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它