Ereditarietà in Java

immagine in stile manga di un team di programmatori

Ereditarietà in Java

Nella programmazione orientata agli oggetti il concetto di ereditarietà consiste in una relazione tra due classi stabilita dal linguaggio di programmazione o dal programmatore.

Data una classe Madre che ha determinati attributi e metodi, la classe Figlia eredita gli attributi e i metodi dalla classe Madre e potrà poi averne dei suoi, specializzandosi.

Nel linguaggio Java non è permessa l’ereditarietà multipla, si può estendere solo una classe.

Case study

In questo esempio semplificheremo al minimo le classi per concentrarci sul concetto di ereditarietà senza perderci in una moltitudine di attributi e metodi.

Abbiamo una classe Person che rappresenta una persona, gli attributi sono: nome, cognome e anno di nascita. Infine oltre ai getters e ad i setters abbiamo un metodo che restituisce l’età corrente della persona: getCurrentAge().

Queste caratteristiche le ritroviamo anche nel concetto di studente, difatti uno studente è una specializzazione di persona, la classe Student erediterà gli attributi e i metodi di Person ed implementerà l’attributo number che rappresenta il numero di matricola dello studente, school che rappresenta il nome della scuola e cl per la classe.

UML

L’UML (Unified Modeling Language ) è un linguaggio per modellare e rappresentare i sistemi software da un punto di vista progettuale e funzionale. Per rappresentare il rapporto tra la classe Student e la classe Person , vengono illustrate in modo gerarchico con la classe Figlia sotto alla classe Madre e collegate con una freccia che parte dalla classe che specializza.

Schema UML per l’esempio Person e Student

Implementazione classi

Per specializzare una classe e permettergli di ereditare attributi e metodi da una classe Madre si utilizza la parola chiave extends

Di seguito il codice delle due classi

Person.java

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Person {
    String firstName;
    String lastName;
    int yob;

    public Person(String firstName, String lastName, int yob){
        this.firstName=firstName;
        this.lastName=lastName;
        this.yob=yob;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getLastName() {
        return lastName;
    }

    public void setYob(int yob) {
        this.yob = yob;
    }
    public int getYob() {
        return yob;
    }
    public int getCurrentAge(){
        GregorianCalendar calendar=new GregorianCalendar();
        int currentYear=calendar.get(Calendar.YEAR);
        return currentYear-yob;
    }

    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", yob=" + yob +
                '}';
    }
}

Student.java

public class Student extends Person{
    int number;
    String school;
    String cl;
    public Student(String firstName, String lastName, int yob, int number){
        super(firstName,lastName,yob);
        this.number=number;
    }
    public void setMatricola(int number) {
        this.number = number;
    }
    public int getNumber() {
        return number;
    }
    public String getSchool() {
        return school;
    }
    public void setSchool(String school) {
        this.school = school;
    }
    public String getCl() {
        return cl;
    }
    public void setCl(String cl) {
        this.cl = cl;
    }
    @Override
    public String toString() {
        String res;
        res=super.toString();
        res+= "number: " +number;
        return res;
    }
}

Nel costruttore di Student utilizzo la parola chiave super per richiamare il costruttore di Person e gli passo gli stessi parametri e poi assegno a number il relativo parametro

public Student(String firstName, String lastName, int yob, int number){
        super(firstName,lastName,yob);
        this.number=number;
}

Override

La parola chiave super la utilizzo anche nel metodo toString() di Student per richiamare il metodo toString() di Person e aggiunge anche il numero di matricola dello studente. Quando riscriviamo un metodo ereditato si sta eseguendo l’override del metodo.

Pubblicato da Carlo Contardi

Carlo Contardi, docente di informatica e sviluppatore Full Stack, condivide la sua passione per la programmazione e l’informatica attraverso il suo blog Space Coding. Offre preziosi consigli e soluzioni pratiche a chi vuole imparare a programmare o migliorare le proprie abilità. 🚀👨‍💻

Translate »