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.
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.