1

私は小さなコードを書きました:

 System out = null;
 out.out.println("Hello");

これは正常に機能しており、コンソールに「Hello」と出力されています。

現在、私のプログラムまたは私のスコープには、名前を持つ 2 つのオブジェクトがありますout。1 つは のオブジェクトでSystem、もう 1 つは のオブジェクトですPrintStream

というコンパイラ エラー/ランタイム エラーが表示されないのはなぜDuplicate local variable out.ですか?

ここで何が欠けていますか?

4

3 に答える 3

5

outいいえ、System-type ローカル変数という名前のオブジェクトは 1 つだけです。もう1つは という名前out.outで、直接「スコープ内」ではありません。

これがコンパイル時エラーを引き起こす理由はありません。

(ちなみに、参照を介して静的メソッドを呼び出す/静的フィールドをnull参照することは、実際には良い習慣ではありません。かなり混乱します。)

于 2012-04-19T04:55:07.150 に答える
0

簡単にするために、クラスの静的フィールドにSystem合法的ですが、眉をひそめた方法でアクセスしています。System文字通りクラス名を使用する代わりに、タイプの変数で修飾することSystemです。これら 2 つの式はまったく同じ意味を持ちます。

((System)null).out.println("a");
System.out.println("a");
于 2012-04-19T07:33:13.817 に答える
0

同じスコープで同じ名前の 2 つの変数を宣言していません。out宣言したものはプログラムのスコープ内にあり、PrintWriter のoutものは System クラスで静的変数として宣言されています。

例えば..

class System {
  ....
  PrintWriter out ;
  ....
}

class YourClass{
  public void yourMethod()
  {
     System out = null;
     // as PrintWriter's out is declared as static, so you can call like this
     // without any run-time exception such as NullPointerException
     out.out.println("Hello"); 
  }
}
于 2012-04-19T05:04:39.220 に答える