2017-08-22 4 views
-2

突然静的な機能をテストするための簡単なプログラムを書いています。予期しない出力への説明

コードは、Javaであり、次のとおりです。このコードは与えた

class Demo{ 
    public static int Main(String[] ab){ 
     System.out.println("Hello Main"); 
     return 0; 
    } 
} 
public class New{ 
    public static void main(String[] ab){ 
     String abc[]={"1","2"}; 
     System.out.println("Hello"+Demo.Main(abc)); 
    } 
} 

出力は次のとおりです。

Hello Main 
Hello0 

私のロジックによると、この出力は

Hello Hello Main 
0 
でなければなりません

誰でもこのプログラムの予期しない出力を説明できますか?

ありがとうございます!

+1

「私のロジックによると、この出力がでなければならない」 - それはですあなたのロジックを教えてくれないときにあなたのロジックが間違っている理由を説明するのは難しいです。このプログラムは私が期待しているものを正確に表示しますが、なぜあなたが他の出力を期待するのかについての詳細情報がなければ、助けが難しいです。ヒント: 'System.out.println()'が 'main'の中で呼び出される前に' Demo.Main(abc) 'は完全に評価されます。同等のプログラムとして複数のステートメントに分割してみてください... –

答えて

2

あなたNew.main方法は、このライン

System.out.println("Hello" + Demo.Main(abc)); 

を実行ので、実際にprintlnを実行する前に、それはすべての引数を評価しなければなりません。したがって、最初にDemo.Mainを実行します。

System.out.println("Hello" + 0); 

、版画Hello0

:それはそれを実行すると0 Demo.Main(abc)は、それが実行を継続することができます0になりまし評価され、それは

System.out.println("Hello Main"); 
return 0; 

に遭遇したので、それがHello Mainを印刷し、新しい行を出力して返します

+0

ありがとう、それは私を助けました。 –

2

出力は完全に期待通りです。あなたが作った仮定は、あなたがDemo.Main()方法でしょうもリターンHello Mainだということですが、それは実際には、標準出力に書き込まれていることのように

が見えます。

ので、実行の順序は次のとおりです。

  1. main()
  2. Demo.Main()を呼び出されるが
  3. Demo.Main()こんにちは」を書き込むHello Mainmain()
  4. main()から0に戻りDemo.Main()
  5. 標準出力に書き込みを行うに呼び出されます"プラス0の結果が標準出力に出力されます
+0

ありがとう、それは私の多くを助けた。 –

0

最初に大括弧内のコードが実行されます。つまり、Demo.Main(abc)が最初に実行され、終了後に0が返されます。

つまり、最初にHello Mainがコンソールに表示されます。その後改行には

ザ・は出力された(実際に0である)Helloを印刷し、Demo.Main(abc)の戻り値を追加します:

Hello Main 
Hello0