#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。
##環境
言語:Java11、JDK13.0.2
動作環境:Windows10
#インターフェイス
前回扱った抽象クラスと似た使い方をする、インターフェイスという機構がある。抽象クラスはクラスの一種だった、インターフェイスも似た目的で作られるがその宣言・実装方法は異なる。
interface Felidae
{
String type = cats;
void meetsCats();
}
いつものclass
宣言がなくなり、代わりにinterface
になっている。クラス同様、フィールドとメソッドを持つことが出来る(コンストラクタを持つことはできない)が、
Felidae cat=new Felidae();
のようなオブジェクトの生成はできない。またvoid meetsCats()
は抽象メソッドのため、Felidae
インターフェイスを実装したクラスによってその具象メソッドを用意する必要がある(オーバーライド)。
String type = cats;
はインターフェイスのフィールドだが、これは定数であり変更が効かない。インターフェイスのフィールドには、public static final
がついていることと同じ状態であるためだ(なぜそうなっているか僕はまだ分かっていない)。
class Housecat inplements Felidae
{
void meetsCats()
{
System.out.println("猫を発見したよ。多分どこかのイエネコだと思う。");
}
}
拡張のextends
ではなく代わりにimplements
になっているが、形としては今までと変わりない。
##原則:スーパークラスはひとつだけ
なぜ抽象メソッド・インターフェイスが必要になるのか。すべてクラス拡張で済ませればいいと思うのだが、Javaは複数のクラスによる多重継承を認めていない。親であるスーパークラスは1つだけに制限されている。人間の考える系統図と同じように考えてはいけないようだ。
その理由を少し見たが、メソッド名がかぶったときの呼び出しとか菱型継承問題(diamond problem)とか、何やらここには深みがあるようだ。なおC++
という別言語はこの多重継承を認めている。
しかし、一度用意したものを使えないのは厳しいものがある。そこで、クラスによる多重継承の代わりに、抽象クラスやインターフェイスによる部分的な多重継承のみを許すことで言語としてのシンプルさを保とうとしている。
インターフェイスの実装は2つ以上で行うことが出来る。また、インターフェイス自体を拡張し、サブインターフェイスにスーパーインターフェイスをextends
することはできる。
#終わりに
拡張による継承が許される部分を追ってみると、Javaは演繹的な展開が得意な言語なのかなと感じる。すでに出来上がったクラス・インターフェイスを知り、その機能を継承しながら新しいクラスを組み上げることを想定しているということは、まず標準ライブラリが用意した機能を知るところからJavaの勉強は始まるのだろう。
#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。