第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀
7.1 インターフェイス(1) インターフェイスとは・・・ 「abstract」と類似性があるが・・・ →目的、使い方は異なる(説明は別頁) 7.1 インターフェイス(1) インターフェイスとは・・・ 「特定の機能概要」を定義したものが記述される 機能概要のため、宣言のみ 同一インターフェイスを実装したクラスは「その機能概要」が共通している 「abstract」と類似性があるが・・・ →目的、使い方は異なる(説明は別頁)
7.1 インターフェイス(2) 「abstract」やクラスの継承では・・・ 逆にインターフェイスの場合・・・ 7.1 インターフェイス(2) 「abstract」やクラスの継承では・・・ 多重継承が認められていない (一つのクラスへ複数のスーパークラスを継承することが出来ないこと) サブクラスとスーパークラスとの間に「クラス」の関係があること(型、オブジェクトの関係) 逆にインターフェイスの場合・・・ 複数のインターフェイスを実装可能 クラス関係は無いため自由にクラスへ実装できる
7.1 インターフェイス(3) インターフェイスの宣言(一般形式) intfModifier interface intfName{ 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キーワード 実装時の一般形式記述 インターフェイスをクラスに実装するためのキーワード 7.1 インターフェイス(3) implementsキーワード インターフェイスをクラスに実装するためのキーワード 実装時の一般形式記述 clsModifiers class clsName extends superName implements intfList { // ここにインターフェイスを実装する ・ } 実装時、インターフェイスメソッドの戻り値の型を合わせなければ、コンパイルエラーとなる。
7.1 インターフェイス(4) interface A{ void disp_A() ; } interface B{ 7.1 インターフェイス(4) interface A{ void disp_A() ; } interface B{ void disp_B() ; class Cls implemnts A,B{ public void disp_A(){ System.out.println("Interface A") ; public void disp_B(){ System.out.println("Interface B") ; public class InterfaceAndClass { static public void main(String args[]){ Cls c=new Cls() ; c.disp_A() ; c.disp_B() ; } [出力結果] Interface A Interface B
7.1 インターフェイス(5) メソッド1 メソッド1 貼り付け メソッド2 メソッド2 インターフェイス1 メソッド3 メソッド3 7.1 インターフェイス(5) メソッド1 メソッド1 メソッド2 貼り付け メソッド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" ; 7.2 インターフェイスの参照(2) interface A{ String s_a="Interface A" ; void disp_A() ; } interface B{ String s_b="Interface B" ; void disp_B() ; 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) ; public class InterfaceAndClass2 { static public void main(String args[]){ // インターフェイスを型として // オブジェクト作成可だが、 // 型にしたインターフェイスで定義した // メソッドのみが参照可能となる。 A c_a=new Cls() ; c_a.disp_A() ; // インターフェイスAでは定義されて // 無いため呼び出すことが出来ない。 // c.disp_B() ; // インターフェイスBのdisp_bを呼出す B c_b=new Cls() ; c_b.disp_B() ; } [出力結果] Interface A Interface B
7.3 インターフェイスの継承(1) インターフェイスの継承 インターフェイスの拡張一般記述形式 クラス同様「extends」を利用する 7.3 インターフェイスの継承(1) インターフェイスの継承 クラス同様「extends」を利用する クラスは単体継承の制限があるが、インターフェイスには無い(多重継承が可能) 継承元インターフェイスのことを「スーパーインターフェイス」と呼ぶ インターフェイスの拡張一般記述形式 intfModifier interface intfName extends intfList{ // インターフェイスの本体 } 継承するインターフェイスをカンマで区切って複数記述する。
7.3 インターフェイスの継承(2) interface A{ String s_a="Interface A" ; 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 ; 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{ 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{ class Nothing extends Non_Vehicle implements B{ 続く…
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] インターフェイスB...This is "Vehicle" Non_Vehicleオブジェクト...n_v[0] Non_Vehicleか?...true インターフェイスA...This is "Non_Vehicle" Non_Vehicleオブジェクト...n_v[1] インターフェイス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