JAVAコードの実行順番が理解できず困っています

このQ&Aのポイント
  • JAVAの実行順番が理解できず困っています。コードを実行すると『1、2、100、3』の順で表示されますが、4行目のラムダ式が実行されない理由が分かりません。
  • ラムダ式のインスタンス生成は行われるものの、5・6行目は実行されずに通過され、8・9行目の処理が行われます。そして9行目のメソッド呼び出しでラムダ式の実装部分が実行されます。
  • Javaの実行順番についての解説をネットで検索しましたが、見つからなかったため質問しました。実行順序についての解説をお願いします。
回答を見る
  • ベストアンサー

JAVAコードの実行順番が理解できず困っています

JAVAを勉強したての超初心者です。 以下のコードの実行順番が理解できず困っています。 1 public class Test { 2 public static void main(String[] args){ 3 System.out.println("1"); 4 Chara ch = (int num) -> { 5 System.out.println(num); 6 System.out.println("3"); 7 }; 8 System.out.println("2"); 9 ch.move(100); 10 } 11 } 12 @FunctionalInterface 13 interface Chara{ 14 void move(int num); 15 } 実行しますと『1、2、100、3』の順序で表示されますが、4行目のラムダ式の実装部分が実行されないのは何故なのか分かりません。 自分で考えた解釈としまして、4行目のラムダ式のインスタンス生成だけはするが、5・6行目は実行せず通過、8・9行目の処理を行い、9行目のメソッド(ch.move(100))呼出しでラムダ式の実装部分が実行されると思っています。 ネットで色々とJavaの実行順番の解説等を探してみましたが、見つからなく質問しました。 拙い文章で恐縮しますが、実行順序解説宜しくお願い致します。

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

>インスタンスを設定した変数chを使って、ch.move(100)でメソッドを呼び出して >System.out.println(num);とSystem.out.println("3");が実行される解釈で宜しいでしょうか? はい、あってます。

KakedasiKozou
質問者

お礼

基礎中の基礎の質問でお恥ずかしいですが、思い切って質問して本当に良かったと思っています。 理解できました。 ありがとうございました。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>4行目のラムダ式の実装部分が実行されないのは何故なのか分かりません。 「何故」といわれても4行目に書かれているのは、「 (int num) -> { System.out.println(num); System.out.println("3"); } のラムダ式のインスタンスを生成して、変数chにそのインスタンスを設定する。」 であって、「そのラムダ式を実行する」ではありませんから。

KakedasiKozou
質問者

補足

早速の回答ありがとうございます。 インスタンスを設定した変数chを使って、ch.move(100)でメソッドを呼び出して System.out.println(num);とSystem.out.println("3");が実行される解釈で宜しいでしょうか?

