alexrr2iggs ha scritto:
l'override è il meccanismo attraverso il quale java implementa il concetto di polimorfismo per metodi, si applica quando avendo un metodo m definito in una classe A, viene ridefinito in una sottoclasse di A.
Si può dire un pelino meglio ma il senso è proprio questo.
andbin ha scritto:
Un oggetto che sia istanza di una classe include un istanza di ognuno dei suoi supertipi (era questo che mi aveva fatto confondere)
No .. nì, detto un po' male. Questo di seguito forse ti farà capire:
public class A {
private int v1 = 10;
public void stampaV1() {
System.out.println(v1);
}
}
public class B extends A {
private int v2 = 20;
public void stampaV2() {
System.out.println(v2);
}
}
Quando fai new B() crei 1 (e ripeto UNO solo) oggetto di tipo B. Esso contiene
sia la variabile di istanza v1,
sia la variabile di istanza v2. E su quell'oggetto B puoi invocare sia stampaV1 che stampaV2.
Il fatto che v1 e v2 sono
private è solo una questione di "accessibilità". Vuol semplicemente dire che v1 sarà accessibile solo da del codice all'interno di A mentre v2 solo da del codice in B. Ma lo "spazio" di memoria per v1 e v2 c'è COMUNQUE nell'oggetto B, indipendentemente dal loro livello di accesso.
La classe B "eredita" il metodo stampaV1 da A ma attenzione, NON eredita v1. In Java "ereditare" un membro da una super-classe è più una questione di accessibilità (visibilità se vogliamo anche dirlo così). I campi/metodi ci sono comunque TUTTI nell'oggetto, non è questo il fatto di "ereditare".
alexrr2iggs ha scritto:
ogni refernce ha un' interfaccia pubblica, che è la lista dei metodi public, la quale possiamo dire che ne determina il tipo
Il
reference è un valore e basta. E una variabile
di un tipo reference (es. String, Object ecc...) è semplicemente una variabile che è in grado di tenere il valore di un reference, null incluso.
alexrr2iggs ha scritto:
un refernce, per poter puntare un oggetto, necessita che quest' ultimo implementi tutti i metodi dell' interfaccia pubblica del reference stesso
Questa frase non vuol dire nulla, mi spiace.
alexrr2iggs ha scritto:
È possibile assegnare ad un refernce l'indirizzo di un oggetto che non implementi tutti i metodi dell'interfaccia del reference stesso?
Continui a parlare di "interfaccia" e di "reference", non ha senso.
In Java esistono: interfacce, classi astratte e classi "concrete" (ovvero non astratte). Puoi creare una istanza, ovvero ottenere un oggetto,
solo di classi "concrete". Poi la variabile a cui assegni l'oggetto può essere di qualunque tipo (anche di un tipo astratto) purché l'oggetto sia lecitamente assegnabile alla variabile.
Number n = new Integer(123);
Number (java.lang.Number) è una classe
astratta. Non potrai mai fare
new Number() (non è possibile, né avrebbe granché senso).
Integer è una sottoclasse "concreta" di Number. Quindi puoi istanziare un Integer ed assegnarlo ad una variabile di tipo Number.
Poi siccome la variabile
n è di tipo Number, potrai invocare solo metodi "noti" a Number. Non puoi fare n.compareTo(altroInteger) perché compareTo è di Integer e Number non ne "sa" nulla.
Però puoi fare n.intValue(). Il intValue è noto a Number ed è
implementato in Integer. Quindi quando l'oggetto istanziato è realmente un Integer allora è il intValue()
di Integer ad essere eseguito, non quello in Number.
Più chiaro?