第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀 7.1 インターフェイス(1) インターフェイスとは・・・ 「特定の機能概要」を定義したものが記述される 機能概要のため、宣言のみ 同一インターフェイスを実装したクラスは「その機能概 要」が共通している 「abstract」と類似性があるが・・・ →目的、使い方は異なる(説明は別頁) 7.1 インターフェイス(2) 「abstract」やクラスの継承では・・・ 多重継承が認められていない (一つのクラスへ複数のスーパークラスを継承するこ とが出来ないこと) サブクラスとスーパークラスとの間に「クラス」の関係 があること(型、オブジェクトの関係) 逆にインターフェイスの場合・・・ 複数のインターフェイスを実装可能 クラス関係は無いため自由にクラスへ実装できる 7.1 インターフェイス(3) インターフェイスの宣言(一般形式) intfModifier interface intfName{ varModifier1 type1 varName1=value1 ; ・ ・ ・ varModifierN typeN varNameN=valueN ; mthModifier1 rtype1 mthName1(params1) ; ・ ・ ・ mthModifierN rtypeN mthNameN(paramsN) ; } interfaceの修飾子intfModifier。 この修飾子を省略すると、同 パッケージ内でのみ参照可。 メソッドの修飾子も別に指定可 だが、インターフェイス変数に関 しては特に指定が無い限り、 public,static,finalとして扱われ、 強制的に静的定数値となる。 7.1 インターフェイス(3) implementsキーワード インターフェイスをクラスに実装するためのキーワード 実装時の一般形式記述 clsModifiers class clsName extends superName implements intfList { // ここにインターフェイスを実装する 実装時、インターフェイスメソッドの 戻り値の型を合わせなければ、コ ・ ンパイルエラーとなる。 ・ ・ } 7.1 インターフェイス(4) interface A{ void disp_A() ; } interface B{ void disp_B() ; } public class InterfaceAndClass { static public void main(String args[]){ Cls c=new Cls() ; c.disp_A() ; c.disp_B() ; } } class Cls implemnts A,B{ [出力結果] public void disp_A(){ Interface A System.out.println("Interface A") ; Interface B } public void disp_B(){ System.out.println("Interface B") ; } } 7.1 インターフェイス(5) メソッド1 メソッド2 メソッド1 貼り付け メソッド2 インターフェイス1 メソッド3 メソッド3 貼り付け メソッド4 メソッド4 インターフェイス2 クラス インターフェイスはクラス機能概要の「表面」を表す。 例えるなら容器の入り口に「貼付けられる物」である。 7.2 インターフェイスの参照(1) 同インターフェイスの変数及びメソッドを参照 intfRef.varName intfRef.mthName(args) インターフェイス内で定義した変数値を参照可 異なるクラスへ導入した同インターフェイスのメソッド の呼び出しが可能 ただし、同インターフェイス内以外の変数及びメソッド の呼び出しはできない 7.2 インターフェイスの参照(2) interface A{ String s_a="Interface A" ; void disp_A() ; } interface B{ String s_b="Interface B" ; void disp_B() ; } public class InterfaceAndClass2 { static public void main(String args[]){ // インターフェイスを型として // オブジェクト作成可だが、 // 型にしたインターフェイスで定義した // メソッドのみが参照可能となる。 A c_a=new Cls() ; c_a.disp_A() ; class Cls implements A,B{ public void disp_A(){ System.out.println(A.s_a) ; } public void disp_B(){ System.out.println(B.s_b) ; } } } // インターフェイスAでは定義されて // 無いため呼び出すことが出来ない。 // c.disp_B() ; // インターフェイスBのdisp_bを呼出す B c_b=new Cls() ; [出力結果] c_b.disp_B() ; Interface A } Interface B 7.3 インターフェイスの継承(1) インターフェイスの継承 クラス同様「extends」を利用する クラスは単体継承の制限があるが、インターフェイス には無い(多重継承が可能) 継承元インターフェイスのことを「スーパーインター フェイス」と呼ぶ インターフェイスの拡張一般記述形式 intfModifier interface intfName extends intfList{ // インターフェイスの本体 } 継承するインターフェ イスをカンマで区切っ て複数記述する。 7.3 インターフェイスの継承(2) interface A{ String s_a="Interface A" ; void disp() ; } interface B{ String s_b="Interface B" ; int sum() ; } interface C extends A,B{ String s_c="Interface C" ; int sub() ; } 続く… インターフェイスA及びBを継承し てCを作成する。この時、A,Bの メソッド及び変数は全てCにも受 け継がれる。 ただし、継承したインターフェイス を実装したクラスは、スーパーイ ンターフェイスのメソッドも含め全 て実装しなければならない。 7.3 インターフェイスの継承(3) 全ページ続き… class Math implements C{ int a,b ; Math(int a,int b){ this.a=a ; this.b=b ; } public void disp(){ System.out.print("a="+this.a) ; System.out.print(",b = "+this.b) ; } public int sum(){ return this.a+this.b ; } public int sub(){ return this.a-this.b ; } } public class InterfaceExtends { static public void main(String args[]){ int a=Integer.valueOf(args[0]).intValue() ; int b=Integer.valueOf(args[1]).intValue() ; Math m=new Math(a,b) ; m.disp() ; System.out.println("a + b = "+m.sum()) ; System.out.println("a + b = "+m.sub()) ; } } [出力結果] a=8,b=5 a + b = 13 a+b=3 7.4 instanceof演算子(1) 「instanceof」演算子とは オブジェクトのクラス、実装されたインターフェイスに ついて確認する時に利用 記述一般形式 varName instaceof type type:クラス又はインターフェイス名 varName:オブジェクト参照変数 instanceof使用例(1) abstract class Vehicle{ final String s="This is \"Vehicle\"" ; } abstract class Non_Vehicle{ final String s="This is \"Non_Vehicle\"" ; } interface A{ void disp() ; } interface B{ void disp() ; } class Car extends Vehicle implements A{ public void disp(){ System.out.println(this.s) ; } } class Bike extends Vehicle implements B{ public void disp(){ System.out.println(this.s) ; } } class Cart extends Non_Vehicle implements A{ public void disp(){ System.out.println(this.s) ; } } class Nothing extends Non_Vehicle implements B{ public void disp(){ System.out.println(this.s) ; } } 続く… instanceof使用例(2) public class Use_Incetanceof { static public void main(String args[]){ Vehicle v[]=new Vehicle[2] ; Non_Vehicle n_v[]=new Non_Vehicle[2] ; v[0]=new Car() ; v[1]=new Bike(); n_v[0]=new Cart() ; n_v[1]=new Nothing() ; for(int i=0;i<2;i++){ System.out.println("Vehicleオブジェクト...v["+i+"]") ; System.out.print("Vehicleか?...") ; System.out.println(v[i] instanceof Vehicle) ; if(v[i] instanceof A){ System.out.print("インターフェイスA...") ; A a=(A)v[i] ; a.disp() ; } 続く… instanceof使用例(3) 前頁の続き… if(v[i] instanceof B){ System.out.print("インターフェイスB...") ; B b=(B)v[i] ; b.disp() ; } } System.out.println() ; for(int i=0;i<2;i++){ System.out.println("Non_Vehicleオブジェクト...n_v["+i+"]") ; System.out.print("Non_Vehicleか?...") ; System.out.println(n_v[i] instanceof Non_Vehicle) ; if(n_v[i] instanceof A){ System.out.print("インターフェイスA...") ; A a=(A)n_v[i] ; a.disp() ; } } 続く… instanceof使用例(4) 前頁の続き… if(n_v[i] instanceof B){ System.out.print("インターフェイスB...") ; B b=(B)n_v[i] ; b.disp() ; } } } } [出力結果] Vehicleオブジェクト...v[0] Vehicleか?...true インターフェイスA...This is "Vehicle" Vehicleオブジェクト...v[1] Vehicleか?...true インターフェイスB...This is "Vehicle" Non_Vehicleオブジェクト...n_v[0] Non_Vehicleか?...true インターフェイスA...This is "Non_Vehicle" Non_Vehicleオブジェクト...n_v[1] Non_Vehicleか?...true インターフェイスB...This is "Non_Vehicle" 練習問題1 インターフェイス継承の部分において掲載したプ ログラム例を利用し、既存のメソッドsum()、 sub()、disp()に加え、さらに乗算、除算を行うた めのインターフェイス及びメソッドを加え、さらに、 すべての(加減乗除)計算を行うように改良せよ。 計算に用いる値は任意とする。また、値の入力 方法は問わない。ヒント:インターフェイスの継承 の特徴を利用して他のインターフェイスを付け足 していくことが出来ること。 練習問題2 2次元座標値、3次元座標値における計算を行 うプログラムを作成したい。次ページ図を元に座 標値を加算するプログラムを作成せよ。計算に 用いる値は任意とする。 例: 2次元(1,1)+(2,2)=(3,3) 3次元(1,1,1)+(1,2,1)+(2,1,2)=(4,4,4) 練習問題2.1図 abstract class Figure int a[] int b[] 継承 class Fig_3D void Sum() 継承 実装 class Fig_2D void Sum() 実装 interface Calc void Sum() 練習問題3 次ページ図を参考にしてI1~I4インターフェイス を作成、また、Xクラス、Wクラスを作り、Wオブ ジェクトを作る。このとき、Wオブジェクトに実装さ れているインターフェイスをinstanceof演算子に よって調べ、また、オブジェクトがX型であるかも 調べるプログラムを作成せよ。(インターフェイス 及びクラス内のメソッドの有無は問わない) 練習問題3.1図 interface I1 interface I2 interface I4 拡張 拡張 実装 interface I3 class W 継承 実装 class X オブジェクト化するのは クラスW
© Copyright 2024 ExpyDoc