Newsgroup: it.comp.java
Titolo: problema scelta metodo da eseguire

DATA LA SEGUENTE DICHIARAZIONE:
public class A {
    private log a;
    public void assegna(long x) {
        a = x;
    }
    public String toString () {
        return "a = " + a;
    }
}
public class B extends A {
    private int b1;
    private double b2;
    public B() {
        b1 = 1;
        b2 = 1;
    }
    public void assegna(int x) {
        b1 = x;
    }
    public void assegna(double x) {
        b2 = x;
    }
    public String toString () {
        return super.toString() + "b1  = " + b1 + " , b2 = " + b2;
    }
}
public class C extends B {
    private int c1;
    private double c2;
    public void assegna(int x) {
        c1 = x;
    }
    public void assegna(double x) {
        c2 = x;
    }
    public String toString () {
        return super.toString() + "c1  = " + c1 + " , c2 = " + c2;
    }
}
-------------------------------------------------------------------
E LA SEGUENTE CLASSE DI PROVA :
class Prova {
    public static void main(String[] a) {
        C gamma = new C();                                // riga 1
        A alfa = gamma;                                        // riga 2
        B beta = gramma;                                    // riga 3
        System.out.println (alfa.toString());            // riga 4
        alfa.assegna(3L);                                        // riga 5
esegue il metodo assegna(long x)
        System.out.println (alfa.toString());
        alfa.assegna(2);                                        // riga 7
esegue il metodo assegna(long x)
        System.out.println (alfa.toString());
        beta.assegna(4);                                    // riga 9
esegue il metodo assegna(int x)
        System.out.println (alfa.toString());
        gamma.assegna(8d);                                // riga 11
esegue il metodo assegna(double x)
        System.out.println (alfa.toString());
    }
}
------------------------------------------------------------------
Per quale motivo alla riga 5 viene eseguito il metodo assegna presente nella
classe A (il quanto il parametro passato č di tipo long)
mentre nella riga 7, nonostante il parametro sia di tipo int viene eseguito
ancora il metodo assegna della classe A e non quello della classe C?
Se nelle prime 3 righe il riferimento del nuovo oggetto creato (istanza
della classe C) viene assegnato alle variabili gamma, alfa e beta; non
divrebbe partire sempre a cercare i metodi dalla classe C poi B poi A?
Mi scuso per il troppo testo.
Ciao
Corti

 Corti
Provo a dare una risposta. Partiamo dal presupposto che il compilatore,
quando fai una cosa del genere 'A alfa = gamma;', parte dal presupposto
che tu stai referenziando un oggetto di classe A. Per il fatto
(presumo) che il parametro int viene automaticamente promosso a double
anche alla riga 7 viene richiamato il metodo della classe A. Per
verificare quello che dicevo prima (il comportamento del compilatore),
prova a fare una chiamata del genere 'alfa.assegna(2d), il programma non
compilerebbe. La cosa funziona invece quando lo stesso ragionamento viene
fatto sulla variabile beta, perché la classe B ha i metodi assegna(int) e
assegna(double). A run-time poi ad essere chiamati sono effettivamente i
metodi di C, perché vengono entrambi ridefiniti.
Ciao,
Andrea.