Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    spiegazione ad un neofita!!!

    salve a tutti, avrei bisogno di capire una cosa riguardo a questo frammento di codice, premetto che ho appena iniziato a studiare java, quindi perdonatemi se la domanda risulta banle!!!

    codice:
    public class Auto {
    
    public static void main (String[] argv){
    
    Veicolo v = new Veicolo();     //Veicolo = superclasse
    Macchina fiat = v;                //Macchina = classe derivata di Veicolo  
    fiat.muovi(120);
    
    }//fine metodo main
    }//fine class Auto
    Avrei bisogno di sapere una cosa...
    il codice sopra l'ho preso da un esercizio di un libro...
    cosa vuol dire la dichiarazione Macchina fiat = v; ???
    cioè ... io creo un'istanza della superclasse Veicolo di tipo Macchina???
    e a cosa servirebbe???
    scrivendo Macchina fiat = new Macchina(); non sarebbe la stessa cosa visto che la sottoclasse Macchina ha ereditato tutto dalla superclasse???quale sarebbe la differenza??

    un'altra domanda... queste due istruzioni sono uguali?

    Macchina fiat = v;
    Macchina fiat = new Veicolo;

    per favore, aiutatemi a sciogliere questi tremendi dubbi, cercato dappertutto, ma non riesco a capire il concetto...

    grazie in anticipo per le risposte

  2. #2
    ti rispondo alla seconda domanda si

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da bircastri
    ti rispondo alla seconda domanda si
    In generale NO e ti spiego il motivo:

    se tu hai un veicolo v inizializzato in un momento t, se dopo 10 istruzioni fai

    codice:
    Macchina fiat = v;
    assegni a fiat il riferimento di v. Significa che adesso hai 2 contenitori (variabili) che puntano (passami il termine) allo stesso oggetto.

    ma se tu fai
    codice:
    Veicolo v = new Veicolo(); 
    //dopo un po'
    Macchina fiat = new Veicolo();
    a fiat assegni un riferimento ad un oggetto di tipo veicolo, che non è lo stesso di v!!Adesso in memoria hai 2 oggetti di tipo veicolo referenziati da 2 variabili.

    Anche quando fai

    codice:
    Veicolo v = new Veicolo(); 
    Macchina fiat = v;
    qui hai in fiat un riferimento ad un'istanza pulita (appena nata) di veicolo, in memoria hai un solo oggetto, ma 2 riferimenti vi puntano.

    Riepilogando: l'assegnamento (fiat = v)comporta 2 riferimenti che puntano allo stesso oggetto, il new comporta avere 2 riferimenti che puntano ad oggetti differenti.

    Riguardo la prima domanda, l'esercizio vuole farti degli esempi su ereditarietà e polimorfismo

  4. #4
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    Se hai preso questo esempio da un libro era per spiegarti che non puoi fare questo

    Macchina fiat = v;

    ti da errore e non ti fa compilare perche Macchina è un Veicolo, ma non è vero il contrario

  5. #5
    Originariamente inviato da valia
    ma se tu fai
    codice:
    Veicolo v = new Veicolo(); 
    //dopo un po'
    Macchina fiat = new Veicolo();
    A rigor di logica Macchina dovrebbe essere una sottoclasse di Veicolo, quindi così facendo ottieni un errore di compilazione, a prescindere dal tipo di ereditarietà (inteso come relazione) applicata.

  6. #6
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    Originariamente inviato da VincenzoTheBest
    A rigor di logica Macchina dovrebbe essere una sottoclasse di Veicolo, quindi così facendo ottieni un errore di compilazione, a prescindere dal tipo di ereditarietà (inteso come relazione) applicata.
    non solo a rigor di logica lo ha scritto proprio nel primo post
    codice:
    Veicolo v = new Veicolo();     //Veicolo = superclasse
    Macchina fiat = v;                //Macchina = classe derivata di Veicolo
    quindi come abbiamo gia detto non ti fa compilare, a meno che tu non faccia un cast esplicito, ma così facendo entri nei "casini" neri e negli errori in runtime

  7. #7
    Originariamente inviato da bstefano79
    non solo a rigor di logica lo ha scritto proprio nel primo post
    Già è vero, è scritto esplicitamente, quindi andiamo oltre il rigore.
    Allora non mi spiego come abbia potuto scrivere una cosa del genere...

    Epic fail (cit.)

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    io non sono entrata nel merito di errori di compilazione, bensì nel merito della seconda domanda (che riguardava più che altro l'assegnamento di un riferimento ad una variabile).

    Presumo che nella copia si siano scordati di un cast, perché

    codice:
    	Exception e = new Exception(); 
    	MyException ex = (MyException) e; //MyException extends Exception
    è perfettamente lecita a livello di compilazione, correggendo quindi resta lecito che questo crea 2 riferimenti che puntano alla stessa roba, mentre con new si crea un nuovo oggetto

  9. #9
    Originariamente inviato da valia
    Presumo che nella copia si siano scordati di un cast
    Si, ma a questo punto non ha nulla a che vedere con il polimorfismo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    lo so, ma allora avranno fatto male l'esempio

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.