Java >> Java tutorial >  >> Tag >> extends

Implementerer vs. Extends i Java

1. Oversigt

I denne tutorial vil vi diskutere arv, et af de afgørende begreber i objektorienteret programmering. I Java er de to vigtigste nøgleord, der bruges til nedarvning, udvider og implementerer .

2. forlænger vs. implementer

Lad os diskutere forskellene mellem de to søgeord.

Vi bruger udvidelserne nøgleord for at arve egenskaber og metoder fra en klasse. Klassen, der fungerer som en forælder, kaldes en basisklasse, og den klasse, der arver fra denne basisklasse, kaldes en afledt eller en underordnet klasse. Hovedsageligt forlænger nøgleordet bruges til at udvide funktionaliteten af ​​en overordnet klasse til de afledte klasser. En basisklasse kan også have mange afledte klasser, men en afledt klasse kan kun have én basisklasse, fordi Java ikke understøtter multipel nedarvning.

På den anden side bruger vi implementerne nøgleord for at implementere en grænseflade. En grænseflade består kun af abstrakte metoder. En klasse vil implementere grænsefladen og definere disse abstrakte metoder i henhold til den nødvendige funktionalitet. I modsætning til forlænger , kan enhver klasse implementere flere grænseflader.

Selvom begge søgeord stemmer overens med begrebet arv, implementerer søgeord er primært forbundet med abstraktion og bruges til at definere en kontrakt, og udvider bruges til at udvide en klasses eksisterende funktionalitet.

3. Implementering

Lad os springe til implementeringen og se på extends , implementerer , og multipel arv én efter én, i detaljer.

3.1. forlænger

Lad os starte med at oprette en klasse kaldet Medier der har id , titel , og kunstner . Denne klasse vil fungere som en basisklasse. Videomedier og AudioMedia vil udvide funktionaliteten af ​​denne klasse:

public class Media {

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

Lad os nu oprette en anden klasse kaldet VideoMedia der forlænger klassen Medier , som arver dens egenskaber. Derudover har den sine egne egenskaber som opløsning og aspectRatio :

public class VideoMedia extends Media {

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

På samme måde er klassen AudioMedia også forlænger klassen Medier  og vil have sine egne yderligere egenskaber som bitrate og frekvens :

public class AudioMedia extends Media {

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

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

Lad os oprette objekter til basis- og afledte klasser for at se på de nedarvede egenskaber:

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);

Alle tre klasser udskriver de tilknyttede egenskaber:

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. implementerer

For at forstå abstraktion og grænseflader, vil vi oprette en grænseflade MediaPlayer der har to metoder kaldet spil og pause. Som nævnt før er alle metoderne i denne grænseflade abstrakte. Med andre ord indeholder grænsefladen kun metodeerklæringer.

I Java behøver grænseflader ikke eksplicit at erklære en metode som abstrakt eller offentlig . Klasserne, der implementerer grænsefladen MediaPlayer vil definere disse metoder:

public interface MediaPlayer {

    void play();

    void pause();
}

AudioMediaPlayer klasse implementer MediaPlayer, og det vil definere spillet og pause metoder til lydmedier:

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");
    }
}

På samme måde implementerer VideoMediaPlayer MediaPlayer og giver en metodedefinition til spil og pause videomedier:

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");
    }
}

Lad os desuden oprette en forekomst af AudioMediaPlayer  og VideoMediaPlayer og ring til play og pause  metoder for dem begge:

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

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

AudioMediaPlayer og VideoMediaPlayer  kalde deres respektive implementeringer af play og pause :

AudioMediaPlayer is Playing
AudioMediaPlayer is Paused

VideoMediaPlayer is Playing
VideoMediaPlayer is Paused

3.3. Multipel arv

Java understøtter ikke multipel nedarvning direkte på grund af tvetydighedsproblemer. Et tvetydighedsproblem opstår, når en klasse arver fra mere end én overordnet klasse, og begge de overordnede klasser har en metode eller egenskab med samme navn. Derfor kan børneklassen ikke løse konflikten om metoden eller egenskaben, der skal nedarves. En klasse kan dog arve fra flere grænseflader. Lad os skabe en grænseflade Advanced PlayerOptions :

public interface AdvancedPlayerOptions {

    void seek();

    void fastForward();
}

Klasse MultiMediaPlayer implementerer MediaPlayer og Advanced PlayerOptions og definerer metoderne erklæret i begge grænseflader:

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");
    }
}

Nu opretter vi en forekomst af MultiMediaPlayer  klasse og kalder alle de implementerede metoder:

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

Som forventet, MultiMediaPlayer kalder dens implementeringer af play og pause :

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

4. Konklusion

I dette selvstudie diskuterede vi de væsentlige forskelle mellem extends og implementerer . Desuden skabte vi klasser og grænseflader for at demonstrere begreberne extends og implementerer . Vi diskuterede også multipel arv, og hvordan vi kan opnå det ved hjælp af grænseflader.

Denne implementering er tilgængelig på GitHub.


No
Java tag