Implements vs extends: quando utilizzare? Qual è la differenza?


Risposte:


735

extendsè per estendere una classe.

implementsserve per implementare un'interfaccia

La differenza tra un'interfaccia e una classe normale è che in un'interfaccia non è possibile implementare nessuno dei metodi dichiarati. Solo la classe che "implementa" l'interfaccia può implementare i metodi. L'equivalente C ++ di un'interfaccia sarebbe una classe astratta (non ESATTAMENTE la stessa ma praticamente).

Inoltre java non supporta l'ereditarietà multipla per le classi. Ciò viene risolto utilizzando più interfacce.

 public interface ExampleInterface {
    public void doAction();
    public String doThis(int number);
 }

 public class sub implements ExampleInterface {
     public void doAction() {
       //specify what must happen
     }

     public String doThis(int number) {
       //specfiy what must happen
     }
 }

ora estendo una classe

 public class SuperClass {
    public int getNb() {
         //specify what must happen
        return 1;
     }

     public int getNb2() {
         //specify what must happen
        return 2;
     }
 }

 public class SubClass extends SuperClass {
      //you can override the implementation
      @Override
      public int getNb2() {
        return 3;
     }
 }

in questo caso

  Subclass s = new SubClass();
  s.getNb(); //returns 1
  s.getNb2(); //returns 3

  SuperClass sup = new SuperClass();
  sup.getNb(); //returns 1
  sup.getNb2(); //returns 2

Ti suggerisco di fare qualche ricerca in più sul legame dinamico, il polimorfismo e in generale l'eredità nella programmazione orientata agli oggetti


46
Un'interfaccia può contenere molto più delle dichiarazioni di metodo: campi costanti, annotazioni, interfacce e persino classi.
Philipp Reichart,

sono qualcosa come moduli e mixin in ruby?
user2492854

@ user2492854 un po ', ma non ci saranno metodi implementati in un'interfaccia. È letteralmente una descrizione di un'interfaccia, non un'implementazione.
Rob Grant,

34
Una nuova funzionalità di Java 8 consente l'implementazione del defaultcomportamento per i metodi nelle interfacce, rendendo facoltativa l'implementazione personalizzata di tali metodi. Pertanto, l'istruzione "è possibile specificare solo metodi, ma non implementarli" è completamente corretta solo per Java 7 e versioni precedenti .
ADTC,

5
"extends è per estendere una classe", è un po 'confuso. Sine un'interfaccia e estende anche un'interfaccia . Ad esempio:public interface ListIterator<E> extends Iterator<E>
weiheng,

78

