【问题标题】:Java variable must be initialized in its own scope?Java变量必须在自己的范围内初始化?
【发布时间】:2012-07-20 19:07:20
【问题描述】:

我有一些代码,其中有一个需要冗长的类声明的变量。我想在页面顶部定义变量,然后像这样定义它:

private IFoo bar;
/* seemingly irrelevant code */
bar = new IFoo() { /* a bunch of stuff */ };

但是我的 Java 编译器抱怨这不可能发生。它说前面一行的} 有语法错误(这真的没有意义,因为它在正确的位置)。

所以为了让编译器安静下来,我将变量的定义放在了更多 { } .我忘记了这种模式叫什么,但我知道它为什么存在并且在我的情况下不应该是必需的。

{
    bar = new IFoo() { /* a bunch of stuff */ };
}

无论如何,我想我的问题是,为什么我不能这样做 bar = new IFoo(){}; 而不是 { bar = new IFoo(){}; } ?

其他细节:IFoo 是一个接口,我在 Android 和 Eclipse 中使用 JDK 1.6。

立即定义 bar 就可以了:

private IFoo bar = new IFoo() { /* stuff */ };

【问题讨论】:

  • 您可能需要考虑创建一个SSCCE
  • 我真的花了一些时间试图让这个问题看起来很漂亮.....
  • SSCCE 不是一个漂亮的问题,它是一个简短的代码示例,我们可以在我们的 IDE 中运行它来查看您所看到的确切问题。它可以帮助我们找出您的问题,以便我们可以更快地为您提供更好的答案
  • class c{private Object o;o=new Object();}

标签: java variable-assignment


【解决方案1】:

它不起作用的原因是 Java 不允许独立的代码。您必须将代码放入方法、构造函数或初始化程序中。

这是一个初始化器:

private IFoo bar = new IFoo() { /* a bunch of stuff */ };

这是一个声明,后面跟着一个赋值:

private IFoo bar;
/* seemingly irrelevant code */
bar = new IFoo() { /* a bunch of stuff */ };

如果您的bar 是一个局部变量(那么您需要删除private),您可以在函数中执行此类操作。但是在类声明中是不允许的。

在赋值周围添加花括号使您的代码成为构造函数的一部分,再次允许赋值。这就是为什么以下任务有效的原因:

{
    bar = new IFoo() { /* a bunch of stuff */ };
}

【讨论】:

  • 哦,对了。我现在看到我有一些“独立代码”。我想我只是盯着这个问题太久了。
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
相关资源
最近更新 更多