1
0
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

[Java][JavaSilver] Interface,abstractクラスの2つを使った時の動き

Posted at

記事作成の経緯

JavaSilverの勉強をしていた際に、Interface, Abstractクラスを使った継承関係の問題につまづいた。。
内容整理&理解のため記事作成

読む方の対象

Java Silver学習中の方
Java始めたての方

そもそもInterfaceとabstractクラスって何

本記事の主題とは少し離れるため詳細には記載しない。
自分は超ざっくり以下のように理解した。

Interface = 抽象メソッドのみ提供する
abstractクラス = 抽象メソッドと実装を提供するクラス

自分は以下のサイトが参考になったため共有として貼っておきます。

Interfaceとabstractクラスを使った継承

まずMainクラスのInterface interfaceClass = new Main();Abstract abstractClass = new Main();で作成した変数はあくまでInterface型Abstract型であるためそれぞれのクラスで定義されたメソッドや変数しか利用できない。

Interface.java
public interface Interface {
    void interfaceMethod();
}
Abstract.java
public abstract class Abstract {
    abstract void abstractMethod();
}
Child.java
class Child extends Abstract implements Interface {

    @Override
    void abstractMethod() {
        System.out.println("抽象クラスの抽象メソッドの実装");
    }

    @Override
    public void interfaceMethod() {
        System.out.println("インターフェースの抽象メソッドの実装");
    }
}
Main.java
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だけでよくね?と思ってしまう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0