下面是一個有效的Java程序:放置任意大括號作爲語句 - 它們是什麼意思?
public class _ {
public static void main(String[] args) {
{
{
{
{
}
}
}
}
}
}
做那些花括號添加額外的語義?還是他們對待就像空白?
下面是一個有效的Java程序:放置任意大括號作爲語句 - 它們是什麼意思?
public class _ {
public static void main(String[] args) {
{
{
{
{
}
}
}
}
}
}
做那些花括號添加額外的語義?還是他們對待就像空白?
花括號只是在您的主要方法內創建一個本地塊範圍。在塊內聲明的變量在外面不可見。
這種編碼方式用於最小化局部變量的範圍。
public void someMethod() {
{
int x = 10;
System.out.println(x); // Ok
}
System.out.println(x); // Error, x not visible here
}
這是一個很好的做法,以儘量減少您所創建的局部變量的範圍,特別是當你知道他們不會在你的程序在其他地方使用。所以,讓它在更大的範圍內直到結束是沒有意義的。只需創建一個本地塊範圍,以便在塊結束後立即有資格獲得Garbage Collection
。
另請參閱@Bohemian's
下面的答案也引用一個更多的好處。
就GC而言,該對象在最後一次使用本地變量後立即符合條件。 HotSpot使用這個例程。 –
@MarkoTopolnik。那麼真正的原因是不能讓這個變量在不打算使用的地方使用?你能發表一些很好的理由嗎? –
是的,有時它有助於重用相同的var名稱,例如在使用大量相同類型的對象的GUI構建代碼中(例如'GridBagConstraints')。而且,作爲@bohemian筆記下面,他們是偉大的複製粘貼代碼:) –
花括號是爲了定義和限制範圍。由於他們沒有附上任何陳述或聲明,它們將被編譯器消除。
額外牙套的唯一目的是提供範圍限制。變量a
void ad()
{
int a;
}
將只有那些括號內的存在,並讓他們之外沒有範圍。
他們是一個代碼塊。他們可以方便的時候包含局部變量聲明的複製粘貼代碼:
{
int x = foo * bar;
someMethod(x);
}
{
int x = foo * y; // won't get "already defined variable" compile error
someMethod(x);
}
我也看到了他們用於代碼生成,這樣就可以了一些代碼安全地添加的方法和定義一個變量,而無需擔心它是否在方法的早期定義。
+1對於複製粘貼參數:) –
好的類名;-):'_ _o_ = new _();' – assylias
對Haskell,Python,...之間的Java不太確定,使用下劃線的程序員有隱含的含義'無所謂'。在Ruby中,它甚至具有編譯器的一些實際語義:http://po-ru.com/diary/rubys-magic-underscore/ – vemv
@assylias。爲什麼'_o_'作爲參考名稱?只是'_'會做 - >'_ _ = new _();'lol –