質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1510閲覧

java interface使用のプログラムの流れが分かりません

naka28

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/02/10 14:32

###java言語です。

###コード、実行結果は下記のようになります。

###どうして実行結果の様になるのか分かりません。処理の流れを教えてください。宜しく御願い致します。

コード import java.util.ArrayList; import java.util.List; public class Sample { public static void main(String[] args){ LayoutBase layout = new LayoutBase(); layout.addChild(new GridLayout()); layout.addChild(new FlowLayout()); layout.flush(); } } interface Layout{ void addChild(Layout layout); void flush(); } class LayoutBase implements Layout{ String tag = "root"; List<Layout>child; public LayoutBase(){ child = new ArrayList<Layout>(); } public void addChild(Layout layout){ child.add(layout); } public void flush(){ System.out.println("</" + getTag() + ">"); for(Layout c:child){ c.flush(); } System.out.println("</" + getTag() + ">"); } String getTag(){ return tag; } } class GridLayout extends LayoutBase{ String getTag(){ return "GridLayout"; } } class FlowLayout extends LayoutBase{ String getTag(){ return "FlowLayout"; } }

###実行結果
</root>
</GridLayout>
</GridLayout>
</FlowLayout>
</FlowLayout>
</root>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下のコード内で説明して見ました
番号順に説明してあります

