記事作成の経緯
JavaSilverの勉強をしていた際に、Interface
, Abstractクラス
を使った継承関係の問題につまづいた。。
内容整理&理解のため記事作成
読む方の対象
Java Silver学習中の方
Java始めたての方
そもそもInterfaceとabstractクラスって何
本記事の主題とは少し離れるため詳細には記載しない。
自分は超ざっくり以下のように理解した。
Interface = 抽象メソッドのみ提供する
abstractクラス = 抽象メソッドと実装を提供するクラス
自分は以下のサイトが参考になったため共有として貼っておきます。
- 抽象クラスとインターフェース 概念の違いについて【オブジェクト指向】
-
KAB-studio 7. ポリモーフィズム!!(7.ポリモーフィズム!!!〜10. インタフェースという「クラスじゃないもの」
辺りまで) - 【JAVA】interfaceとabstractの違いって???
Interfaceとabstractクラスを使った継承
まずMainクラスのInterface interfaceClass = new Main();
とAbstract abstractClass = new Main();
で作成した変数はあくまでInterface型とAbstract型であるためそれぞれのクラスで定義されたメソッドや変数しか利用できない。
public interface Interface {
void interfaceMethod();
}
public abstract class Abstract {
abstract void abstractMethod();
}
class Child extends Abstract implements Interface {
@Override
void abstractMethod() {
System.out.println("抽象クラスの抽象メソッドの実装");
}
@Override
public void interfaceMethod() {
System.out.println("インターフェースの抽象メソッドの実装");
}
}
public class Main extends Child{ // 実装と継承をしているChildクラスを継承
public static void main(String[] args) {
Main main = new Main();
// Interface, Abstractともにインスタンス化(new)はできない > エラーになる
Interface interfaceClass = new Interface();
Abstract abstractClass = new Abstract();
// 型はInterfaceだが、interfaceMethod()にアクセスするとChild#interfaceMethodが呼ばれる
Interface interfaceClass = new Main();
// 型はAbstractだが、abstractMethod()にアクセスするとChild#abstractMethodが呼ばれる。
Abstract abstractClass = new Main();
main.abstractMethod(); // "抽象クラスの抽象メソッドの実装"が出力
main.interfaceMethod(); // "インターフェースの抽象メソッドの実装"が出力
abstractClass.abstractMethos(); // "抽象クラスの抽象メソッドの実装"が出力
interfaceClass.interfaceMethod(); // "インターフェースの抽象メソッドの実装"が出力
}
}
個人的要所解説
Childクラスは抽象クラスであるAbstractクラスを継承し,インターフェースであるInterfaceを実装している。
(わかりづらいかもしれませんがInterfaceはインターフェース名です。。。)
AbstractクラスもInterfaceもどちらも抽象メソッドを定義しているため、Childクラスはそれらのメソッドを実装しなければならない。
Interface型(中身はMain型)は、アクセスできる変数とメソッドはInterfaceのものだけ。
>例えばChildクラスの変数にアクセスしようとするとコンパイルエラーになる。
Abstract型(中身はMain型)もアクセスできる変数とメソッドはAbstractクラスのものだけ。
>例えばChildクラスの変数にアクセスしようとするとコンパイルエラーになる。
終わりに
多分開発プロジェクトの方針によると思うんだけど、実際に今回記載したような構造をまだ見たことがないのでパッとイメージができないんだよなぁ。。
(もちろんそれぞれの特徴はあるけど)わかりづらいからInterfaceだけでよくね?と思ってしまう。