Domande da Colloquio 1: Classi Astratte e Interfacce

Marco Ballante 09/11/2012 9 Commenti

Una delle domande più ricorrenti ed importante nei colloqui tecnici, è la differenza tra classe Astratta ed Interfaccia. Quali differenze ci sono?

Classe Astratta

Una classe astratta è una classe che viene definita solo per stabilire una interfaccia comune per tutte le sue sottoclassi.

  • Una classe con uno o più metodi astratti deve essere a sua volta dichiarata astratta.
  • Ogni sottoclasse dovrà definire tutti i metodi astratti, altrimenti dovrà essere etichettata anch'essa come stratta.
  • Oltre a metodi astratti una classe astratta può contenere dati e metodi non astratti.
  • Non può essere istanziata.
  • Può avere un costruttore che non sarà mai usato direttamente (perché non esisteranno mai istanze), ma sarà chiamato dai costruttori delle classi derivate.
  • Per estendere una classe Astratta si usa l'operatore extends ed ogni classe può estendere una sola classe Astratta.
/**/
public abstract class Persona{
    private String nome;
    public Persona(String s) { nome=s; }
    
    public abstract String lavora();

}
/**/
public abstract class Programmatore extends Persona{

public Programmatore (String s) { super(s); }

public String lavora() { return "Che fatica!"; }

}

Interfaccia

Un’interfaccia è una struttura che definisce un protocollo di comportamento, che può essere implementato da una qualunque classe.

  • Un’interfaccia definisce un insieme di metodi ma non li implementa.
  • Nell'Interfaccia non si possono definire variabili ma solo costanti.
  • Anche l'Interfaccia non può essere istanziata.
  • La classe che implementa un'interfaccia deve definire tutti i metodi.
  • Per dichiarare che una classe implementa un'interfaccia si deve usare la parola chiave implements.
  • Una classe può implementare infinite interfacce, fornendo la maggior parte dei benefici dell'eredità multipla (come C++) evitando la complessità.

public interface Comparable{

    int compareTo(T o);
}

public class Mela implements Comparable{
    private int grammi;
    private String tipo;

    public Mela(String tipo, int grammi){
        this.tipo = tipo;
        this.grammi = grammi;
    }

    public int compareTo(Mela m){
        return grammi - m.grammi;
    }
}

A voi è capitata spesso questa domanda? Raccontateci le vostre esperienze.

Ti è piaciuto questo post, Condividilo!

Articoli Correlati

Commenti

andrea caparro - 29/11/2012

si..domanda frequente..
x le interfacce: in java a differenza del C++ non esiste la multiereditarietà diretta( una classe può estendere una sola interfaccia), ma si usa, come già detto, fare l'implements di più interfacce; a volte la domanda da colloquio è: come ottenere la multiereditarietà in java;

Ciro Ascione - 30/11/2012

aggiungerei :
- che la visibilità per metodi e attributi di una classe astratta è + elastica a differenza delle interfacce (solo public).
- ritornando sul punto precedente estendendo una classe astratta posso ridefinire la visibilità dei metodi.
- volendo sfruttare l'ereditarietà mi viene in mente che estendendo una classe astratta la classe figlio deve definire i metodi astratti, mentre un'interfaccia figlio non deve obbligatoriamente definirli.
- i metodi di un'interfaccia non posso essere final, native, strictfp
- un' interfaccia può estendere una o più interfacce
- un' interfaccia può estendere solo interfacce

Ariel Demian - 29/01/2013

Ci sono molte porcherie che puoi fare con le classi e le interfacce in java, la domanda è: sono cose davvero utili?
La programmazione ad oggetti serve per modellare la realtà, in modo da facilitare la programmazione dei comportamenti.
Se ci si addentra futilmente negli artifici complessi di java si rischia soltanto di incasinare l'intero progetto.

Ariel Demian - 29/01/2013

Proprio adesso mi sono messo ad indagare oltre. Ecco le assurdità che si possono ottenere:
- metodi "abstract" in una interfaccia (non ha il minimo senso?!?)
- una classe astratta con un solo costruttore "private"
- un'interfaccia con attributi "private"

Ciro Ascione - 04/02/2013

concordo pienamente con te Marco.
Ariel io non so quale libro tu abbia scelto per studiare java ma :
1) In un' interfaccia gli attributi o meglio il modificatore di accesso può essere solo public (per definizione gli attributi in un' interfaccia sono costanti) per cui private non credo tu possa utilizzarlo.
2) Per definizione i metodi di un' interfaccia sono tutti abstract proprio perchè implementado l'interfaccia devi obbligatoriamente definire l'implementazione dei metodi in essa contenuti.
Scrivere solo il nome del metodo o anteporre abstract E' LA STESSA COSA!
3) Un solo costruttore privato in una classe abstract? forse vuoi esporre metodi o campi statici della classe, o meglio ancora un metodo factory che ti ritorni l'istanza della classe.

AVANZATO, SPERO POSSA AITARTI A CAPIRE:
definisci pure una tua classe abstract con costruttore private e utilizzala come classe anonima ;) vedrai che ti riuscirà di istanziarla
;););)
Una considerazione da "Testimone di Java":
LE INTERFACCE SONO L'ESSENZA DEL POLIMORFISMO!!!!!!

Michele Camorchia - 04/02/2013

Concordo in pieno ed aggiungerei che senza polimorfismo tanto vale programmare in stile procedurale! :-D

Marco Ballante - 30/11/2012

Ciao @andrea! Eh si, poi si va a finire sempre la, alla differenza tra C++ e Java riguardo l'eredità multipla.

Marco Ballante - 01/12/2012

Bene @Ciro, ciao e grazie per il tuo contributo.
Aspettiamo altre eventuali esperienze ed approfondimenti.

Marco Ballante - 03/02/2013

@Ariel l'utilità delle interfacce e delle classi astratte non penso possa essere messa in discussione, sono la base della programmazione ad oggetti e di Java. Altro discorso è la pura teoria, che, slegata dalla realtà pratica, può anche sembrare assurda. Secondo me l'approccio più razionale possibile che si può avere difronte ad una tecnologia in genere, è domandarci se ci è utile o no, e sicuramente le interfacce e le classi astratte sono fondamentali.

Lascia un Commento

Per lasciare un commento devi essere autenticato Accedi

Javajob.it © 2017 - Javajob.it è un progetto realizzato da Gsoftware srls