2

私は Java で名前の検索を学んでおり、C++ から来て、Java でコードのブロックをいくつでもネストできる場合でも、最初のネストされたスコープでのみ名前を非表示にできることに興味を持ちました。

// name hiding-shadowing: local variables hide names in class scope

class C {

  int a=11;

  {
    double a=0.2; 

  //{
  //  int a;             // error: a is already declared in instance initializer
  //}

  }

  void hide(short a) {  // local variable a,hides instance variable
    byte s;
    for (int s=0;;);    // error: s in block scope redeclares a
    {
      long a=100L;      // error: a is already declared in (method) local scope
      String s;         //error: s is alredy defined in (method) local scope 
    }                   
  }

}

これは、C++ の観点からは奇妙です。必要なスコープの数をネストでき、変数を好きなように非表示にできるからです。これは Java の通常の動作ですか、それとも何か不足していますか?

4

2 に答える 2

9

これは「最初のネストされたスコープ」に関するものではありません。ローカル変数がフィールドを非表示にすることを許可しているが、別のローカル変数を非表示にすることを許可していない Java の問題です。おそらく Java の設計者は、そのような隠蔽は可読性に悪いと考えていました。

インスタンス初期化子のローカル変数の例ではエラーが発生しないことに注意してください。このコードは有効です。

class C {
  int a = 11;

  {
    // Local variable hiding a field. No problem.
    double a = 0.2;
  }
}
于 2015-09-28T09:25:12.647 に答える
3

私はC++の人ではありませんが、C++側から見ると本当に奇妙に見えます。私がデザイナーだったら、その動作を完全に削除します。それは本当にバグを引き起こし、コードを読みにくくします。

Java で平和な生活を送るために、そのような動作は完全に削除されます。今見ているようにそれをやろうとすると、コンパイラはエラーを表示します。

于 2015-09-28T09:26:20.057 に答える