1. 概要

このチュートリアルでは、オブジェクト指向プログラミングの重要な概念の1つである継承について説明します。 Javaでは、継承に使用される2つの主要なキーワードは、extendsとimplementsです。

2. 拡張対。 実装

両方のキーワードの違いについて説明しましょう。

extendsキーワードを使用して、クラスからプロパティとメソッドを継承します。親として機能するクラスは基本クラスと呼ばれ、この基本クラスから継承するクラスは派生クラスまたは子クラスと呼ばれます。 。 主に、 extends キーワードは、親クラスの機能を派生クラスに拡張するために使用されます。 また、基本クラスは多くの派生クラスを持つことができますが、Javaは多重継承をサポートしていないため、派生クラスは1つの基本クラスしか持つことができません。

一方、インターフェースを実装するためにimplementsキーワードを使用します。インターフェースは抽象メソッドのみで構成されます。 クラスはインターフェースを実装し、必要な機能に従ってこれらの抽象メソッドを定義します。 extendsとは異なり、どのクラスでも複数のインターフェースを実装できます。

どちらのキーワードも継承の概念と一致していますが、implements キーワードは主に抽象化に関連付けられ、コントラクトを定義するために使用され、extendsはクラスの既存の機能を拡張するために使用されます。

3. 実装

実装にジャンプして、e xtends implements 、および多重継承を1つずつ詳しく見ていきましょう。

3.1. 拡張

id title 、およびArtistsを持つMediaというクラスを作成することから始めましょう。 このクラスは基本クラスとして機能します。 VideoMediaおよびAudioMediaは、このクラスの機能を拡張します。

public class Media {

    private int id;
    private String title;
    private String artist;
    // standard getters and setters
}

次に、[X36X]ビデオメディアという別のクラスを作成します。このクラスは拡張クラスメディアで、そのプロパティを継承します。さらに、次のような独自のプロパティがあります。 解像度およびアスペクト比

public class VideoMedia extends Media {

    private String resolution;
    private String aspectRatio;
    // standard getters and setters
}

同様に、クラスAudioMediaextendsクラスMediaであり、bitratefrequencyなどの独自の追加プロパティがあります。 ]:

public class AudioMedia extends Media {

    private int bitrate;
    private String frequency;
    // standard getters and setters

    @Override
    public void printTitle() {
        System.out.println("AudioMedia Title");
    }
}

継承されたプロパティを確認するために、基本クラスと派生クラスのオブジェクトを作成してみましょう。

Media media = new Media();
media.setId(001);
media.setTitle("Media1");
media.setArtist("Artist001");

AudioMedia audioMedia = new AudioMedia();
audioMedia.setId(101);
audioMedia.setTitle("Audio1");
audioMedia.setArtist("Artist101");
audioMedia.setBitrate(3500);
audioMedia.setFrequency("256kbps");

VideoMedia videoMedia = new VideoMedia();
videoMedia.setId(201);
videoMedia.setTitle("Video1");
videoMedia.setArtist("Artist201");
videoMedia.setResolution("1024x768");
videoMedia.setAspectRatio("16:9");

System.out.println(media);
System.out.println(audioMedia);
System.out.println(videoMedia);

3つのクラスはすべて、関連するプロパティを出力します。

Media{id=1, title='Media1', artist='Artist001'}
AudioMedia{id=101, title='Audio1', artist='Artist101', bitrate=3500, frequency='256kbps'} 
VideoMedia{id=201, title='Video1', artist='Artist201'resolution='1024x768', aspectRatio='16:9'} 

3.2. 実装

抽象化とインターフェースを理解するために、playpauseという2つのメソッドを持つインターフェースMediaPlayerを作成します。前述のように、このインターフェースは抽象的です。 つまり、インターフェイスにはメソッド宣言のみが含まれます。

Javaでは、インターフェースはメソッドを抽象またはパブリックとして明示的に宣言する必要はありません。インターフェース MediaPlayer を実装するクラスは、次のメソッドを定義します。

public interface MediaPlayer {

    void play();

    void pause();
}

AudioMediaPlayerクラスMediaPlayer、を実装し、オーディオメディアのplayおよびpauseメソッドを定義します。

public class AudioMediaPlayer implements MediaPlayer {

    @Override
    public void play() {
        System.out.println("AudioMediaPlayer is Playing");
    }

    @Override
    public void pause() {
        System.out.println("AudioMediaPlayer is Paused");
    }
}

同様に、VideoMediaPlayerは MediaPlayer を実装し、playおよびpauseビデオメディアにメソッド定義を提供します。

public class VideoMediaPlayer implements MediaPlayer {

    @Override
    public void play() {
        System.out.println("VideoMediaPlayer is Playing");
    }

    @Override
    public void pause() {
        System.out.println("VideoMediaPlayer is Paused");
    }
}

さらに、AudioMediaPlayerVideoMediaPlayerのインスタンスを作成し、両方に対してplaypauseメソッドを呼び出します。

AudioMediaPlayer audioMediaPlayer = new AudioMediaPlayer();
audioMediaPlayer.play();
audioMediaPlayer.pause();

VideoMediaPlayer videoMediaPlayer = new VideoMediaPlayer();
videoMediaPlayer.play();
videoMediaPlayer.pause();

AudioMediaPlayerおよびVideoMediaPlayerは、playおよびpauseのそれぞれの実装を呼び出します。

AudioMediaPlayer is Playing
AudioMediaPlayer is Paused

VideoMediaPlayer is Playing
VideoMediaPlayer is Paused

3.3. 多重継承

Javaは、あいまいさの問題のため、多重継承を直接サポートしていません。クラスが複数の親クラスから継承し、両方の親クラスに同じ名前のメソッドまたはプロパティがある場合、あいまいさの問題が発生します。 。 したがって、子クラスは、継承されるメソッドまたはプロパティの競合を解決できません。 ただし、クラスは複数のインターフェイスから継承できます。インターフェイスを作成しましょう AdvancedPlayerOptions

public interface AdvancedPlayerOptions {

    void seek();

    void fastForward();
}

クラスMultiMediaPlayer implements MediaPlayerおよびAdvancedPlayerOptionsは、両方のインターフェイスで宣言されたメソッドを定義します。

public class MultiMediaPlayer implements MediaPlayer, AdvancedPlayerOptions {

    @Override
    public void play() {
        System.out.println("MultiMediaPlayer is Playing");
    }

    @Override
    public void pause() {
        System.out.println("MultiMediaPlayer is Paused");
    }

    @Override
    public void seek() {
        System.out.println("MultiMediaPlayer is being seeked");
    }

    @Override
    public void fastForward() {
        System.out.println("MultiMediaPlayer is being fast forwarded");
    }
}

次に、 MultiMediaPlayer クラスのインスタンスを作成し、実装されているすべてのメソッドを呼び出します。

MultiMediaPlayer multiMediaPlayer = new MultiMediaPlayer();
multiMediaPlayer.play();
multiMediaPlayer.pause();
multiMediaPlayer.seek();
multiMediaPlayer.fastForward();

予想どおり、MultiMediaPlayerplayおよびpauseの実装を呼び出します。

MultiMediaPlayer is Playing
MultiMediaPlayer is Paused 
MultiMediaPlayer is being seeked 
MultiMediaPlayer is being fast forwarded

4. 結論

このチュートリアルでは、extendsimplementsの重要な違いについて説明しました。 さらに、extendsimplementsの概念を示すクラスとインターフェースを作成しました。また、多重継承と、インターフェースを使用してそれを実現する方法についても説明しました。

この実装は、GitHubを介して利用できます。