Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Esercizio overload e override

    Ciao a tutti, sto cercando di fare un esercizio su Java, che mi chiede di scrivere cosa stamperebbe a output:
    codice:
    public class Frutto {
    public String toString(){return "Frutto";}
    public void macedonia(Frutto f){System.out.println(this + " - " + f);}
    public void confronta(Frutto f){System.out.println("Sono uguali");}
    }
    public class Mela extends Frutto {
    public String toString(){return "Mela";}
    public void macedonia(Mela f){System.out.println(this + " - " + f);}
    public void confronta(Mela m){System.out.println("Sono diversi");}
    }
    public class Arancia extends Frutto {
    public String toString(){return "Arancia";}
    public void macedonia(Arancia f){System.out.println(this + " - " + f);}
    public void confronta(Arancia a){System.out.println("Non ho idea");}
    }
    e si spieghi cosa stamperebbe il seguente metodo main, motivando brevemente le risposte:
    public class Test {
    public static void main(String args[]) {
    Frutto f1, f2;
    Mela m;
    Arancia a;
    f1 = new Mela();
    f2 = new Arancia();
    m = new Mela();
    a = new Arancia();
    f1.macedonia(f2);
    f1.confronta(f2);
    a.confronta(f2);
    a.confronta(m);
    f2 = m;
    f1.macedonia(f2);
    a.macedonia(m);
    a.confronta(a);
    }
    }
    So già il risultato che è :
    codice:
    SOLUZIONE
    Le stampe sono
    Mela-Arancia
    Sono uguali
    Sono uguali
    Sono uguali
    Mela-Mela
    Arancia-Mela
    non ho idea
    Ma non capisco sinceramente in base a cosa vengono scelti i vari metodi all'interno delle classi. Chi mi può dare una mano? Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Superandri91 Visualizza il messaggio
    Ma non capisco sinceramente in base a cosa vengono scelti i vari metodi all'interno delle classi. Chi mi può dare una mano?
    In breve:
    1) il compilatore sceglie solo la signature (firma) del metodo da invocare in base al tipo statico del reference e in base al numero e al tipo statico degli argomenti.
    2) a runtime la implementazione del metodo che verrà eseguita è quella dell'oggetto realmente istanziato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Innanzitutto, grazie per la risposta. A livello pratico, come faccio a capire cosa scriverà? Non riesco a capire da dove prende i metodi (se nella classe madre o in quelle figlie) e in base a cosa!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Superandri91 Visualizza il messaggio
    Innanzitutto, grazie per la risposta. A livello pratico, come faccio a capire cosa scriverà? Non riesco a capire da dove prende i metodi (se nella classe madre o in quelle figlie) e in base a cosa!
    Ok, prendiamo es.

    f1.macedonia(f2);


    Compilazione:

    1) Per il compilatore f1 è di tipo Frutto. Non ha importanza (il compilatore non osserva questo) che tu hai assegnato a f1 un oggetto Mela. Il compilatore "guarderà" solo le firme dei metodi in Frutto.

    2) L'argomento è f2, di tipo Frutto. Idem anche qui il compilatore non osserva il fatto che a f2 hai assegnato un oggetto Arancia.

    3) Esiste in Frutto un unico metodo "macedonia" che è in grado di ricevere un Frutto? Sì, c'è. Questo basta affinché "compili".

    Runtime:

    1) Viene eseguito il metodo "macedonia" per l'oggetto realmente istanziato. Visto che f1 referenzia un Mela e visto però che Mela NON ridefinisce macedonia(Frutto), il metodo realmente eseguito è comunque quello di Frutto.

    2) La concatenazione con this fa eseguire il toString() dell'oggetto realmente istanziato. Che è Mela, quindi la prima stringa è "Mela".

    3) La concatenazione con f fa eseguire il toString dell'oggetto realmente istanziato assegnato a f. Che è Arancia, quindi la seconda stringa è "Arancia".
    Ultima modifica di andbin; 21-09-2014 a 16:34
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Non sono sicuro di avere capito... Ad esempio, nella terza "istruzione" "a.confronta(f2)"...
    Io ragiono così, a è un'arancia, gli viene passato un frutto di tipo arancia, quindi ci troviamo nel metodo di arancia e dovrebbe stampare "sono diversi", secondo il mio ragionamento. Invece, stampa ancora sono uguali!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Superandri91 Visualizza il messaggio
    Non sono sicuro di avere capito... Ad esempio, nella terza "istruzione" "a.confronta(f2)"...
    Io ragiono così, a è un'arancia, gli viene passato un frutto di tipo arancia, quindi ci troviamo nel metodo di arancia e dovrebbe stampare "sono diversi", secondo il mio ragionamento. Invece, stampa ancora sono uguali!
    a è di tipo Arancia, la variabile intendo ... non cosa ci assegni (che nel tuo caso è proprio un Arancia). Come ho già detto, ai fini della invocazione del metodo, non conta per il compilatore quale oggetto assegni. Questo entrerà in gioco solo in fase di runtime.

    L'argomento è di tipo Frutto. Idem, per il compilatore non importa (sempre ai fini della invocazione) che tu hai fatto f2 = new Arancia();. Stai passando una variabile, che è di tipo Frutto. Stop (per il compilatore).

    Dal momento che a è Arancia, il compilatore "guarderà" tra i metodi di Arancia E di Frutto (quelli che eredita, avendo esteso Frutto appunto).

    C'è in Arancia un metodo chiamato "confronta" che riceve un Frutto? Sì, c'è, è quello in Frutto!
    In Arancia c'è un confronta(Arancia a) ma questo è un overload ... non un override!

    Pertanto a runtime stamperà "Sono uguali".
    Ultima modifica di andbin; 22-09-2014 a 09:21
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.