2016-12-19 69 views
-11

目前,我正在學習Java,並給予這似乎違背一個簡單的答案的問題:在Java中'{'符號(花括號)表示什麼?

什麼是Java中的以下符號的含義:{

當然,也有共同的含義:一個if聲明,for環,其他控制結構的主體。但是,這也可能是方法或初始化方法的開始 - 這些方法似乎沒有什麼共同之處。

我已經花了很多時間在Java的上下文中爲這個符號尋找一個單一的定義,但是還沒有找到足夠的東西。

什麼是在Java中開放大括號表示什麼是一個包羅萬象的定義?

+4

**主持人筆記**:我已經鎖定了這個問題,以阻止兩個派系似乎在通過關閉/刪除/重複刪除/重新開啓帖子來戰勝這個帖子的戰爭。如果任何一方關心這一點,請在[Meta]上發佈一個問題,以便就這個問題的信念達成共識。 –

+5

元討論在這裏:http://meta.stackoverflow.com/q/339881 –

+4

我已經編輯這個嘗試着重它; [新元討論可以在這裏找到](http://meta.stackoverflow.com/questions/340229/can-the-meaning-of-the-curly-brace-in-java-be-expressed-in-a-幾個段落)。 – Shog9

回答

15

來自你的老師的問題似乎並不那麼好,因爲在Java中{symbol沒有統一的含義。

在語句的上下文中,{符號用於表示塊語句的開始。這解釋了{if語句,while循環,for循環,do ... while循環,switch語句等在技術上僅適用於單個語句但通常與塊語句一起使用的所有用法:

if (x == 0) { 
    statementOne(); 
    statementTwo(); 
} 

在方法或類型(類/接口/枚舉/註釋)的上下文中,{符號用於表示一個類的主體或一個方法的開頭:

public class NewClass { 
    ... 

    public void foo() { 
     ... 
    } 
} 

它可以也可以在一個類中用來聲明一個初始化程序或靜態初始化程序塊:

class MyClass() { 
    static int x; 
    static { 
     x = somethingHorrible(); 
    } 
}; 

在數組文本的上下文中,{符號用於表示內部的文字中使用的元素的列表的開始:

int[] arr = new int[] {1, 3, 7}; 

各開括號符號的這些用途是從不同所有其他人。事實上,如果我們對這些不同的上下文使用不同的符號,那麼該語言就可以正常工作。

我認爲你的問題的最佳答案是{在一些事情將被視爲一個單元的上下文中使用,無論它是一個塊語句(許多語句被視爲一個單獨的語句),一個類很多方法和領域被視爲一個單一的對象),一種方法(許多語句被視爲一個統一的代碼片段),一個初始化程序(許多事情需要一次完成)等。

在大多數正如評論指出的那樣,這些上下文引入了一個新的範圍。語句塊,類體,初始化體和函數體都引入了一個新的範圍,這絕對是重要的一點。 (雖然數組初始化不這樣做。)

+2

雖然我認爲你寫了一個很好的答案,但我不同意這個問題是「不太好」。年輕程序員的一大障礙是理解* scope *的含義。在你提供的所有例子中,有一個相互聯繫,這是「新範圍的開始」。 [範圍](https://www.cs.umd.edu/~clin/MoreJava/Objects/local.html)是您在答案中提到的*上下文*。 – alfasin

+1

@alfasin大多數示例都是如此,但它不適用於數組文字初始化。不過,我確實看到你在說什麼。 – templatetypedef

+2

@alfasin其實,我越想越多,我就越贊同你。我相應地更新了我的答案。 – templatetypedef

-1

在Java中,當您打開大括號時,意味着您將打開一個新的範圍(通常它是嵌套範圍)。需要了解的一件重要的事情是,您將在該範圍內定義的變量(結束於大括號的大括號)將不會在範圍外被識別​​。

另一種方法是不正確的:如果你定義範圍以外的變量,然後打開一個新的變量將從嵌套的範圍內得到認可。

實施例:

int k = 5; 
if (true) { //opening a new scope 
    // k is recognized here! 
    int i = 10; 
} 
// here i is not recognized 

大括號是在某些情況下必須的,如:

  • 類聲明
  • 方法聲明

,有時它是可選的,例如:

  • 下一個ifwhilefor聲明

有在其中使用大括號很多其他情況:嵌套類,匿名類,初始化,靜態初始化等等。在每種情況下,我們都使用相同的語法(花括號),但它帶有不同的語義。

+1

如果downvoters和刪除選民會照顧評論...也許這個答案可以改善...... :) – alfasin

4

什麼是在Java中的開放大括號表示什麼是一個包羅萬象的定義?

沒有一個。我可以給你的最接近的東西是模糊的:

  • 「某種語言結構序列的開始,由一個大括號結束。」

的原因,沒有更精確給予定義是開括號是幾種不同的語言結構部分,包括至少(也許我錯過了一些):

值得注意的是,注意 Java中的每個構建涉及到一些東西大括號括起來的「塊」。上面鏈接的規範將「塊」定義爲由大括號包圍的零或更多的序列。它進一步定義一個BlockStatement爲或是一個local variable declaration,一個class declarationstatement。雖然這個定義涵蓋了大量使用大括號的Java結構 - 例如,static initializer是一個塊,並且forif語句的主體(如果用大括號括起來的話)是一個塊 - 它確實包含而不是覆蓋類體或數組初始化器,它們與塊有不同的內容。

{缺乏單一的,全面的定義應該不會令人驚訝或者在哲學上不令人滿意。想象下面這個類似的問題:

什麼是包含英文單詞「of」的全部定義?

當然,沒有這種包羅萬象的定義;相反,「的」是一個字many meanings。你可以做的最好的事情就是說「'是介詞」,或者像詞典一樣列舉單個的意思。

+0

你錯過了註釋 - https://docs.oracle.com/javase/specs/jls/se8/html /jls-9.html#jls-9.7.1 –

+0

儘管我並不是100%同意你的觀點,但我們不同的是觀點比事實更重要。你的回答比我的回答更加一致,「某種語言順序的開始......」或多或少與我想說的一致(即使我稱它爲一個塊),所以+1 –