java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Sample { 5 public static void main(String[] args){ 6//①LayoutBaseオブジェクトのインスタンスを変数layoutに入れる 7//この時、new LayoutBase() してLayoutBaseオブジェクトのインスタンスを作成した時に 8//LayoutBaseクラスのコンストラクタである public LayoutBase(){}が呼ばれ 9//予めLayoutBaseクラス内で宣言されていた List<Layout> 型の変数child内に 10//new ArrayList<Layout>() が代入される 11 LayoutBase layout = new LayoutBase(); 12 13 14//②layout変数に入っているLayoutBaseオブジェクトのインスタンス内のaddChild()メソッドを呼び出す 15//引数にnew GridLayout(),new FlowLayout()を入れて二回実行する 16//この時、addChildメソッドの引数は public void addChild(Layout layout){のように 17//Layout型になっているため このメソッドの引数にはポリモーフィズムを用い 18//Layoutインターフェースをimplementsしたクラスを入れて呼び出す事ができる 19//二回呼び出した結果addChild内の操作により 20// List<Layout> 型の変数child内のインスタンスnew ArrayList<Layout>()内に 21//new GridLayout()・・・・クラスGridLayoutのインスタンスと 22//new FlowLayout()・・・・クラスFlowLayoutのインスタンスが一つずつ入る 23 24 layout.addChild(new GridLayout()); 25 layout.addChild(new FlowLayout()); 26 27//③layout変数に入っているLayoutBaseオブジェクトのインスタンス内のflush()メソッドを呼び出す 28//flushメソッド内での操作は 29//・・・・④に続く 30 31 layout.flush(); 32 } 33} 34interface Layout{ 35 void addChild(Layout layout); 36 37 void flush(); 38} 39class LayoutBase implements Layout{ 40 String tag = "root"; 41 42 List<Layout>child; 43 44 public LayoutBase(){ 45 child = new ArrayList<Layout>(); 46 } 47 48 public void addChild(Layout layout){ 49 child.add(layout); 50 } 51 52 public void flush(){ 53//④ </ と > の間にメソッドgetTag()の返り値が結合されて表示され改行される 54//getTag()の返り値とはString tag = "root";で代入されている値root 55//よって</root>が表示される 56 57 System.out.println("</" + getTag() + ">"); 58 59//⑤拡張for文により変数child内に入っているインスタンスが順にLayout型の変数cに代入されて{}内で実行される 60//c.flush();により各インスタンス内のflushメソッドが呼び出されるが、 61//flushメソッドは各オブジェクト(GridLayout,FlowLayout)ではオーバーライドされておらず、 62//それらが共通でextendsしているクラスLayoutBaseのみでオーバーライドされている 63//よって、これらのオブジェクトが入っているLayout型変数cからflushメソッドを呼び出した場合 64//ポリモーフィズムの働きによりLayoutBase内でオーバーライドされたflushメソッドが実行され 65//その呼び出されたそれぞれのオブジェクト(GridLayout,FlowLayout)内のflushメソッドは 66//その内部で</ と > の間にメソッドgetTag()の返り値が結合されて表示し改行する 67//この時、メソッドgetTag()はそれぞれのオブジェクト(GridLayout,FlowLayout)内でオーバーライドされており、 68//GridLayout内メソッドのgetTag()では"GridLayout",FlowLayoutメソッドのgetTag()では"FlowLayout" 69//を返す 70//その後それぞれのオブジェクト(GridLayout,FlowLayout)内のflushメソッドは 71// for(Layout c:child){ 72// c.flush(); 73// } 74//部分を実行しようとするが、この時GridLayout,FlowLayoutそれぞれのオブジェクト内では一度もaddChildメソッドが実行されていないので 75//これらのオブジェクト内のList<Layout>child;にはGridLayout,FlowLayoutそれぞれのオブジェクトの生成時のコンストラクタの動作 76//により生成されたnew ArrayList<Layout>()が入っているだけでこのインスタンス内には値が入っていない よって 77//上記拡張for文内では何も表示されず 78//その後のSystem.out.println("</" + getTag() + ">");により 79//</ と > の間にメソッドgetTag()の返り値 すなわち 80//GridLayout内メソッドのgetTag()では"GridLayout",FlowLayoutメソッドのgetTag()では"FlowLayout"が結合されて表示され改行される 81//これらがそれぞれのオブジェクト内にて順に実行され 82//</GridLayout> 83//</GridLayout> 84//</FlowLayout> 85//</FlowLayout> 86//と表示された後 87//上の⑤先頭部分の拡張for文を抜けて次の文に進み 88//</ と > の間にメソッドgetTag()の返り値が結合されて表示され改行される 89//getTag()の返り値とはこの場合String tag = "root";で代入されている値root 90//よって</root>が表示される 91//ここでmainメソッドで呼び出したflushメソッドが終了しmainメソッドが終わりプログラムは終了する 92 93 for(Layout c:child){ 94 c.flush(); 95 } 96 System.out.println("</" + getTag() + ">"); 97 } 98 String getTag(){ 99 return tag; 100 } 101} 102class GridLayout extends LayoutBase{ 103 String getTag(){ 104 return "GridLayout"; 105 } 106} 107class FlowLayout extends LayoutBase{ 108 String getTag(){ 109 return "FlowLayout"; 110 } 111}

投稿2017/02/10 17:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naka28

2017/02/10 23:39

swordoneさんが簡潔に、tetratailさんが具体的に解説して下さったので、両方でやっと理解できました。 ありがとうございました。これで眠れます。
guest

0

interface余り関係ないですが…
まずlayoutのflush()が実行されますので、layoutに対して

Java

1System.out.println("</" + getTag() + ">"); 2```が実行されます。layoutのgetTag()"root"を返すため、</root>が表示されます。 3次に、拡張for文でまず最初に追加したGridLayoutflush()が実行されます。 4GridLayoutの拡張for文に入る前の文で</GridLayout>が出力されます。 5その後GridLayoutの拡張for文に入りますが、GridLayoutには何も入っていないので何もせず抜けます。 6そして抜けた後の文で</GridLayout>が表示されます。 7追加されたGridLayoutのflushが終了し、layoutの拡張for文が次に進み、FlowLayoutのflushが実行されます。 8先ほどのGridLayoutの流れと全く同じ理由で、2</FlowLayout>が実行されます。 9ここでlayoutの拡張for文が終了し、layoutのfor文が終了します。 10そしてそのあとの文が実行され、</root>が出力されます。

投稿2017/02/10 16:41

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naka28

2017/02/10 23:39

swordoneさんが簡潔に、tetratailさんが具体的に解説して下さったので、両方でやっと理解できました。 ありがとうございました。これで眠れます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問