pepp1995 ha scritto:
Se fosse definita in Auto , io potrei fare semplicemente s="panda"
al di fuori del costruttore , ovvero fare:
Ma non è così perché ho un errore a tempo di compilazione.
No, non puoi. Non si possono mettere
istruzioni fuori da metodi/costruttori/initialization block!
Insomma, una istruzione
s=".....";
NON la puoi mettere così da sola fuori da metodi/costruttori.
Puoi mettere un System.out.println( ...); fuori da metodi/costruttori? NO
Puoi mettere if, switch ecc.... fuori da metodi/costruttori? NO
E' una questione di
sintassi, non c'entra l'ereditarietà!
pepp1995 ha scritto:
Questo mi porta a pensare che una "variabile ereditata" non è ereditata ""dalla CLASSE in sé "" bensì "da tutte le ISTANZE di quella CLASSE""
"Ereditare" in Java è più che altro una questione di visibilità/accessibilità di un membro.
Se la situazione fosse (nota i private !):
class Vettura {
private String s="subaru";
}
class Auto extends Vettura {
private String s=" panda";
Auto() {
s="panda";
}
// .......
}
Un oggetto Auto COMUNQUE possiede DUE variabili. Semplicemente sono private, quindi:
a) Auto non può ereditare "s" da Vettura
b) In Auto "super.s" non sarebbe fattibile dato che per Auto "non esiste" la s di Vettura (non la vede proprio ...)
Ma nell'oggetto c'è effettivamente lo spazio per DUE variabili che sono distinte e potrebbero avere valori differenti.
pepp1995 ha scritto:
Ma quindi "super.s" non è equivalente a "1.Dichiarare static quel membro della classe Padre e poi 2.fare Vettura.s" ?
Lo static qui non c'entra niente. static vuol solo dire che il membro "appartiene" alla classe e non a ciascun distinto oggetto.
Se in Vettura s fosse static, vuol solo dire che s di Vettura è "globale" e non sta in ciascun oggetto Auto ma il resto non cambierebbe.
Auto lo può "vedere" (se non private e accessibile).
pepp1995 ha scritto:
E se è così , "super" la posso vedere come "una reference di Tipo Padre che punta ad un oggetto di Tipo Figlio" (UPCASTING) ??
Nello specifico :
-fare System.out.println(super.s);
è la stessa cosa che fare
Vettura a=new Auto();
System.out.println(a.s);
?
Se hai un reference
v di tipo Vettura, allora v.s è appunto il riferimento al s di Vettura.
EDIT: ecco più completo:
public class Prova {
public static void main(String[] args) {
Vettura v = new Auto();
System.out.println(v.s); // stampa vettura
System.out.println(((Auto)v).s); // stampa auto
Auto a = new Auto();
System.out.println(a.s); // stampa auto
System.out.println(((Vettura)a).s); // stampa vettura
}
}
class Vettura {
String s = "vettura";
}
class Auto extends Vettura {
String s = "auto";
}