Una classe astratta è simile a una normale classe: può avere attributi e metodi, ma è caratterizzata dalla parola chiave abstract. Non può essere istanziata e la sua implementazione è demandata alle sottoclassi;
Esempio:
public abstract class Animale { //campi private boolean vivo=true; //metodi public boolean isVivo() { return this.vivo; } }
La classe “animali” è una categoria concettuale, non esiste “il generico animale”, ma solo animali specifici;
Può avere, inoltre, metodi definiti ma non implementati (marcati anch’essi con la parola chiave abstract).
public abstract void metodo();
Una classe astratta, quindi dichiarata con “abstract class”, può anche non avere nessun metodo astratto.
Esempio
public abstract class MyClass { public void hello() { } }
Viceversa, se una casse ha un metodo astratto deve essere per forza dichiarata abstract.
Esempio
public class MyClass { public abstract void hello();// ERRORE DI COMPILAZIONE: la classe deve essere dichiarata astratta }
Una classe astratta può avere dei costruttori, anche senza poter essere istanziata: il costruttore verrà utilizzato dalle sottoclassi.
Esempio
public abstract class MyClass { public MyClass(int i) { } }
Una classe può estendere una classe astratta, a patto che fornisca tutte le implementazioni necessarie; qualora ciò non avvenga, resta astratta anche se i suoi metodi non sono abstract.
Esempio:
public abstract class Veicolo_classe_astratta { public abstract void accendi(); } public class Auto_4x4 extends Veicolo_classe_astratta // classe concreta, essendo fornita un'implementazione per il metodo accen-di() { public void accendi() { System.out.println("veicolo acceso"); } }