2016-12-19 5 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文などのすべての用途を説明していますが、技術的には単一の文にしか当てはまりませんが、ブロック文でよく使用されます:

public class NewClass { 
    ... 

    public void foo() { 
     ... 
    } 
} 

それができる:方法又はタイプ(クラス/インタフェース/列挙/アノテーション)の文脈において

if (x == 0) { 
    statementOne(); 
    statementTwo(); 
} 
、{記号はクラスの本体又は方法の開始を示すために使用されていますまた、クラス内で初期化子または静的初期化子ブロックを宣言するために使用することもできます。

リテラル配列の文脈において

は、{シンボルがリテラル内で使用される要素のリストの開始を示すために使用されている:

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

オープンブレースシンボルのこれらの使用は、それぞれ異なっています他のすべて。実際には、これらのさまざまなコンテキストごとに異なるシンボルを使用すると、言語はうまく動作します。

あなたの質問に対する最良の答えは、ブロックステートメント(1つとして扱われる多くのステートメント)、クラス(1つのクラスとして扱われるステートメント) 1つのオブジェクトとして扱われる多くのメソッドとフィールド)、メソッド(単一の統一コードとして扱われる多くのステートメント)、イニシャライザ(多くのことをすぐに行う必要がある)などがあります。

これらの文脈は、コメントが指摘しているように、ブレースは新しいスコープを導入します。ステートメントブロック、クラス本体、初期化子本体、関数本体はすべて新しいスコープを導入しています。それは間違いなく留意すべき重要なものです。 (配列の初期化はこれを行いません)

+2

あなたが良い答えを書いたとは思いますが、私はその質問が「それほど偉大ではない」という意見については反対しています。若いプログラマーの大きな障害の1つは、スコープ*の意味を理解することです。あなたが提供したすべての例では、1つの相互接続があり、それは「新しいスコープの始まり」です。 [範囲](https://www.cs.umd.edu/~clin/MoreJava/Objects/local.html)は、あなたが答えで述べる*コンテキスト*です。 – alfasin

+1

@alfasinこれはほとんどの例で当てはまりますが、配列リテラルの初期化では保持されません。私はあなたが言っていることを見ている。 – templatetypedef

+2

@alfasin実際、それについて考えるほど、私はあなたに同意します。私はそれに応じて私の答えを更新しました。 – templatetypedef

-1

中括弧を開くと、新しいスコープ(通常は入れ子スコープです)を開くことを意味します。理解しておくべき重要なことの1つは、このスコープ内で定義する変数(終了中括弧を配置する場所で終わる変数)がスコープ外で認識されないことです。

他の方法はそうではありません。スコープの外に変数を定義して新しい変数を開くと、その変数は入れ子スコープの内側から認識されます。

例:

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

中括弧のような、いくつかの場合には必須である。

  • クラス宣言
  • メソッド宣言

、時にはそれは、例えば、任意です:

whilefor文次

中括弧が使用されている他の多くの例がある:ネストされたクラス、匿名クラス、初期化子、静的初期化子とよりは。いずれの場合も、同じ構文(中括弧)を使用しますが、異なるセマンティクスを持ちます。

+1

downvotersとdelete有権者がコメントする気になるなら、おそらくこの答えは改善されるかもしれません... :) – alfasin

4

オープン中括弧がJavaで示していることの包括的な定義とは何ですか?

ありません。私はあなたを与えることができる最も近いものは漠然と何かのようである:「右中括弧で終了し、言語コンストラクトのシーケンスのいくつかの並べ替えの開始」

ない単一定義が与えられるより正確があることの理由は、開口ブレースは、少なくとも(おそらく私はいくつかを逃した)を含む、いくつかの異なる言語構造の一部であるということである。

重要なことに、ではない Javaのすべての構成要素に中括弧で囲まれたものが含まれているすべての構成要素が「ブロック」であることに注意してください。上にリンクされているこの仕様は、0以上の中かっこで囲まれたシーケンスとして "ブロック"を定義しています(BlockStatement)。さらにBlockStatementは、local variable declarationclass declaration、またはstatementのいずれかとして定義されています。この定義では、中括弧を使用する多くのJava構造体について説明しています。例えば、static initializerはブロックで、forまたはifのステートメントは、中括弧で囲まれたブロックであり、ではありません。配列初期化子。ブロックとは内容が異なります。

{の単一の包括的な定義の欠如は、驚くべきことでも、哲学的にも不十分であってはなりません。

「of」という単語が英語で示していることを包括的に定義しているものは何ですか?

もちろん、このような包括的定義はありません。むしろ、 "of"はmany meaningsという単語です。あなたがすることができる最高のものは、 ""が前置詞であると言ったり、辞書のように個々の意味を列挙することです。

+0

あなたは注釈を見逃しました - https://docs.oracle.com/javase/specs/jls/se8/html /jls-9.html#jls-9.7.1 –

+0

私は100%あなたに同意するわけではありませんが、私たちが違うところは事実よりも意見の問題です。あなたの答えは私のものよりも一貫していて、「ある種の言語シーケンスの始まり」は、私が(ブロックと呼んでも)言いたいことに多かれ少なかれているので、+1 –

関連する問題