2012-04-19 33 views
1

私は小さなコードを書いています。エラーが表示されないのはなぜですか?

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

これは正常に動作し、コンソールでHelloを印刷しています。

は今私のプログラムや私のスコープで、名前out 一つはSystemのオブジェクトであり、他はPrintStreamの目的である持つ2つのオブジェクトがあります。

今、私の質問は、なぜ私はここに行方不明です何Duplicate local variable out.

というコンパイルエラー/ランタイムエラーを取得していないのですか? ありがとうございます。

+0

あなたの説明で参照する2番目の「out」を宣言するコードはどこですか? –

+0

Secound outは、Sysoで使用するPrintStreamのオブジェクトです。 – vikiiii

+0

それはそれをローカル変数にしません... –

答えて

5

いいえ、outという名前のオブジェクトがあります。System型のローカル変数です。もう1つはout.outという名前ですが、直接あなたの範囲にはありません。

コンパイル時にエラーが発生する理由はありません。

(ところで、静的メソッド/ nullの参照を経由して、静的フィールドを参照するの呼び出しは本当に良い習慣ではありません、それはかなり混乱します。)

+0

Thanks Mat.私は私の基本をクリアしたいと思っています。なぜこの質問をしたのですか。私はなぜ誰かが私を落札したのか分かりません。 – vikiiii

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"); 
    } 
} 
0

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

((System)null).out.println("a"); 
System.out.println("a"); 
関連する問題