2013-04-24 38 views
3

這是很難精確搜索這一點。我已經在幾個地方看到了這一點,我甚至在代碼中試過它,看看它是如何工作的,但我知道如何使用它們,並確保我不會濫用它們,我想我會問在這。方法和循環中的內聯大括號塊

public void doSomethingSpecial() 
{ 

     String strHello = null; 

     // What is the following section in braces for 
     { 
      strHello = "Hello World" 
     } 

     for(int i = 0; i < 10; i++) 
     { 

      // What is the significance of them it in a loop? 
      { 
       strHello = "Hello"; 
       // Do something else... 
      } 
      . 
      . 
      . 
     } 
} 
  • 有人可以澄清這些撐塊括號呢?
  • 我假設它們就像一個方法一樣工作,只要沒有在塊外指定它,就會限制任何內容的範圍,但是還有其他用處嗎?
  • 它們的確切名稱是什麼?

預先感謝

+2

它們被用來限制範圍。你可以在循環外使用它們。在類體中,它們用作初始化塊,基本上與構造函數具有相同的用途。甲骨文:http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html – 2013-04-24 14:35:31

+0

看到一個問題,澄清可能的用法一點點在這裏:http://stackoverflow.com/questions/8185780/strange-行爲使用大括號在java?rq = 1 如果有任何其他原因或在方法內使用是不同的,我會保持問題活着。 – Skepi 2013-04-24 14:37:54

回答

1

撐杆限定範圍。例如,如果定義的大括號內的局部變量和一個值分配給它是這樣的:

{ 
int foo = 10; 

} 

然後Foo的範圍(即,代碼,其中它是定義和具有值的部分)被限制爲大括號內的區域。

您的for循環也是如此。在這些大括號中,櫃檯我被定義並具有含義,但不在外面。所以這段代碼無法編譯:

for (int i = 0; i < 5; i++) { 
    // Do something with i 
} 

i = 10; // Won't compile. i is undefined as a variable. 

這樣做的好處很多,因爲您可以精確地控制不同變量的範圍。您還可以定義之類的東西在異常處理的情況下例外,範圍等

你也可以做這樣的事情:

int i = 0; 

for (; i < 5; i++) { 
    // Do something with i. 
} 

for (; i < 10; i++) { 
    // Do something else with i 
} 

在這種情況下,我是在更大範圍內的空間定義(那些封閉的方法或構造函數)和for循環只是遞增它的值。所以你在兩個不同的範圍內共享一個變量。

最後,您可以在方法或構造函數之外使用它們作爲類中的初始化塊。它們允許您初始化成員變量,例如,不能用一行代碼輕鬆初始化。

+0

謝謝。 +1的幫助和努力。但是在循環中尋找它們的用法,而不是循環本身。我已經解決了它們在方法和循環中用於範圍的問題。 – Skepi 2013-04-24 15:05:39

+0

Skepi,很高興幫助。我的答案也適用於在for循環中的使用。您可以在for循環中定義額外的作用域,就像在方法或構造函數中一樣。 – CBass 2013-04-24 18:43:49

0

因此發現了一些我以爲我會在這裏發佈的任何人,因爲沒有其他問題似乎完全澄清這一點。

當外側類範圍使用的方法的:

public class doSomethingSPecial() { 
     { 
      System.out.println("This is a constructor"); 
     } 

     public doSomeThingSpecial() {} 

     public doSomethingSpecial(String specialString) { } 

     public doSomethingSpecial(int specialNumber) { } 
} 

「Java編譯器副本初始化塊分成每一個構造。因此,這種方法可以用來共享的多個構造之間代碼塊。 - Java API Tutorial(感謝Soririous Delimanolis)

所以內聯括號將每次調用構造函數被調用。

至於關於在方法和循環中使用的其他問題,大括號似乎只是爲了限制範圍。

「但在實踐中,如果你發現自己使用這樣的代碼塊這可能要重構該塊出來的方法的符號」 - 感謝羅伯特·蒙泰亞努Top Answer: Anonymous code blocks in Java

這基本上就是一切我已經想出了到目前爲止

1

在類中,它們形成一個靜態初始化器,它在加載類時運行一次,首先發生。

在該方法中,它們標記範圍。他們在你的代碼中基本沒用。

但如果代碼是以下

{ 
     String str = "test"; 
     System.out.println(str); 
    } 

    { 
     System.out.println(str); 
    } 

第二打印將報告編譯錯誤,因爲str的範圍是在第一個範圍。

+0

因此,在一個循環內,他們不會只運行一次,而是每次重複都會限制塊的範圍? – Skepi 2013-04-24 15:10:32

+0

是的。它的範圍在循環中,所以它將在每個循環中運行。 – Ryan 2013-04-24 15:16:35