関連するQ&A

  • Javaの戻り値のコード

    Java初心者です。returnの例文で分からない所があります。 (1)考え方として car1.setNumGas(1234, 20.5); の時点で void setNumGas(int n, double g) はvoid setNumGas(1234, 20.5)になり 次にgetNum( ) そのものを引っ張ってきているので、 ナンバーを調べました という文字まで一緒に引っ張らないのでしょうか? なぜ 次の行のretun文だけを拾うのですか? (2)returnのイメージがまだ出来ていません。 int number = car1.getNum(); とした時点で int getNum()  にジャンプし、 その中の returnを見つけ、 そしてreturnが numを使っている所をコードを下に降りて順に探しに行く というイメージで合ってますか? -------------------------------------------------------------------- return num; →よーし探しに行こう! まずdouble getGas()の中 → うーんない 次にvoid setNumGas(int n, double g) の中 { num = n;    →   お、あった! nは今1234だな、だから表示結果は1234 --------------------------------------------------------------------------- こんな認識で合ってますでしょうか? class Car { int num; double gas; int getNum() { System.out.println("ナンバーを調べました。"); return num; } double getGas() { System.out.println("ガソリン量を調べました。"); return gas; } void setNumGas(int n, double g) { num = n; gas = g; System.out.println("車のナンバーを" + num + "にガソリン量を" + gas + "にしました。"); } void show() { System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } class Sample6 { public static void main(String[] args) { Car car1 = new Car(); car1.setNumGas(1234, 20.5); int number = car1.getNum(); double gasoline = car1.getGas(); System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは"+ number + "ガソリン量は" + gasoline + "でした。"); } }

    • ベストアンサー
    • Java
  • for文の実行結果について

    public class Trace2 { public static void main (String[] args) { int i; int num; num = 1; for (i = 0; i < 10; i++) { num += num; } System.out.println("iの値は" + i); System.out.println("numの値は" + num); } } 実行結果は iの値は10 numの値は1024になります。 何故こうなるのですか?

    • ベストアンサー
    • Java
  • ソースの実行の順番

    現在sjc-pの勉強を行っています。 JAVAがはじめてなので、以下の点でつまずいています。 すみませんが、アドバイスをお願いします。 以下のソースコードはどのような順番で処理されているのでしょうか? mainメソッドの実行の後は、newによってデフォルトコントラクタが呼び出された後、out.method()が呼ばれると思うのですが、これはどこを指しているのでしょうか? 基礎的な事で申し訳ないのですが、実行順番を下のソースコードを使用して解説して頂ければ助かります。 また、classに付与できるアクセス修飾子などが色々な状況において変化するので、理解できません。わかりやすい表になっているサイトなどはないでしょうか? よろしくお願いします。 class outerclass{ public void method(){ final int data1 = 100; final int data2 = 20; class innerclass{ void in_method(){ System.out.println(data1); System.out.println(data2); } } innerclass in = new innerclass(); in.in_method(); } } class test{ public static void main(String[] args){ outerclass out =new outerclass(); out.method(); } }

    • ベストアンサー
    • Java
  • java

    次のコード中の括弧内で下に示す11通りの各コードを実行した場合の実行画面を正確に答えよ。 class A{ public void func1(){System.out.println("A1");} public void func2(){System.out.println("A2");} } class B extends A{ public void func1(){System.out.println("B");} } class C{ public int x=0, y=1; } class D extends C{ public int x=2; public void func1(int x){System.out.println(x);} public void func2(int x){System.out.println(this.x);} public void func3(int x){System.out.println(super.x);} public void func4(int x){System.out.println(this.y);} public void func5(int x){System.out.println(super.y);} } class E{ public void func1(int n){ try{ System.out.println("E1"); int[] ary=new int[n]; System.out.println("E2"); }catch(NegativeArraySizeException e){ System.out.println("E3"); }finally{ System.out.println("E4"); } } } (1) A a=new A(); a.func1(); (2) A a=new B(); a.func1(); (3) B b=new B(); b.func1(); (4) B b=new B(); b.func2(); (5) D d=new D(); d.func1(3); (6) D d=new D(); d.func2(3); (7) D d=new D(); d.func3(3); (8) D d=new D(); d.func4(3); (9) D d=new D(); d.func5(3); (10) E e=new E(); e.func1(5); (11) E e=new E(); e.func1(-2); (1) A1 (2)B (3)B (4) A2 (5) 3 (6) 2 (7) 0 (8) 1 (9) 1 (10) E1E2E4(11) E1E3E4 と答えになるんですがなぜこうなるのかわかりません。教えてください

    • ベストアンサー
    • Java
  • 実行の順番を教えてください。

    現在JAVAの学習をおこなっていて、参考書で勉強しています。 しかし、以下の3つのソースコードはどの順番で実行されているか理解できておりません。 すみませんが、実行の順番を教えて頂けないでしょうか。 実行の順に数字を振ったりしていただけますと特に嬉しいです。 お願いします。 ※サンプル1 class testA{ testB b; testA(){ b=new testB(this); } } class testB{ testA a; testB(testA a){ this.a=a; } } class testAll{ public static void main(String args[]){ new testAll().banana(); //ソースコード } void banana(){ testA test = new testA(); } } ※サンプル2 public class A{ public static void apple(Integer i){ int ta =i.intValue(); ta+=3 ; i=new Integer(ta); } public static void main(String args[]){ Integer i = new Integer (0); apple(i); System.out.println(i.intValue()); } } ※サンプル3 public class Test{ public static void main (String args[]){ class orange{ public int i =9; } Object o=(Object)new orange(); orange orange = (orange)o; System.out.println("i="+orange.i); } }

    • ベストアンサー
    • Java
  • Scanner と BufferedReader

    javaでキーボードからの入力を格納するやつがあって、 Scanner と BufferedReaderのやり方がありますが、これはどう違うのでしょうか? それとも全く同じでしょうか? たとえば、 ■一つ目 import java.io.*; class Sample3{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列を入力してください"); String str1=br.readLine(); System.out.println("検索文字を入力してください"); String str2=br.readLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } ■二つ目 import java.util.Scanner; class Sample4{ public static void main(String[] args){ Scanner stdIn=new Scanner(System.in); System.out.println("文字列を入力してください"); String str1=stdIn.nextLine(); System.out.println("検索文字を入力してください"); String str2=stdIn.nextLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } これら2つは全く同じ実行結果が得られると思うのですが、 Scanner と BufferedReader の使い分けるべき場合などあるのでしょうか?

    • ベストアンサー
    • Java
  • java while文です。教えてください(__)

    public class mondai2{ //プログラム開始 public static void main(String args[]){ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int i; int ans=0; int seikai=0; for(i=0;i<5;i++){ try{ { Random ran = new Random(); int num1 = ran.nextInt(8)+1; int num2 = ran.nextInt(8)+1; ans = num1*num2; System.out.print("問題"+(i+1)+":"); System.out.print(num1 + "×" +num2 + "="); String s =in.readLine(); seikai = Integer.parseInt(s); if(seikai==ans){ System.out.println("正解"); }else{ System.out.println("不正解"); } } }catch(IOException e){ System.out.println("エラー"); } } } } このプログラムをwhile文か、do while文にして正解が出るまで問題が出続けるようにしたいんですけど、まったくわからなくて困っています>< 教えてください(+o+)

    • ベストアンサー
    • Java
  • for文の実行結果について

    public class Trace2 { public static void main (String[] args) { int i; int num; num = 1; for (i = 0; i < 10; i++) { num += num; } System.out.println("iの値は" + i); System.out.println("numの値は" + num); } } 実行結果は iの値は10 numの値は1024になります。 for文をfor (i = 0; i <= 10; i++) { に変えるとiの値は11でnumの値は2048になります。 i < 10はiが10より小さいときtrue、i <= 10はiが10以下のときtrue。 10より小さいと10以下の違いが解りません。 何故、i <= 10になるとiの値は11でnumの値は2048になるのでしょう?

    • ベストアンサー
    • Java
  • javaのプログラムについて

    java始めたばかりの者です。 class sample1 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j=0; j<i; j++){ System.out.println("*"); } System.out.println("\n"); } } } これを実行すると * * * * * * * * * * * * * * * こうなってしまい * ** *** **** ***** このようにするにはどうしたらいいのでしょうか??

    • ベストアンサー
    • Java
  • javaハノイの塔について

    public class hanoinotou { static void move(int n,int a,int b , int c) { if(n>1) move(n-1,a,c,b); System.out.println("円盤"+n+":"+a+"→"+c); if(n>1) move(n-1,b,a,c);} public static void main(String args[]){ move(3,1,2,3); } } ↑このプログラムの動き方を教えてください よろしくお願いします

専門家に質問してみよう