下のコード内で説明して見ました
番号順に説明してあります
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 23:39