Spiegare in una lingua di facile comprensione o un collegamento ad alcuni articoli.
Spiegare in una lingua di facile comprensione o un collegamento ad alcuni articoli.
Risposte:
extends
è per estendere una classe.
implements
serve 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
default
comportamento 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 .
public interface ListIterator<E> extends Iterator<E>
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 extend
una classe (e puoi estenderne solo una) e implement
un'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).
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:
remember
() e protectOwner
() condividendo name,lifeExpentency
daAnimal
Cat
e Dog
implementando tale funzionalità.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.
extends
è per quando stai ereditando da una classe base (cioè estendendo la sua funzionalità).
implements
è per quando stai implementando un'interfaccia .
Ecco un buon punto di partenza: Interfacce ed ereditarietà .
A class
può solo "implementare" un interface
. Una classe "estende" solo a class
. Allo stesso modo, un interface
può estenderne un altro interface
.
A class
può solo estendersi a vicenda class
. A class
può implementare diversi interface
s.
Se invece sei più interessato a sapere quando usare abstract class
es e interface
s, fai riferimento a questo thread: Interface vs Abstract Class (OO generale)
class
può implementarne solo uno interface
. A class
può estendere diverse altre classi. Credo che tu l'abbia ottenuto al contrario.
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 .
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.
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.
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.
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.
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();
}
Entrambe le parole chiave vengono utilizzate quando si crea la propria nuova classe in linguaggio Java.
Differenza: implements
significa che stai usando gli elementi di un'interfaccia Java nella tua classe. extends
significa 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.
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
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.
Extends
viene utilizzato quando si desidera gli attributi della classe / interfaccia padre nella propria classe / interfaccia figlio e implements
viene utilizzato quando si desidera gli attributi di un'interfaccia nella propria classe.
Esempio:
Si estende usando la classe
class Parent {
}
class Child estende Parent {
}
Si estende tramite l'interfaccia
interfaccia Parent {
}
interfaccia Child estende Parent {
}
implementa
interfaccia A {
}
la classe B implementa A {
}
Combinazione di estensioni e strumenti
interface A{
}
class B
{
}
class C implements A,extends B{
}
si estende
attrezzi
anche le classi astratte agiscono come una classe, con estensioni e strumenti
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.