2003 -0417 ver 0.01 サンプル作成開始 -0612 ver 0.02 サンプル終了 -0612 ver 0.90 脱稿 -0612 ver 1.00 発行 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/java/jmaga/      ┃ ┃'&┃&''*┃*''%┃%'      (C)2003 斎藤末広 jmaga@yscon.co.jp  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 7991部(まぐまぐ:6687 melma!:718 Pubzine:479             ティアラオンライン:18 めろんぱん:89) ★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ★バックナンバー :http://www.yscon.co.jp/j/java/jmaga/ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第43号 2003/06/12  抽象クラス ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.4.0,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ========================================================================= 交換広告(交換希望の方は,jmaga@yscon.co.jpまで) ----☆PR☆--------------------------------------------------------------           コンピュータ関係の資格を取りたい方へ              毎日届く,宿題メールの勉強仲間に入りませんか? ..&&&& **** %%%%. &&&&&&******%%%%%% 登録: http://backno.mag2.com/reader/Back?id=0000001414 '&┃&''*┃*''%┃%' 発行元:末広ページ http://www.3721p.com --------------------------------------------------------------☆PR☆---- ======================================================================== ▼ お知らせ(パズル出題,回答受付延長)  書籍『C言語のしくみ』が好評発売中の平田豊氏が,Jマガのために,パズル 作成してくれました。4月25日を締め切りとしていましたが,6月いっぱいに 締め切りを延長します。  正解者の中から3名の方に,平田豊氏の著書,もしくは,私の著書を一冊差し 上げます。  JavaScript または Java のソースを添付して,jmaga@yscon.co.jp までお送り 下さい。  メールに,希望書籍の番号,Jマガの感想・要望も書いて下さい。  プレゼント書籍(お好きなものを一冊選んで下さい)  1『C言語のしくみ』(平田 豊 著)     http://www.amazon.co.jp/exec/obidos/ASIN/4875934181/suehirospage-22  2『ソフトウェア開発技術者独習合格ドリル〈平成15年度〉』(平田 豊 著)     http://www.amazon.co.jp/exec/obidos/ASIN/4881663119/suehirospage-22  3『これからはじめるPerl&CGI入門ゼミナール』(平田 豊 著)     http://www.amazon.co.jp/exec/obidos/ASIN/4881662686/suehirospage-22  4『正規表現入門 』(平田 豊 著)     http://www.amazon.co.jp/exec/obidos/ASIN/4875932537/suehirospage-22  5『どこでも学べる初級シスアド午後』(斎藤末広 著)  出題者HP http://cgi3.tky.3web.ne.jp/~yutakakn/ [問題]  次の数式を満たすように空欄を数字で埋めよ。ただし、数字は 1 から 9 まで が使用でき、かつ各数字が使用できるのは一回のみとする。つまり、空欄には 1 から 9 までの数字が格納されることになる。また、解は何通りあるだろうか。    □□+□□□+□□□□=3717 [解答例]  97 + 158 + 3462 = 3717 締切 6/30(延長しました) ======================================================================== ▼ 抽象クラス  今回は,抽象クラスを説明します。これを使うとどういうメリットがあるか, 見ていきましょう。  前回の基本情報処理技術者試験に登場しました。試験においても重要項目です。 ------------------------------------------------------------------------ ▼ 一般的なクラスを利用したプログラム例  抽象クラスではない一般的なクラスを利用して,多角形の周囲の長さと面積を 求めるプログラムを考えてみましょう。  こんな感じで作成することができます。 例 j43-01 xAbs00.java ソース http://www.yscon.co.jp/j/java/jmaga/jsmp/j43/xAbs00.java 1: // 抽象クラスを含まない例 2: 3: import java.lang.Math; 4: 5: class TyokakuSannkakkei { 6: 7: private double a; 8: private double b; 9: 10: public TyokakuSannkakkei (double xa, double xb){ 11: a = xa; 12: b = xb; 13: } 14: public String toString(){ 15: return "この直角三角形の直角を挟む辺は," + a + ", " + b; 16: } 17: 18: public double mawari(){ 19: return a+b+(double)Math.sqrt(a*a+b*b); 20: } 21: 22: public double menseki(){ 23: return (a*b)/2; 24: } 25: } 26: 27: class Tyouhoukei { 28: 29: private float a; 30: private float b; 31: 32: public Tyouhoukei (float xa, float xb){ 33: a = xa; 34: b = xb; 35: } 36: 37: public String toString(){ 38: return "この長方形の辺は " + a + ", " + b; 39: } 40: 41: public double syuui(){ 42: return (a+b)*2; 43: } 44: 45: public float menseki(){ 46: return a*b; 47: } 48: 49: } 50: 51: public class xAbs00 { 52: public static void main(String xargs[]){ 53: 54: TyokakuSannkakkei tyosan = new TyokakuSannkakkei(3.0, 4.0); 55: Tyouhoukei tyou = new Tyouhoukei(6.0f, 7.0f); 56: 57: System.out.print(tyosan); 58: System.out.print (" 周囲:" + tyosan.mawari()); 59: System.out.println(" 面積:" + tyosan.menseki()); 60: 61: System.out.print(tyou); 62: System.out.print (" 周囲:" + tyou.syuui()); 63: System.out.println(" 面積:" + tyou.menseki()); 64: } 65: }  直角三角形クラス,長方形クラスを定義して,それぞれ,ひとつずつ,インス タンスを作成して,その,周囲の長さと面積を表示しています。  実行結果は, この直角三角形の直角を挟む辺は,3.0, 4.0 周囲:12.0 面積:6.0 この長方形の辺は 6.0, 7.0 周囲:26.0 面積:42.0  と表示されます。  直角三角形,長方形のクラスを比較してみましょう。 5: class TyokakuSannkakkei { 6: 7: private double a; 8: private double b; 9: 10: public TyokakuSannkakkei (double xa, double xb){ 11: a = xa; 12: b = xb; 13: } 14: public String toString(){ 15: return "この直角三角形の直角を挟む辺は," + a + ", " + b; 16: } 17: 18: public double mawari(){ 19: return a+b+(double)Math.sqrt(a*a+b*b); 20: } 21: 22: public double menseki(){ 23: return (a*b)/2; 24: } 25: }  と, 27: class Tyouhoukei { 28: 29: private float a; 30: private float b; 31: 32: public Tyouhoukei (float xa, float xb){ 33: a = xa; 34: b = xb; 35: } 36: 37: public String toString(){ 38: return "この長方形の辺は " + a + ", " + b; 39: } 40: 41: public double syuui(){ 42: return (a+b)*2; 43: } 44: 45: public float menseki(){ 46: return a*b; 47: }  意図的に,内部変数の型,メソッド名,そして,メソッドの返値の型を変えて います。その部分を抜き出して,表にすると次のようです。なお,double とfloat は,それぞれ,浮動小数点型の変数の型名です。double は,内部的に 64 ビット で表現されている倍精度,float は,32ビットで表現されている単精度です。 ------------------------------------------------------------- 直角三角形クラス 長方形クラス =============================================================  内部変数の型の違い 7: private double a; 29: private float a; 8: private double b; 30: private float b; ------------------------------------------------------------- メソッド名の違い(周囲の長さを求める) 18: public double mawari(){ 41: public double syuui(){ ------------------------------------------------------------- メソッドの返値の型の違い 22: public double menseki(){ 45: public float menseki(){ -------------------------------------------------------------  この2つのクラスを利用してインスタンスを生成して,周囲の長さ,面積を表 示しているところは, 51: public class xAbs00 { 52: public static void main(String xargs[]){ 53: 54: TyokakuSannkakkei tyosan = new TyokakuSannkakkei(3.0, 4.0); 55: Tyouhoukei tyou = new Tyouhoukei(6.0f, 7.0f); 56: 57: System.out.print(tyosan); 58: System.out.print (" 周囲:" + tyosan.mawari()); 59: System.out.println(" 面積:" + tyosan.menseki()); 60: 61: System.out.print(tyou); 62: System.out.print (" 周囲:" + tyou.syuui()); 63: System.out.println(" 面積:" + tyou.menseki()); 64: } 65: }  です。54,55 行目で,直角三角形クラス,長方形クラスのインスタンスを生成 しています。 54: TyokakuSannkakkei tyosan = new TyokakuSannkakkei(3.0, 4.0); 55: Tyouhoukei tyou = new Tyouhoukei(6.0f, 7.0f);  で,6.0f, 7.0f となっているのは,float 型の数値を表すためです。付けない と倍精度(double型)となりコンパイルエラーとなります。 57: System.out.print(tyosan); 58: System.out.print (" 周囲:" + tyosan.mawari()); 59: System.out.println(" 面積:" + tyosan.menseki()); 60: 61: System.out.print(tyou); 62: System.out.print (" 周囲:" + tyou.syuui()); 63: System.out.println(" 面積:" + tyou.menseki());  58,62 行目の周囲の長さを表示するところ,メソッド名が違うところに注目し て下さい。  実行結果は, この直角三角形の直角を挟む辺は,3.0, 4.0 周囲:12.0 面積:6.0 この長方形の辺は 6.0, 7.0 周囲:26.0 面積:42.0 でした。 ------------------------------------------------------------------------ ▼ 継承を利用したプログラム例  ここで,直角三角形クラス,長方形クラスを統一的に扱うために,親クラスと して,多角形クラスを追加して,直角三角形クラスと長方形クラスを,多角形ク ラスから継承してみます。 例 j43-02 xExtd01.java ソース http://www.yscon.co.jp/j/java/jmaga/jsmp/j43/xExtd01.java 1: // 継承によって,メソッドの返値型を統一 2: 3: import java.lang.Math; 4: 5: class Takakkei { 6: 7: public double syuui(){ 8: return 0.0; 9: } 10: 11: public double menseki(){ 12: return 0.0; 13: } 14: } 15: 16: class TyokakuSannkakkei extends Takakkei{ 17: 18: private double a; 19: private double b; 20: 21: public TyokakuSannkakkei (double xa, double xb){ 22: a = xa; 23: b = xb; 24: } 25: public String toString(){ 26: return "この直角三角形の直角を挟む辺は," + a + ", " + b; 27: } 28: 29: public double mawari(){ 30: return a+b+(double)Math.sqrt(a*a+b*b); 31: } 32: 33: public double menseki(){ 34: return (a*b)/2; 35: } 36: } 37: 38: class Tyouhoukei extends Takakkei{ 39: 40: private float a; 41: private float b; 42: 43: public Tyouhoukei (float xa, float xb){ 44: a = xa; 45: b = xb; 46: } 47: 48: public String toString(){ 49: return "この長方形の辺は " + a + ", " + b; 50: } 51: 52: public double syuui(){ 53: return (a+b)*2; 54: } 55: 56: public double menseki(){ // × public float menseki() だとエラー 57: return a*b; 58: } 59: } 60: 61: public class xExtd01 { 62: public static void main(String xargs[]){ 63: 64: TyokakuSannkakkei tyosan = new TyokakuSannkakkei(3.0, 4.0); 65: Tyouhoukei tyou = new Tyouhoukei(6.0f, 7.0f); 66: 67: System.out.print(tyosan); 68: System.out.print (" 周囲:" + tyosan.mawari()); 69: System.out.println(" 面積:" + tyosan.menseki()); 70: 71: System.out.print(tyou); 72: System.out.print (" 周囲:" + tyou.syuui()); 73: System.out.println(" 面積:" + tyou.menseki()); 74: } 75: }  追加した,多角形クラスは 5: class Takakkei { 6: 7: public double syuui(){ 8: return 0.0; 9: } 10: 11: public double menseki(){ 12: return 0.0; 13: } 14: }  のところです。中身の無いメソッド名,syuui() と menseki() を定義しました。  これを,直角三角形クラス,長方形クラスが継承することにより, xAbs00.java の表 ------------------------------------------------------------- 直角三角形クラス 長方形クラス =============================================================  内部変数の型の違い 7: private double a; 29: private float a; 8: private double b; 30: private float b; ------------------------------------------------------------- メソッド名の違い(周囲の長さを求める) 18: public double mawari(){ 41: public double syuui(){ ------------------------------------------------------------- メソッドの返値の型の違い 22: public double menseki(){ 45: public float menseki(){ ------------------------------------------------------------- のうち,「メソッドの返値の型の違い」が許されなくなりました。 56: public double menseki(){ // × public float menseki() だとエラー 57: return a*b; 58: } のところです。これは,親クラスの多角形クラスのメソッド menseki()を オーバライド(上書き)をしているため,返値の型が親クラスのメソッドの 返値の型と一致する必要があるからです。  メソッド名が同一である場合は返値の型は統一できますが,メソッド名の違い は,統一することはできません。親クラスと同じ名前のメソッド名(引数の型も含 む)の場合は,オーバライド(上書き)ということで,親クラスからの制約を受けま すが,別の名前の場合は,新たに,子クラスで定義されたとされて,制約を受け ないからです。 ------------------------------------------------------------------------ ▼ ロジックを集約  先ほどの継承をさらに進めて,親クラスにロジック部分を少し集めてみましょ う。  多角形の周囲の長さは,辺の長さをすべて足すことによって求めることができ ます。それぞれの辺の長さを配列に保存して,それを単純に足すというロジック で,直角三角形,長方形の周りの長さを求めることができます。そのプログラム は,以下のようになります。 例 j43-03 xExtd02.java ソース http://www.yscon.co.jp/j/java/jmaga/jsmp/j43/xExtd02.java 1: // 継承によって,ロジックの集約化 2: 3: import java.lang.Math; 4: 5: class Takakkei { 6: 7: double[] hen; 8: public double menseki(){ 9: return 0.0; 10: }; 11: 12: public double mawari(){ 13: double xm = 0; 14: for(int i=0;i