2003 -0220 ver 1.00 草稿開始 -0303 ver 1.10 サンプルプログラムのコメント修正,誤字修正 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/java/jmaga/      ┃ ┃'&┃&''*┃*''%┃%'      (C)2003 斎藤末広 jmaga@yscon.co.jp  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 7900部(まぐまぐ:6587 melma!:741 Pubzine:476             ティアラオンライン:19 めろんぱん:77) ★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ★バックナンバー :http://www.yscon.co.jp/j/java/jmaga/ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第38号 2003/02/20  インターフェース ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.4.0,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ========================================================================= 交換広告(交換希望の方は,jmaga@yscon.co.jpまで) ==PR================================================================== ==================================================================PR== ======================================================================== ▼ インターフェース  インターフェース(interface)は,一般的には,ものともの,ものと人間との やりとりのやり方を指します。「この携帯電話のインターフェースがよい」とい うときは,この携帯電話の操作性が良いという意味になります。コンピュータ の世界では,コンピュータの操作性を指したり,コンピュータと他の機器との 接続口を指したりします。Java の世界で,インターフェースというのは,くせ 者です。Jマガでは,このインターフェースを「クラスもどき」と今まで呼ん できました。この号では,このインターフェースを扱います。 ------------------------------------------------------------------------ ▼ 単純な例  インターフェース(interface)を利用していない簡単なプログラムを元に,それ にインターフェースを追加してましょう。  まず,インターフェースを利用していない例です。 例 j38-01 xDay01.java Dateクラスを利用した簡単な例 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xDay01.java 1: // Dateクラスを利用した簡単な例 2: 3: import java.util.Date; 4: 5: public class xDay01{ 6: 7: public static void main(String[] xargs){ 8: 9: Date xday = new Date(); 10: System.out.println(xday); 11: 12: } 13: }  このプログラムは,Date クラスから,xday というインスタンスを生成して, それを表示しています。  通常の Java の入門書では,クラスは設計書で,インスタンスは,それをもと にして,作成された,製品であると説明しています。Jマガでは,クラスは,本 体で,インスタンスは,分身であると言ってきました。これは,孫悟空がクラス で,孫悟空の髪の毛から生まれた分身がインスタンスという意味です。  --Jマガローカル規則 -------------------------------------  本体と分身   クラス    本体 設計図   インスタンス 分身 設計図を元にして作った製品  ==================================== Jマガローカル規則 ==  --Jマガローカル規則 -------------------------------------  名前の付け方   x で始まっている名前,また,ローマ字の名前は,Java です でに決まっている名前でははない。自分で好きな名前に変更可能  ==================================== Jマガローカル規則 ==  -- Java 規則 ---------------------------------------------  インスタンス生成   クラス インスタンス名;   インスタンス = new 構築子(引数);  構築子(コンストラクタ)名は,クラス名と同一  ============================================= Java 規則 ==  --Jマガローカル規則 -------------------------------------   規則の定義で,名が付くとき,付かないとき  int a = 3 + 2;  を,  型 変数名 = 整数;  と表現する,"名"が付いているときは,その名前自体をここで宣  言する。"名"がついていないものは,実体として,それをなれば  よいことを示す。  ==============================================Jマガ規則== ------------------------------------------------------------------------ ▼ 継承  xDay01.java を元にして,Date クラスに性別を付加してみましょう。このよ うに,一つのクラスに特定の機能を付け加える時には,継承(extends)を使いま す。  -- Java 規則 ---------------------------------------------  継承の定義(子クラス)の仕方   class クラス名 extends 親クラス { 追加する変数; 追加・上書きするメソッド; }  ============================================= Java 規則 == 例 j38-02 xDay02.java Date クラスに性別メソッドを付加。継承を利用 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xDay02.java 1: // Date クラスに性別メソッドを付加。継承を利用 2: 3: import java.util.Date; 4: 5: class xDay extends Date{ 6: public String getSeibetu(){ 7: return "男"; 8: } 9: } 10: 11: public class xDay02{ 12: public static void main(String[] xargs){ 13: xDay xday = new xDay(); 14: System.out.println(xday); 15: System.out.println(xday.getSeibetu()); 16: } 17: }  Date クラスを親クラスとして,xDay クラスを 5: class xDay extends Date{ 6: public String getSeibetu(){ 7: return "男"; 8: } 9: } として,定義します。これを,Date クラスを継承して,xDay クラスを定義した といいます。こうすることで,Date クラスのすべての性質を受け継ぎ,さらに, getSeibetu() というメソッドを追加で定義しました。 13: xDay xday = new xDay(); 14: System.out.println(xday); 15: System.out.println(xday.getSeibetu());  のところでは,xDay クラスのインスタンス xday を生成して,それを表示して います。  同じように,Thread クラスにも性別を付加しましょう。 例 j38-03 xIntFace00.java Date 2つのクラスに性別を付加。継承を利用 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xIntFace00.java 1: // 2つのクラスに性別を付加。継承を利用 2: 3: import java.util.Date; 4: 5: class xDay extends Date{ 6: public String getSeibetu(){ 7: return "男"; 8: } 9: } 10: 11: class xThread extends Thread{ 12: public String getSeibetu(){ 13: return "女"; 14: } 15: } 16: 17: public class xIntFace00{ 18: public static void main(String[] xargs){ 19: xDay xday = new xDay(); 20: System.out.println(xday); 21: System.out.println(xday.getSeibetu()); 22: 23: xThread xthkeeper = new xThread(); 24: System.out.println(xthkeeper); 25: System.out.println(xthkeeper.getSeibetu()); 26: 27: } 28: }  このプログラムでは,Thread クラスを継承して,xThread クラスを定義して います。xThraed クラスには,女という性質を付け加えました。 5: class xDay extends Date{ 6: public String getSeibetu(){ 7: return "男"; 8: } 9: } と 11: class xThread extends Thread{ 12: public String getSeibetu(){ 13: return "女"; 14: } 15: }  で,ほぼ同様に定義していますが,12行目で,getSeibetu() の代わりに, getSex() としても別にかまいません。もし,ここで,getSex() とした場合, 25: System.out.println(xthkeeper.getSeibetu());  の xthkeeper.getSeibetu() は,xthkeeper.getSex() になります。  このように,性別を付加していくときに,ある時は,getSeibetu() ,ある時は getSex()となるとプログラム作成のときに不便になります。統一されていた方が 分かりやすいです。性別を知るためのやり方を統一するために,インターフェー スという機能を使います。 ------------------------------------------------------------------------ ▼ インターフェース  ここで,いよいよインターフェースの登場です。次のように「インターフェー ス」を利用すると,メソッド名を統一することができます。 例 j38-04 xIntFace01.java Date インターフェースを利用した基本プログラム ソース http://www.yscon.co.jp/j/java/jmaga/j38/xIntFace01.java 1: // インターフェースを利用した基本プログラム 2: 3: import java.util.Date; 4: 5: interface Seibetu{ 6: String man = "男"; 7: String woman = "女"; 8: String getSeibetu(); 9: } 10: 11: class xDay extends Date implements Seibetu{ 12: public String getSeibetu(){ 13: return man; 14: } 15: } 16: 17: class xThKeeper extends Thread implements Seibetu{ 18: public String getSeibetu(){ 19: return woman; 20: } 21: } 22: 23: public class xIntFace01{ 24: 25: public static void main(String[] xargs){ 26: xDay xday = new xDay(); 27: System.out.println(xday); 28: System.out.println(xday.getSeibetu()); 29: 30: xThKeeper xthkeeper = new xThKeeper(); 31: System.out.println(xthkeeper); 32: System.out.println(xthkeeper.getSeibetu()); 33: } 34: }  インターフェースを使った定義の部分は, 5: interface Seibetu{ 6: String man = "男"; 7: String woman = "女"; 8: String getSeibetu(); 9: }  5 行目の interface を class にすると,クラス の定義とほぼ同じになります。  -- Java 規則 ---------------------------------------------  クラスの定義の仕方   class クラス名 { 型 変数名; メソッド名(引数の並び){ メソッドの内容; }; }  ============================================= Java 規則 ==  -- Java 規則 ---------------------------------------------  インターフェースの定義の仕方   interface クラス名 { 型 変数名; メソッド名(引数の並び); }  ============================================= Java 規則 == クラスの定義との違いは,メソッドの実際の仕事の記述がないことです。 8: String getSeibetu();  で,実際の getSeibetu() の仕事の中身を何も定義していません。ここでは, 性別を知るための,getSeibetu というメソッドの名前と,()の中は,何もない ことを定義しています。このようにメソッドの中身を定義せずに,メソッドの名 前と()の中のパターンのみ定義されたメソッドを,抽象メソッドといいます。  この抽象メソッドは, 11: class xDay extends Date implements Seibetu{ 12: public String getSeibetu(){ 13: return man; 14: } 15: }  で,具体化されます。この Seibetu() という(日本語でいう意味での)インター フェースを具体化するということで,implements(実装)という用語が,11 行目 に使われています。  12 行目から14 行目で,return man だけですけが,getSeibetu() のメソッド の具体的な仕事が定義されましています。。  -- Java 規則 ---------------------------------------------  インターフェースの実装の仕方   class クラス extends 親クラス implements インターフェース{ 実際の仕事; }  「extends 親クラス」は継承が無いときは,省略可能。  ============================================= Java 規則 ==  xIntFace01.java の 12 行目で,getSeibetu() の代わりに,getSex() と書い たり,また,このメソッド自体を無くしてしまうと,コンパイルエラーになりま す。このxDay の定義のところで,implements Seibetu と書いた以上,必ず, getSeibetu()の中身が定義されなくはいけません。  このように,インターフェース(interface)を利用すると,メソッド名を統一 することができます。(クラスもどきの)インターフェースという機能は,クラス に特定の(本来の意味での)インターフェースを付加する機能といえます。  -- Java 規則 ---------------------------------------------  抽象メソッド   メソッドの名前と引数の並びのみを定義されたものを,抽象メ  ソッドという。   使う前には,実装する必要がある。  ============================================= Java 規則 == ------------------------------------------------------------------------ ▼ 同じインターフェースを持つもの  xDay クラス と xThKeeper クラスに,性別を持たせることができました。この クラスから,生成されたインスタンスは,ともに,性別を持つものとして,グルー プ化して扱うことができます。  次の例を見てください。 例 j38-05 xIntFace02.java Date インターフェース変数の利用例 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xIntFace02.java 1: // インターフェース変数の利用例 2: 3: import java.util.Date; 4: 5: interface Seibetu{ 6: String man = "男"; 7: String woman = "女"; 8: String getSeibetu(); 9: } 10: 11: class xDay extends Date implements Seibetu{ 12: public String getSeibetu(){ 13: return man; 14: } 15: } 16: 17: class xThKeeper extends Thread implements Seibetu{ 18: public String getSeibetu(){ 19: return woman; 20: } 21: } 22: 23: public class xIntFace02{ 24: public static void main(String[] xargs){ 25: 26: xDay xday = new xDay(); 27: xThKeeper xthkeeper = new xThKeeper(); 28: 29: Seibetu xseibetuNoArumono; 30: 31: xseibetuNoArumono = xday; 32: System.out.println(xseibetuNoArumono); 33: 34: xseibetuNoArumono = xthkeeper; 35: System.out.println(xseibetuNoArumono); 36: 37: } 38: }  1 〜 22行目まで,xIntFace01.java と同じです。 29: Seibetu xseibetuNoArumono;  で,変数やインスタンスを宣言するやり方と同じように,やっています。  -- Java 規則 ---------------------------------------------  インターフェース変数の宣言  インターフェース インターフェース変数名;  ============================================= Java 規則 ==  このインターフェース変数の xseibetuNoArumono には,xday と,xthkeeperを 代入することができます。つまり,xday と xthkeeper は 性別のあるものとして 同じ仲間と見なされています。あるインスタンスとあるインスタンスを同じ仲間 と見なすというのは,本来のクラスの定義です。これが,今まで,Jマガでは, インターフェースを「クラスもどき」と呼んできた理由でもあります。インター フェースは,プログラムの中の記述では,まるで,クラスのように扱われます。  --Jマガローカル規則 -------------------------------------   Java の interface を「クラスもどき」と呼ぶ  =====================================Jマガローカル規則 == ------------------------------------------------------------------------ ▼ 「クラスもどき=インターフェース」の性質  クラスもどき(= interface )の性質を見てみましょう。 例 j38-06 xIntFace03.java クラスもどき(= interface) の性質 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xIntFace03.java 1: // クラスもどき(= interface) の性質 2: 3: import java.util.Date; 4: 5: interface Seibetu{ 6: String man = "男"; 7: String woman = "女"; 8: String getSeibetu(); 9: } 10: 11: class xDay extends Date implements Seibetu{ 12: public String getSeibetu(){ 13: return man; 14: } 15: // 独自の変数,メソッドを定義してもよい 16: String girlFrend = "スキッパー"; 17: public String getGirlFrend(){ 18: return girlFrend; 19: } 20: } 21: 22: public class xIntFace03{ 23: 24: public static void main(String[] xargs){ 25: 26: xDay xday = new xDay(); 27: 28: Seibetu xseibetuNoArumono; 29: 30: System.out.println(xday.getGirlFrend()); 31: 32: xseibetuNoArumono = xday; 33: 34: // System.out.println(xseibetuNoArumono.getTime()); エラー 35: System.out.println(xday.getTime()); 36: 37: System.out.println(xseibetuNoArumono.woman); 38: System.out.println(xday.woman); 39: System.out.println(Seibetu.woman); 40: 41: System.out.println(xseibetuNoArumono.getSeibetu()); 42: System.out.println(xday.getSeibetu()); 43: // System.out.println(Seibetu.getSeibetu()); コンパイルエラー 44: 45: } 46: }  クラスもどき(=interface)の性質をいつか見ていきましょう。 11: class xDay extends Date implements Seibetu{ 12: public String getSeibetu(){ 13: return man; 14: } 15: // 独自の変数,メソッドを定義してもよい 16: String girlFrend = "スキッパー"; 17: public String getGirlFrend(){ 18: return girlFrend; 19: } 20: }  インタフェースを実装(implement)するときに,追加して,独自の変数やメソッ ドを定義することができます。 32: xseibetuNoArumono = xday; 33: 34: // System.out.println(xseibetuNoArumono.getTime()); エラー 35: System.out.println(xday.getTime());  クラスもどき(=interface)の変数(インスタンス?)として,扱ったときは, 本来のクラスのメソッドは,利用できません。  34 行目は,// をとると,コンパイルエラーとなります。 37: System.out.println(xseibetuNoArumono.woman); 38: System.out.println(xday.woman); 39: System.out.println(Seibetu.woman);  この3行とも,"女"と表示されます。  このサンプルプログラムでは,扱っていませんが,この woman の中身を変更 することはできません。xseibetuNoArumono.woman = "女性" のするとコンパイル エラーとなります。 41: System.out.println(xseibetuNoArumono.getSeibetu()); 42: System.out.println(xday.getSeibetu()); 43: // System.out.println(Seibetu.getSeibetu()); コンパイルエラー  41,42行目は,実行されると,ともに,"男"と表示されます。43行目は, // をとるとコンパイルエラーとなります。  -- Java 規則 ---------------------------------------------  インターフェース変数  インターフェース変数を定義することができ,そこに,インター フェースを実装したクラスから生成された,インスタンスを代入す ることで出来る。  インターフェース変数から参照できるのは,インターフェースで 定義されているメソッドと変数のみ。インタフェースが実装されて いるクラスが持つメソッドと変数は参照できない。  ============================================= Java 規則 == ------------------------------------------------------------------------ ▼ ソースファイルの分割  同一インターフェースが,いろいろなクラスに追加される場合があります。 そのため,クラスもどき(=interface)は,別のソースファイルして,独立してあ ると便利です。 次のようにプログラムソースを分解することができます。 例 j38-07 Seibetu.java Date インターフェースのみ定義 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xSeibetu.java 1: // インターフェースのみ定義 2: 3: interface Seibetu{ 4: String man = "男"; 5: String woman = "女"; 6: String getSeibetu(); 7: } 例 j38-08 xDay.java xDayの定義 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xDay.java 1: // xDayの定義 2: 3: import java.util.Date; 4: 5: class xDay extends Date implements Seibetu{ 6: public String getSeibetu(){ 7: return man; 8: } 9: // 独自の変数,メソッドを定義してもよい 10: String girlFrend = "スキッパー"; 11: public String getGirlFrend(){ 12: return girlFrend; 13: } 14: } 15: 例 j38-09 xIntFace04.java 外部ファイルの利用 ソース http://www.yscon.co.jp/j/java/jmaga/j38/xIntFace04.java 1: // 外部ファイルの利用 2: 3: public class xIntFace04{ 4: 5: public static void main(String[] xargs){ 6: 7: xDay xday = new xDay(); 8: System.out.println(xday.getSeibetu()); 9: 10: } 11: }  この分割された,Javaのソースファイルをコンパイルするときは, > javac xIntFace04.java とすることで,Seibetu.java,xDay.java も自動的にコンパイルされます。ただ し,今回のプログラムでは,相互関係を特別に定義をしていませんので,同一の フォルダに保存しておく必要があります。  -- Java 規則 ---------------------------------------------  クラス,インターフェースのソースファイルの分割とコンパイル   クラス,インターフェースのソースファイルは,クラス,イン  ターフェース単位で分割することができきる。   コンパイルは,必要に応じて,引用利用されているものも自動  的にコンパイルがされる。  ============================================= Java 規則 ==  これでインターフェースの解説は終わります。 ------------------------------------------------------------------------ ▼ 次号の予定  次号では,配列の説明をします。  知りたいテクニック,また,解説してほしいクラスなどリクエストお寄せくだ さい。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,プログラムソースの利用は,商用を含めて,再利用,改変, 発表を制限しません。  画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利 用はできません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガに対するご意見をお待ちしています。ぜひ,ご返信下さい。 内容のレベルは 1 難しいのでもっと簡単にしてほしい 2 ちょうどよい 3 もっと難しくてもよい その他ご要望