静态初始化

2023-12-01

当我编译代码时遇到问题。当我编译我的代码 foo2.var 在类 foo 中返回 null 时,我似乎不明白为什么。我在 foo2 类中进行静态初始化导致 foo2.var 在 foo 类中为 null 的方式是否有问题?

任何帮助表示赞赏。

public class foo extends bar {
  public final static String blah = foo2.var;
  ...
}

public abstract class bar {
  ...
}

public class foo2 extends bar {
  public final static String var;

  static {
    var = "newstring";
  }
  ...
}

本例中 foo2.var 行出现空指针错误。


访问静态字段(其值不是编译时常量表达式)将触发声明该字段的类的初始化,在此期间执行静态初始化程序。然而,如果初始化器之间不存在循环依赖,则只能保证在读取字段时初始化已完成。

例如,如果您运行程序

class Bar {
    static final long bar;

    static {
        System.out.println("Assigning bar");
        bar = Foo.foo;
    }
}
class Foo extends Bar {
    static final long foo;

    static {
        System.out.println("Assigning foo");
        foo = 1;
    }
}

public class Test {
    public static void main(String[] args) {
        new Foo();
        System.out.println(Bar.bar);
    }
}

你会得到以下输出:

Assigning bar
Assigning foo
0
1

因为要创建一个新实例Foo, Foo.class被初始化,首先初始化其超类Bar.class,它读取字段Foo.class, but Foo.class已经被初始化。 Java 语言规范要求第 12.4.2 节,步骤 3,这样的递归初始化立即完成,即调用者将看到该类处于部分初始化状态。那是,Foo.foo在读取时未分配,因此仍包含默认值 0。该值被分配给Bar.bar,完成初始化Bar.class。然后,初始化Foo.class通过运行初始化程序来恢复,该初始化程序设置Foo.foo to 1.

实际上,您可能希望检查类的依赖关系并构建程序,以便初始化程序之间不存在循环依赖关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态初始化 的相关文章

