JAVA入門⑧ クラス継承 簡単JAVA説明⑰ 1.クラスの継承 ①スーパークラスとサブクラス クラスの拡張 クラスは「拡張」することが可能です。 すでに存在するクラスをもとに、 ・新しいメソッド・フィールドの追加 ・メソッドの上書き ・新しいクラスの宣言 を可能とします。 クラスを拡張してできた新しいクラスを元のクラスの 「サブクラス」 逆に、もとのクラスを拡張してできた クラスの「スーパークラス」といいます。 簡単JAVA説明⑰ 拡張する側(をクラス)と見ると 拡張された側はサブクラス クラス サブクラス 拡張 ス-パー クラス クラス 拡張された側(をクラス)と見ると 拡張される側はスーパークラス 簡単JAVA説明⑰ 注意点 ・スーパークラスは1つ クラス拡張の際、スーパークラスは、最大1つ(親は一人!) 逆に、 ・サブクラスは複数作成可能です。 簡単JAVA説明⑰ 2.サブクラスの構文 class クラス名{ } } class サブクラス名 extends クラス名(=スーパークラス名){ } } 簡単JAVA説明⑰ // 例 Testクラスのクラス classTest{ int no; double score; void show(){ System.out.println("Noは" + no); System.out.println("点数は" + score); } } class KimatuTest extends Test{ } 簡単JAVA説明⑰ 3.継承 「サブクラスはスーパークラスのフィールド、メソッドを受け継ぐ」 このことを継承と言います。 1.フィールドの継承 クラス Testは no と scoreをフィールドとしてもっていまし たが、継承により、 KimatuTest もno と scoreをフィールドと して持つことになります。 KimatuTestの中に、 noとscoreが宣言されていなくても、 スーパークラスのフィールドが使えます。 簡単JAVA説明⑰ 例 class Sample1{ public static void main(String args[]){ KimatuTest kt = new KimatuTest(); kt.no = 11; kt.score = 75; kt.show(); } } 簡単JAVA説明⑰ 実行結果 Noは11 点数は75.0 簡単JAVA説明⑰ 4.メソッドの継承とコンストラクタ 実は、前sample1でもう示しましたが、メソッドvoid show()がすで に継承されておりました。 サブクラス KimatuTestでは、 void show()は宣言されていませんが、kt.show();で用いられていまし た。 フィールドとメソッドが継承されることは今述べたとおりですが、 コンストラクタは継承されません。 簡単JAVA説明⑰ class Test{ int no; double score; Test(){ no = 0; score = 0.0; } Test( int no, double score){ this.no = no; this. score = score; } 簡単JAVA説明⑰ void show(){ System.out.println("Noは" + no); System.out.println("点数は" + score); } } class KimatuTest extends Test{ } 簡単JAVA説明⑰ class Sample2{ コンストラクタ 継承 public static void main(String args[]){ KimatuTest kt = new KimatuTest(1,23); kt.show(); kt.no = 11; kt.score = 75; コンパイルエラー kt.show(); } } 簡単JAVA説明⑰ この場合、下記のようにコンパイルエラーになります。 Sample2.java:27: シンボルを見つけられません。 シンボル: 変数 kt 場所 : Sample2 の クラス kt.show(); ^ Sample2.java:28: シンボルを見つけられません。 シンボル: 変数 kt 場所 : Sample2 の クラス kt.no = 11; ・・・・ エラー 4 個 簡単JAVA説明⑰ 5.コンストラクタの自動的な呼び出し 以下の例を見てください。 class Test{ int no; double score; Test(){ no = 0; score = 0.0; } Test( int no, double score){ this.no = no; this. score = score; } 簡単JAVA説明⑰ class KimatuTest extends Test{ String name; KimatuTest(){ name = "No Name"; } KimatuTest( String name){ this.name = name; } } このサブクラスKimatuTestはフイールドnameを“No Name”で初 期化しています。このときの初期化はnameだけでしょうか? 簡単JAVA説明⑰ 実は、コンストラクタの初めてでは自動的に、スー パークラスの引数なしのコンストラクタが自動的 に呼び出されると決まっています。 class KimatuTest extends Test{ String name; KimatuTest(){ *** name = "No Name"; } KimatuTest( String name){ *** this.name = name; } } 簡単JAVA説明⑰ ***の部分に Test(){ no = 0; score = 0.0; } が入っているのと同じことになっています。 簡単JAVA説明⑰ 6.スーパークラスのコンストラクタの明示的な呼び出し コンストラクタの中から、スーパークラスの引数付きコンストラク タを呼び出したいときもあります。スーパークラスのコンストラク タを呼びだす表記法としてsuper()があります。引数付きコンスト ラクタを呼びだす場合には、super(3、40 ); と書きます。 Sample3 参照してください。 class Test{ int no; double score; Test(){ no = 0; score = 0.0; } Test( int no, double score){ this.no = no; this. score = score; } void show(){ System.out.println("Noは" + no); System.out.println("点数は" + score); } } class KimatuTest extends Test{ String name; KimatuTest(){ name = "No Name"; } KimatuTest(String name){ super(11, 75); this.name = name; } void showk(){ System.out.println("名前は" + name); } } class Sample3{ public static void main(String args[]){ KimatuTest kt = new KimatuTest(); kt.show(); kt.showk(); KimatuTest ktt = new KimatuTest("渡辺"); // // ktt.no = 11; ktt.score = 75; ktt.show(); ktt.showk(); } } 簡単JAVA説明⑰ 実行結果 Noは11 点数は75.0 名前はNo Name Noは11 点数は75.0 名前は渡辺 注)なお、 super(11, 75);を加えることは、 メイン(Sample3)でコメントアウトしてある ktt.no = 11; ktt.score = 75; を行うことに該当しています。 簡単JAVA説明⑰ 7.明示的なコンストラクタの呼び出し② 明示的なコンストラクタの呼び出しとして this(); もあります。 サブクラス KimatuTestで name = "No Name"; =>this("No Name“); とします。これは 自身のコンストラクタ呼び出し です。 簡単JAVA説明⑰ class KimatuTest extends Test{ String name; KimatuTest(){ this("No Name“); } KimatuTest(String name){ super(11, 75); this.name = name; } void showk(){ System.out.println("名前は" + name); } } 簡単JAVA説明⑰ 8.継承とIS-A関係 サブクラスがス-パ-クラスの性質を受け継ぐ ということを、別の言い方をすれば 「サブクラスはス-パ-クラスの一種である」 と言います。この関係のことを「IS-A関係」といいます。 簡単JAVA説明⑰ 9.HAS-A関係 String型のフィールドは、 String型のインスタンスでもあります。 インスタンスをフィールドとして持つと、そのインスタンスを自分 のものとして扱うことが可能です。このような関係を 「HAS-A関係」と言います。「合成」とも言います。 簡単JAVA説明⑰ 10.オーバーライド 今までのところでは、 クラス=>継承可能+新たなメソッドを追加という処理を見てきま したが、継承したフィールド、メソッドを変更することも可能です。 この変更をオーバーライドと言います。 例えば、スーパークラスのメソッドをサブクラスでも同じメソッド を宣言します。 簡単JAVA説明⑰ class Test{ int no; double score; Test(){ no = 0; score = 0.0; } Test( int no, double score){ this.no = no; スーパークラスの this. score = score; void show() } void show(){ System.out.println("Noは" + no); System.out.println("点数は" + score); } } 簡単JAVA説明⑰ class KimatuTest extends Test{ String name; KimatuTest(){ this("No Name“); } KimatuTest(String name){ super(11, 75); this.name = name; サブクラスの void show() } void show(){ System.out.println("名前は" + name); } } 簡単JAVA説明⑰ class Sample4{ public static void main(String args[]){ KimatuTest kt = new KimatuTest(); kt.show(); KimatuTest ktt = new KimatuTest("渡辺"); ktt.show(); } } 簡単JAVA説明⑰ 実行結果 名前はNo Name 名前は渡辺 解説) オーバーライドすると、サブクラスの方のvoid show()が 呼び出されることになります。 簡単JAVA説明⑰ 問い メインを書き換えて 次の結果にするには? Noは1 点数は75.0 名前は渡辺 簡単JAVA説明⑰ 答え class Sample5{ public static void main(String args[]){ Test kt = new Test(1,75); kt.show(); KimatuTest ktt = new KimatuTest("渡辺"); ktt.show(); } } 簡単JAVA説明⑰ 11.あとがき 継承の後、オーバーロードを習うと混乱するか と思います。特にSample5(テキストのSample6) は混乱を引き起こす気がしてます。 ※Sample5 (テキストのSample6)の考え方としては (継承、オーバーロードを無視して)使いたいメソッドの あるクラスを生成してその(使いたい)メソッドを呼び出 せばいいと考えればよいわけです。
© Copyright 2024 ExpyDoc