2012-07-22 73 views
4

我有一些代码,我有一个变量,需要一个冗长的类声明。我想定义变量在页面的顶部,然后定义它如下:Java变量必须在其自己的范围内初始化?

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是一个接口,我使用JDK 1.6与Android和Eclipse。

定义bar立即工作就好:

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

您可能要考虑创建一个[SSCCE](http://sscce.org)。 – Jeffrey 2012-07-22 02:50:11

+0

我真的花了一些时间试图让这个问题看起来很漂亮..... – eternalmatt 2012-07-22 03:16:06

+0

SSCCE不是一个很好的问题,它是一个简短的代码示例,我们可以在我们的IDE中运行以查看您确切的问题,正如您看到的它。它可以帮助我们找出你的问题,所以我们可以更快地给你一个更好的答案 – Jeffrey 2012-07-22 03:18:49

回答

4

它不工作的原因是,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 */ }; 
} 
+0

哦,你是对的。我现在看到我有一些“独立代码”。我想我只是盯着这个问题太久了。 – eternalmatt 2012-07-22 03:17:53