随机推荐

  • 使用实体框架和 LINQ 的未知列错误

    我昨天开始使用 EF 但将这个简单的查询转换为 EF sintax 时遇到了麻烦 翻译 select a city from offer o address a offer address oa where o identifier oa
  • 在 NSThread 中运行 NSTimer?

    我正在尝试在应用程序的后台运行计时器 我在应用程序中大量使用计时器 并且我宁愿在后台运行它 但是在尝试释放 NSAoutreleasePool 时出现内存泄漏 我的 Timer 类是单例的 所以如果我启动新计时器 旧计时器就会释放它 voi
  • Delayed_job:作业加载失败:未初始化常量 Syck::Syck

    这是错误 gt gt Delayed Job find last last error gt Job failed to load uninitialized constant Syck Syck Handler ruby struct D
  • Python IRC 机器人无法加入

    我收到错误消息 irc evilzone org 通知授权 正在查找您的主机名 irc evilzone org 通知授权 找到您的主机名 已缓存 平 7091A8FB irc evilzone org 451 加入 你有 未注册 irc
  • 检测 Google 网站翻译器的语言更改

    我在我的网站上使用 Google 网站翻译器 让用户可以即时翻译网站 使用此代码 function googleTranslateElementInit new google translate TranslateElement pageL
  • 有没有一种方法可以在不调用 __init__ 的情况下实例化一个类?

    有没有办法绕过构造函数 init python 中的一个类 Example class A object def init self print FAILURE def Print self print YEHAA 现在我想创建一个实例A
  • 将 JSP 文件包含在 Java 中

    我知道在 jsp 中包含外部文件可以通过以下方式完成 但是有没有办法在 java 类 对象中执行此操作 您可以在 servlet 或任何有权访问当前请求的类 中通过RequestDispatcher request getRequestDi
  • 在 Ubuntu(WSL1 和 WSL2)中显示 matplotlib 绘图(和其他 GUI)

    因此 在 ubuntu for windows Linux 的 windows 子系统 上 人们似乎建议我们需要使用 Agg 后端 只保存图像 而不是显示绘图 import matplotlib matplotlib use Agg no
  • HTML5 不在 IE 中呈现标头标签

    因此 我使用一个名为 Bonsai 的静态站点生成器 它使用一些相互依赖项 如把手 倾斜和液体模板 现在 我正在遵循最佳实践 在 HTML5 上构建它 我已经在 Chrome Firefox 和 Opera 上广泛测试了该格式 把最坏的情况
  • RichTextBox光标不断变为I Beam

    我有一个只读RichTextBox 其光标设置为Arrow 即便如此 当我将其悬停时 光标会闪烁 并且在之间快速切换Arrow and IBeam 我怎样才能让它继续存在Arrow并且不闪烁 Jimi s answer works well
  • 如何在 OSX 上以编程方式打开和关闭蓝牙、wifi 和声音

    如何在 OSX 上打开和关闭 wifi 和蓝牙连接 更改声音和亮度级别 只需执行正确的命令 您甚至可以使用 AppleScript Wifi ifconfig en1 off or networksetup setairportpower
  • 为什么 EventTarget 子类实例会丢失名称?

    当前版本的 JavaScript 将 EventTarget 实现为类而不是接口 因此您可以使用所有预期方法创建 EventTarget 的实例 我尝试复制 粘贴事件目标示例在控制台中 在 Chrome 和 Firefox 上 但是当我检查
  • 写时复制期间父进程是否会失去写能力?

    假设我们有一个父进程 在内存中存储了一些任意数量的数据 我们使用fork产生一个子进程 据我所知 为了让操作系统执行写入时复制 内存中包含我们正在修改的数据的特定页面将设置其只读位 并且操作系统将使用子进程尝试时产生的异常修改数据以将整个页
  • Flutter 构建 iOS 时出现错误:已请求但未找到带有标识符的扩展点

    我刚刚升级到 Xcode 13 3 beta 运行 flutter 项目出现此错误 Error output from Xcode build 2022 03 02 17 45 38 148 xcodebuild 62848 6695836
  • 我想忽略证书验证,在哪里以及如何使用 XMLRPC Web 服务来做到这一点?

    我正在访问 Web 服务 并在尝试连接时收到此错误 Web 服务是 XMLRPC 我使用 wordpress xmlrpc 源代码进行请求和处理响应 错误域 NSURLErrorDomain代码 1202 该服务器的证书无效 您可能正在连接
  • PMU x86-64 性能计数器未显示在 AWS 下的性能中

    我正在针对特定应用程序运行 C 基准测试 在此测试中 我在关键部分之前打开性能计数器文件 NR perf event open syscall 继续该部分 然后在读取指定的指标 指令 周期 分支 缓存未命中等 之后 我验证了这需要在 sud
  • 如何排除 ModelMultipleChoiceField 中的值?

    我不希望登录的用户显示在此 ModelMultipleChoiceField 上 以限制自己与自己创建以下关系 那么如何从查询集中排除登录用户 这可能是一个简单的修复 但我是 Django 新手 它已经让我困惑了几个小时 forms py
  • 在 if 语句之外使用变量

    我不完全确定这在 Java 中是否可行 但是我如何在声明它的 if 语句之外使用在 if 语句中声明的字符串 你不能因为变量范围 如果您在内部定义变量if声明 而不是它只在范围内可见if语句 其中包括语句本身以及子语句 if String
  • iPhone:在导航上强制将方向从纵向更改为横向

    有什么方法可以在导航时强制将应用程序方向从纵向更改为横向 我有一个要求 当将控制器从 A 推到 B 时 B 应该处于横向 但我的 A 控制器处于纵向 在 ViewController B 的 viewDidLoad 中添加以下代码行 UIA
  • 静态初始化

    当我编译代码时遇到问题 当我编译我的代码 foo2 var 在类 foo 中返回 null 时 我似乎不明白为什么 我在 foo2 类中进行静态初始化导致 foo2 var 在 foo 类中为 null 的方式是否有问题 任何帮助表示赞赏