Javaのinterfaceをimplementsしたとき「is-a関係」と言えるのか?
こんにちは。ゆうせいです。
Javaのinterfaceをimplements
したとき「is-a関係」と言えるのか?
これはJavaプログラミングの基本的な疑問ですが、とても奥が深いテーマです。この記事では、「interfaceをimplementsすることはis-a関係と言えるのか?」について、初心者にもわかりやすく丁寧に解説していきます!
結論:一般的には「is-a関係」と言える
Javaでクラスがあるインターフェースをimplements
した場合、そのクラスとインターフェースとの間には「is-a(〜である)」関係が成り立つと考えられています。
たとえば、以下のようなコードがあったとします:
interface Animal {
void eat();
}
class Dog implements Animal {
public void eat() {
System.out.println("Dog is eating");
}
}
このとき、
Dog
はAnimal
である(Dog is a Animal)と言えます。
つまり、「DogはAnimalの一種」として扱えるため、is-a関係です。
interfaceと継承の違いと共通点
Javaにおける継承(extends
)と実装(implements
)の違いを一度整理しましょう。
項目 | extends (クラス継承) | implements (インターフェース実装) |
---|---|---|
関係性 | is-a関係 | is-a関係(ただし「契約」とも言える) |
多重継承 | 不可(1つのクラスのみ) | 可(複数のインターフェース) |
メンバーの継承 | 実装を含む | メソッドの定義だけ(実装はない) |
ポイントは「契約」
インターフェースは「このクラスはこういう振る舞いをします」と約束するためのものです。この約束(契約)を守るために、実装クラスはすべてのメソッドを定義しなければなりません。
そのため、インターフェースを実装しているということは:
- 「そのインターフェースの型として振る舞える」
- つまり、インターフェースの型の変数に代入できる
という性質を持ちます。
例で考える:ListとArrayListの関係
List<String> names = new ArrayList<>();
このコードは、
ArrayList
はList
の一種である(ArrayList is a List
)- だから
List
型の変数に代入できる
という意味です。
このように、interfaceをimplementsすることは、「型の多態性(ポリモーフィズム)」を実現する上で非常に重要です。
is-a関係の注意点
ただし、「is-a関係」と簡単に言っても、実際には使い方によっては誤解を生むことがあります。
例:Comparable
インターフェース
class Student implements Comparable<Student> {
public int compareTo(Student other) {
return this.score - other.score;
}
}
このとき、「Student is a Comparable」ですが、
Student
は「比較できるオブジェクト」として扱える- でも、「StudentはComparableのような存在」ではない
- あくまで「その振る舞いを持っている」という意味
というふうに、純粋な「〜の一種」ではなく、「〜のように振る舞える」という意味合いも含まれます。
「is-a」と「has-a」の違いも押さえよう
関係 | 説明 | 例 |
---|---|---|
is-a | 継承または実装 | Dog is a Animal |
has-a | メンバー変数に持つ | Dog has a Tail |
この違いを理解することで、設計力がグッと上がります。
まとめ:interfaceのimplementsは「is-a関係」だが、文脈に注意!
implements
は基本的に「is-a関係」と捉えられる- 実際にはそのインターフェースの型として扱えるという意味
- 契約(インターフェース)を守ることでポリモーフィズムが実現
- ただし「何でもis-a」と捉えると誤解の元になることも!
今後の学習の指針
- 「継承」と「インターフェース」の使い分けをしっかり理解しよう
abstract class
とinterface
の違いも学ぼう- 実際にJavaの標準ライブラリのクラス(たとえば
ArrayList
,HashMap
など)がどう使われているかを見てみると理解が深まります!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
