Ereditarietà in Java e NetBeans: abitazione, appartamento, villa

Ereditarietà in Java e NetBeans: abitazione, appartamento, villa

Un classico esempio introduttivo per capire il concetto di ereditarietà nella programmazione ad oggetti ed in Java, con l'aiuto di un ottimo IDE come NetBeans. Un semplice esercizio con una classe padre Abitazione estesa da due figlie, Villa ed Appartamento.

 

Proviamo a creare un nuovo progetto con NetBenas. Qui abbiamo scaricato la versione 12.5 direttamente con il app-store di linux ubuntu, ma è facile reperire il pacchetto di installazione sul sito di Apache NetBeans per Windows. Una volta installata la Java SDK e NetBeans, possiamo creare un nuovo progetto. Java è noto per avere degli assemblatori di progetti. Io personalmente preferisco Maven ma per progettini semplici in realtà non c'è mota differenza tra Maven, Grandle e Ant. Diciamo che meriterebbe un articolo a parte. Scegliamo Java Application e clicchiamo Next 

 

A questo punto ci troviamo a scegliere il nome del progetto, cartella di salvataggio da impostare a piacere. Group Id, Version e Package solitamente non sono molto interessanti per lavori piccoli e possiamo lasciarli così o personalizzarli con il nostro nome o altro.

Maven ci creerà una struttura di progetto dove definire il codice sorgente Source Package e uno dove inserire la classe di Test con il metodo main in modo da separare i due mondi.

 

Il codice questa volta non è stato creato a mano da zero, ma attraverso le comode utility di NetBeans, IDE di sviluppo molto potente e comodo per sviluppare in Java e non solo. Il trucco è semplicemente quello di definire gli attributi privati per poi usare la funzione "Insert Code" con il tasto destro o la scorciatoia Alt+Ins. Qui possiamo usare Costructor, Setter & Getter, toString, equals per creare i metodi pubblici più utili.

Vediamo il codice delle singole classi

package com.mycompany.abitazione;

import java.util.Objects;

/**
 *
 * @author Alfredo Centinaro
 */
public class Abitazione {
    private int     stanze;
    private double  superficie;
    private String  indirizzo;
    private String  citta;

    
    public Abitazione(int stanze, double superficie, String indirizzo, String citta) {
        this.stanze = stanze;
        this.superficie = superficie;
        this.indirizzo = indirizzo;
        this.citta = citta;
    }
    
    public int getStanze() {
        return stanze;
    }

    public void setStanze(int stanze) {
        this.stanze = stanze;
    }

    public double getSuperficie() {
        return superficie;
    }

    public void setSuperficie(double superficie) {
        this.superficie = superficie;
    }

    public String getIndirizzo() {
        return indirizzo;
    }

    public void setIndirizzo(String indirizzo) {
        this.indirizzo = indirizzo;
    }

    public String getCitta() {
        return citta;
    }

    public void setCitta(String citta) {
        this.citta = citta;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Abitazione other = (Abitazione) obj;
        if (this.stanze != other.stanze) {
            return false;
        }
        if (Double.doubleToLongBits(this.superficie) != Double.doubleToLongBits(other.superficie)) {
            return false;
        }
        if (!Objects.equals(this.indirizzo, other.indirizzo)) {
            return false;
        }
        if (!Objects.equals(this.citta, other.citta)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Abitazione{" + "stanze=" + stanze + ", superficie=" + superficie + ", indirizzo=" + indirizzo + ", citta=" + citta + '}';
    }
    
    
}
package com.mycompany.abitazione;

/**
 *
 * @author Alfredo Centinaro
 */
public class Appartamento extends Abitazione{
    private int piano;
    private boolean ascensore;
    private int terrazzi;

    public Appartamento(int piano, boolean ascensore, int terrazzi, int stanze, double superficie, String indirizzo, String citta) {
        super(stanze, superficie, indirizzo, citta);
        this.piano = piano;
        this.ascensore = ascensore;
        this.terrazzi = terrazzi;
    }

    public int getPiano() {
        return piano;
    }

    public void setPiano(int piano) {
        this.piano = piano;
    }

    public boolean isAscensore() {
        return ascensore;
    }

    public void setAscensore(boolean ascensore) {
        this.ascensore = ascensore;
    }

    public int getTerrazzi() {
        return terrazzi;
    }

    public void setTerrazzi(int terrazzi) {
        this.terrazzi = terrazzi;
    }

    @Override
    public String toString() {
        return "Appartamento{" + "piano=" + piano + ", ascensore=" + ascensore + ", terrazzi=" + terrazzi + '}';
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Appartamento other = (Appartamento) obj;
        if (this.piano != other.piano) {
            return false;
        }
        if (this.ascensore != other.ascensore) {
            return false;
        }
        if (this.terrazzi != other.terrazzi) {
            return false;
        }
        return true;
    }
    
}

e infine

package com.mycompany.abitazione;

/**
 *
 * @author Alfredo Centinaro
 */
public class Villa extends Abitazione{
    
    private int piani;
    private double metrigiadino;
    private boolean piscina;

    public Villa(int piani, double metrigiadino, boolean piscina, int stanze, double superficie, String indirizzo, String citta) {
        super(stanze, superficie, indirizzo, citta);
        this.piani = piani;
        this.metrigiadino = metrigiadino;
        this.piscina = piscina;
    }

    public int getPiani() {
        return piani;
    }

    public void setPiani(int piani) {
        this.piani = piani;
    }

    public double getMetrigiadino() {
        return metrigiadino;
    }

    public void setMetrigiadino(double metrigiadino) {
        this.metrigiadino = metrigiadino;
    }

    public boolean isPiscina() {
        return piscina;
    }

    public void setPiscina(boolean piscina) {
        this.piscina = piscina;
    }

    @Override
    public String toString() {
        return "Villa{" + "piani=" + piani + ", metrigiadino=" + metrigiadino + ", piscina=" + piscina + '}';
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Villa other = (Villa) obj;
        if (this.piani != other.piani) {
            return false;
        }
        if (Double.doubleToLongBits(this.metrigiadino) != Double.doubleToLongBits(other.metrigiadino)) {
            return false;
        }
        if (this.piscina != other.piscina) {
            return false;
        }
        return true;
    }
    

    
}

La classe di Test in questo caso non fa un granché ma può essere migliorata dal lettore. Per eseguire il nostro test, possiamo fare la build del progetto col bottone martello o martello/spazzola, poi posizionarci col tasto destro sulla classe Test e cliccare Run File.

import com.mycompany.abitazione.Appartamento;
import com.mycompany.abitazione.Abitazione;
import com.mycompany.abitazione.Villa;


/**
 *
 * @author Alfredo Centinaro
 */
public class Test {
    public static void main(String[] args) 
    {
        Appartamento a = new Appartamento(1, false, 2, 5, 127.50, "Via Garibaldi", "Teramo");
        System.out.println(a.toString());
    }
}