Ho notato che hai alcune domande C ++ nel tuo profilo. Se capisci il concetto di ereditarietà multipla da C ++ (riferendosi a classi che ereditano caratteristiche da più di un'altra classe), Java non lo consente, ma ha una parola chiave interface, che è un po 'come una pura classe virtuale in C ++. Come menzionato da molte persone, sei extenduna classe (e puoi estenderne solo una) e implementun'interfaccia - ma la tua classe può implementare tutte le interfacce che desideri.

Vale a dire, queste parole chiave e le regole che regolano il loro uso delineano le possibilità di ereditarietà multipla in Java (puoi avere solo una super classe, ma puoi implementare più interfacce).


51

Generalmente attrezzi utilizzati per l'implementazione di un'interfaccia ed estensioni utilizzate per l' estensione del comportamento della classe base o della classe astratta .

extends : una classe derivata può estendere una classe base. È possibile ridefinire il comportamento di una relazione stabilita. La classe derivata " è un " tipo di classe base

implementa : stai implementando un contratto. La classe che implementa l'interfaccia " ha una " capacità.

Con java 8, l'interfaccia può avere metodi predefiniti nell'interfaccia, che fornisce l'implementazione nell'interfaccia stessa.

Fare riferimento a questa domanda per sapere quando utilizzarli:

Interface vs Abstract Class (OO generale)

Esempio per capire le cose.

public class ExtendsAndImplementsDemo{
    public static void main(String args[]){

        Dog dog = new Dog("Tiger",16);
        Cat cat = new Cat("July",20);

        System.out.println("Dog:"+dog);
        System.out.println("Cat:"+cat);

        dog.remember();
        dog.protectOwner();
        Learn dl = dog;
        dl.learn();

        cat.remember();
        cat.protectOwner();

        Climb c = cat;
        c.climb();

        Man man = new Man("Ravindra",40);
        System.out.println(man);

        Climb cm = man;
        cm.climb();
        Think t = man;
        t.think();
        Learn l = man;
        l.learn();
        Apply a = man;
        a.apply();

    }
}

abstract class Animal{
    String name;
    int lifeExpentency;
    public Animal(String name,int lifeExpentency ){
        this.name = name;
        this.lifeExpentency=lifeExpentency;
    }
    public void remember(){
        System.out.println("Define your own remember");
    }
    public void protectOwner(){
        System.out.println("Define your own protectOwner");
    }

    public String toString(){
        return this.getClass().getSimpleName()+":"+name+":"+lifeExpentency;
    }
}
class Dog extends Animal implements Learn{

    public Dog(String name,int age){
        super(name,age);
    }
    public void remember(){
        System.out.println(this.getClass().getSimpleName()+" can remember for 5 minutes");
    }
    public void protectOwner(){
        System.out.println(this.getClass().getSimpleName()+ " will protect owner");
    }
    public void learn(){
        System.out.println(this.getClass().getSimpleName()+ " can learn:");
    }
}
class Cat extends Animal implements Climb {
    public Cat(String name,int age){
        super(name,age);
    }
    public void remember(){
        System.out.println(this.getClass().getSimpleName() + " can remember for 16 hours");
    }
    public void protectOwner(){
        System.out.println(this.getClass().getSimpleName()+ " won't protect owner");
    }
    public void climb(){
        System.out.println(this.getClass().getSimpleName()+ " can climb");
    }
}
interface Climb{
    public void climb();
}
interface Think {
    public void think();
}

interface Learn {
    public void learn();
}
interface Apply{
    public void apply();
}

class Man implements Think,Learn,Apply,Climb{
    String name;
    int age;

    public Man(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void think(){
        System.out.println("I can think:"+this.getClass().getSimpleName());
    }
    public void learn(){
        System.out.println("I can learn:"+this.getClass().getSimpleName());
    }
    public void apply(){
        System.out.println("I can apply:"+this.getClass().getSimpleName());
    }
    public void climb(){
        System.out.println("I can climb:"+this.getClass().getSimpleName());
    }
    public String toString(){
        return "Man :"+name+":Age:"+age;
    }
}

produzione:

Dog:Dog:Tiger:16
Cat:Cat:July:20
Dog can remember for 5 minutes
Dog will protect owner
Dog can learn:
Cat can remember for 16 hours
Cat won't protect owner
Cat can climb
Man :Ravindra:Age:40
I can climb:Man
I can think:Man
I can learn:Man
I can apply:Man

Punti importanti da capire:

  1. Dog e Cat sono animali e hanno esteso remember() e protectOwner() condividendo name,lifeExpentencydaAnimal
  2. Il gatto può arrampicarsi () ma il cane no. Il cane può pensare () ma Cat no . Queste funzionalità specifiche vengono aggiunte Cate Dogimplementando tale funzionalità.
  3. L'uomo non è un animale ma può farlo Think,Learn,Apply,Climb

Attraverso questi esempi, puoi capirlo

Le classi non correlate possono avere funzionalità tramite l'interfaccia ma le classi correlate sovrascrivono il comportamento attraverso l'estensione delle classi di base.


1
Molto ben spiegato. Ha appena cliccato. Grazie mille!
Emir Memic,

È davvero così? Ho sempre pensato che "abbia un" si riferisca all'avere qualcosa, possederlo. Potresti dire che il gatto "ha" un'abilità di arrampicata, ma direi riformulare il tuo esempio. Cat "è un" Climber ", l'uomo" è un "" pensatore, discente, scalatore ". Dato che l'uomo" è un "pensatore, può fare ciò che un pensatore può fare. È ancora più chiaro quando si lavora con alcuni protocolli - se si avere una casa, ha una porta, ma non implementa la spinta a mano. È anche un "MaterialObject, il che significa che implementa l'interfaccia per obbedire alla gravità; non ha un" GravityObeyingSkill "o qualcosa di simile.
MatthewRock

Se l'uomo è un pensatore, stabilirò una relazione con gli estensioni e non con gli strumenti. Il pensatore può avere un certo stato e altri ruoli / caratteristiche, ma implementerò la capacità di pensare solo con l'interfaccia. IS A è il termine standard utilizzato per l'ereditarietà.
Ravindra babu,

@Ravindrababu Mille grazie per una spiegazione così chiara.
Kanudo,

1
grande spiegato!
Dary,


34

A classpuò solo "implementare" un interface. Una classe "estende" solo a class. Allo stesso modo, un interfacepuò estenderne un altro interface.

A classpuò solo estendersi a vicenda class. A classpuò implementare diversi interfaces.

Se invece sei più interessato a sapere quando usare abstract classes e interfaces, fai riferimento a questo thread: Interface vs Abstract Class (OO generale)


2
Puoi anche estendere un'interfaccia.
Mark Peters,

2
A classpuò implementarne solo uno interface. A classpuò estendere diverse altre classi. Credo che tu l'abbia ottenuto al contrario.
pb2q

Solo per chiarire il commento di pb2q, la risposta è già stata modificata / corretta. "Una classe può estendere solo un'altra classe. Una classe può implementare diverse interfacce" è l'istruzione corretta.
wisbucky,

29

Un'interfaccia è una descrizione delle azioni che un oggetto può fare ... ad esempio quando si accende un interruttore della luce, la luce si accende, non ti interessa come, solo che lo fa. Nella programmazione orientata agli oggetti, un'interfaccia è una descrizione di tutte le funzioni che un oggetto deve avere per essere una "X". Ancora una volta, ad esempio, tutto ciò che "ACTS LIKE" una luce dovrebbe avere un metodo turn_on () e un metodo turn_off (). Lo scopo delle interfacce è consentire al computer di applicare queste proprietà e sapere che un oggetto di TIPO T (qualunque sia l'interfaccia) deve avere funzioni chiamate X, Y, Z, ecc.

Un'interfaccia è una struttura / sintassi di programmazione che consente al computer di applicare determinate proprietà su un oggetto (classe). Ad esempio, supponiamo di avere una classe di auto, una classe di scooter e una classe di camion. Ognuna di queste tre classi dovrebbe avere un'azione start_engine (). Il modo in cui il "motore viene avviato" per ciascun veicolo viene lasciato a ciascuna classe particolare, ma il fatto che debbano avere un'azione start_engine è il dominio dell'interfaccia .


4
Grande spiegazione; merita un maggiore riconoscimento.
Arvindh Mani,

22

Come mostrato nella figura sotto, una classe estende un'altra classe, un'interfaccia estende un'altra interfaccia ma una classe implementa un'interfaccia. inserisci qui la descrizione dell'immagine

Per maggiori dettagli


16

Estende : viene utilizzato per ottenere gli attributi di una classe genitore nella classe base e può contenere metodi già definiti che possono essere sovrascritti nella classe figlio.

Implementa : viene utilizzato per implementare un'interfaccia (classe padre con solo firme di funzioni ma non le relative definizioni) definendola nella classe figlio.

Esiste una condizione speciale: "Cosa succede se desidero che una nuova interfaccia sia figlia di un'interfaccia esistente?". Nella condizione sopra, l'interfaccia figlio estende l'interfaccia padre.


15
  • A estende B:

    A e B sono entrambe le classi o entrambe le interfacce

  • A implementa B

    A è una classe e B è un'interfaccia

  • Il resto del caso in cui A è un'interfaccia e B è una classe non è legale in Java.


12

Implements viene utilizzato per le interfacce e extends viene utilizzato per estendere una classe.

Per renderlo più chiaro in termini più semplici, un'interfaccia è come sembra - un'interfaccia - un modello, che devi applicare, seguire, insieme alle tue idee.

Estendi è usato per le classi, qui stai estendendo qualcosa che esiste già aggiungendo più funzionalità ad esso.

Qualche nota in più:

un'interfaccia può estendere un'altra interfaccia.

E quando devi scegliere tra l'implementazione di un'interfaccia o l'estensione di una classe per un particolare scenario, vai per l'implementazione di un'interfaccia. Perché una classe può implementare più interfacce ma estendere solo una classe.


7

Quando una sottoclasse estende una classe, consente alla sottoclasse di ereditare (riutilizzare) e sovrascrivere il codice definito nel supertipo. Quando una classe implementa un'interfaccia, consente a un oggetto creato dalla classe di essere utilizzato in qualsiasi contesto che prevede un valore dell'interfaccia.

Il vero vantaggio qui è che mentre stiamo implementando qualsiasi cosa significa semplicemente che stiamo usando quei metodi così come sono. Non c'è spazio per la modifica dei loro valori e dei tipi restituiti.

Ma quando stiamo estendendo qualsiasi cosa, allora diventa un'estensione della tua classe. Puoi cambiarlo, usarlo, riutilizzarlo e non deve necessariamente restituire gli stessi valori della superclasse.


Sto leggendo questa risposta scritta da me dopo più di 3 anni nel 19 settembre. Giuro che non sono in grado di capire quale merda ho scritto. Potrei scrivere una risposta molto migliore ora. Cosa strana.
Nikhil Arora,

7

Usiamo SubClass estende SuperClass solo quando la sottoclasse vuole usare alcune funzionalità (metodi o variabili di istanza) che sono già dichiarate in SuperClass , o se voglio modificare leggermente la funzionalità della SuperClass (metodo override). Ma diciamo, ad esempio, che ho una classe Animal ( SuperClass ) e una classe Dog ( SubClass ) e ci sono alcuni metodi che ho definito nella classe Animal ad es. doEat (); , doSleep (); ... e molti altri.

Ora, la mia classe Dog può semplicemente estendere la classe Animal, se voglio che il mio cane usi uno dei metodi dichiarati nella classe Animal, posso invocare quei metodi semplicemente creando un oggetto Dog. Quindi in questo modo posso garantire di avere un cane che può mangiare, dormire e fare qualsiasi altra cosa io voglia fare.

Ora, immagina, un giorno un amante dei gatti entra nel nostro spazio di lavoro e cerca di estendere la classe degli animali (anche i gatti mangiano e dormono). Crea un oggetto Cat e inizia a invocare i metodi.

Ma, diciamo, qualcuno cerca di creare un oggetto della classe Animal. Puoi dire come dorme un gatto, puoi dire come mangia un cane, puoi dire come beve un elefante. Ma non ha senso fare un oggetto della classe Animale. Perché è un modello e non vogliamo alcun modo generale di mangiare.

Preferirò invece creare una classe astratta che nessuno può istanziare ma che può essere utilizzata come modello per altre classi.

Quindi, per concludere, Interface non è altro che una classe astratta (una pura classe astratta) che non contiene implementazioni di metodi ma solo le definizioni (i modelli). Quindi chiunque implementa l'interfaccia sa solo di avere i template di doEat (); e doSleep (); ma devono definire il proprio doEat (); e doSleep (); metodi secondo le loro necessità.

Si estende solo quando si desidera riutilizzare una parte della SuperClass (ma tenere presente che è sempre possibile sovrascrivere i metodi della SuperClass in base alle proprie esigenze) e implementare quando si desidera i modelli e si desidera definirli da soli (secondo le tue necessità).

Condividerò con te un pezzo di codice: lo proverai con diversi set di input e guarderai i risultati.

class AnimalClass {

public void doEat() {

    System.out.println("Animal Eating...");
}

public void sleep() {

    System.out.println("Animal Sleeping...");
}

}

public class Dog extends AnimalClass implements AnimalInterface, Herbi{

public static void main(String[] args) {

    AnimalInterface a = new Dog();
    Dog obj = new Dog();
    obj.doEat();
    a.eating();

    obj.eating();
    obj.herbiEating();
}

public void doEat() {
    System.out.println("Dog eating...");
}

@Override
public void eating() {

    System.out.println("Eating through an interface...");
    // TODO Auto-generated method stub

}

@Override
public void herbiEating() {

    System.out.println("Herbi eating through an interface...");
    // TODO Auto-generated method stub

}


}

Interfacce definite :

public interface AnimalInterface {

public void eating();

}


interface Herbi {

public void herbiEating();

}

7

Entrambe le parole chiave vengono utilizzate quando si crea la propria nuova classe in linguaggio Java.

Differenza: implementssignifica che stai usando gli elementi di un'interfaccia Java nella tua classe. extendssignifica che stai creando una sottoclasse della classe base che stai estendendo. Puoi estendere solo una classe nella tua classe figlio, ma puoi implementare tutte le interfacce che desideri.

Fare riferimento alla pagina della documentazione di Oracle sull'interfaccia per ulteriori dettagli.

Questo può aiutare a chiarire cos'è un'interfaccia e le convenzioni che li riguardano.


7

Nei termini più semplici extends viene utilizzato per ereditare da una classe e strumenti viene utilizzato per applicare un'interfaccia nella tua classe

si estende :

public class Bicycle {
    //properties and methods
}
public class MountainBike extends Bicycle {
    //new properties and methods
}

implementa :

public interface Relatable {
    //stuff you want to put
}
public class RectanglePlus implements Relatable {
    //your class code
}

se hai ancora confusione leggi questo: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html


5

Classi e interfacce sono entrambi contratti . Forniscono metodi e proprietà su cui si basano altre parti di un'applicazione.

Definisci un'interfaccia quando non sei interessato ai dettagli di implementazione di questo contratto. L'unica cosa di cui preoccuparsi è che il contratto (l'interfaccia) esista.

In questo caso lo lasci alla classe che implementa l'interfaccia per occuparsi dei dettagli su come viene eseguito il contratto. Solo le classi possono implementare interfacce.

extends viene utilizzato quando si desidera sostituire i dettagli di un contratto esistente. In questo modo si sostituisce un modo per adempiere a un contratto con un modo diverso. Le classi possono estendere altre classi e le interfacce possono estendere altre interfacce.


3

Extendsviene utilizzato quando si desidera gli attributi della classe / interfaccia padre nella propria classe / interfaccia figlio e implementsviene utilizzato quando si desidera gli attributi di un'interfaccia nella propria classe.

Esempio:

  1. Si estende usando la classe

    class Parent {

    }

    class Child estende Parent {

    }

  2. Si estende tramite l'interfaccia

    interfaccia Parent {

    }

    interfaccia Child estende Parent {

    }

  3. implementa

interfaccia A {

}

la classe B implementa A {

}

Combinazione di estensioni e strumenti

interface A{

}

class B

{

}

class C implements A,extends B{

}

2

si estende

  • la classe estende solo una classe
  • l'interfaccia estende una o più interfacce

attrezzi

  • class implementa una o più interfacce
  • le interfacce "non possono" implementare nulla

anche le classi astratte agiscono come una classe, con estensioni e strumenti


0

Queste due parole chiave sono direttamente associate a Eredità: è un concetto chiave di OOP. Quando ereditiamo una classe in un'altra classe possiamo usare extends ma quando erediteremo alcune interfacce nella nostra classe non possiamo usare extends dovremmo usare gli attrezzi e possiamo usare extends la parola chiave per ereditare l'interfaccia da un'altra interfaccia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.