第7回独習Javaゼミ

第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