2012-07-22 70 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