Salve a tutti,
sto studiando l'ereditarietà e l'override dei metodi.
In particolare, devo implementare questa classe:
Scrivere una classe astratta Java Opera, contenente i campi privati nome (String) e anno (int), durata(int), valutazioni (int[]) e i seguenti metodi d'istanza:
..
..diversi metodi già implementati
..
public abstract void descrizioneOpera() : stampa una descrizione testuale dell’opera. Nota: il metodo e' abstract: le classe figlie dovranno implementare tale metodo.
Opera:
public abstract class Opera
{
private String nome;
private int anno;
private int durata;
private int[] valutazioni = new int[0];
//vari metodi già implementati
---
--
public abstract void descrizioneOpera();
}
Giustamente
descrizioneOpera non ha un corpo, proprio perché è un metodo astratto.
Ora, quando vado nel main e istanzio un oggetto di tipo opera:
Opera prima = new Opera("Back in black", 1980, 3);
la jmv mi dice:
Opera is abstract; cannot be instantiated.
Così, faccio come mi consiglia l'IDE:
Implement all abstract methods.
Ed ecco qui, nel main:
Opera prima = new Opera("Back in black", 1980, 3) {
@Override
public void descrizioneOpera()
{
}
};
Da quello che ho capito questo è un caso di classe anonima, in quanto sto
dichiarando e contemporaneamente istanziando una classe. Giusto?
Come richiesto dalle specifiche
descrizioneOpera deve stampare una descrizione testuale dell'opera.
Dunque se, per esempio, facessi:
Opera prima = new Opera("Back in black", 1980, 3) {
@Override
public void descrizioneOpera()
{
System.out.print(prima.getTitolo()); //getTitolo fa un return del nome dell'opera
}
};
mi salterebbe fuori questo errore:
local variables referenced from an inner class must be final or effectively final
Ovvero, le variabili locali di riferimento da una classe interna devo essere final..
Cosa devo fare?
Grazie