Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: ereditarietà Java

  1. #1

    ereditarietà Java

    Salve io la classe base "persona" e poi ho la classe derivata "Studente", perchè posso fare p=s e non s=p ???
    a me sembrerebbe il contrario perchè visto che studente ha dei metodi e delle varialibili in aggiunta e l'assegnamento è verso sinistra, ci sta meglio se faccio s=p, pero' nel libro di testo dice che è scorretto! In cosa sbaglio? come si spiega questa cosa?
    di seguito metto un esempio:

    public class EsempioDiCitta {
    public static void main(String args[]){
    Persona p = new Persona("John");
    Studente s = new Studente("Tom");
    p.print(); // stampa nome ed età
    s.print(); // stampa nome, età, matricola
    p=s; // OK (Studente estende Persona) /* QUESTA è LA RIGA CHE NON CAPISCO */
    }
    }

    Ringrazio anticipatamente per l'aiuto
    -- utente Kubuntu --

  2. #2
    perche uno studente è una persona ma nn sempre una persona è uno studente
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  3. #3
    Originariamente inviato da Luc@s
    perche uno studente è una persona ma nn sempre una persona è uno studente
    si ma lo studente ha una variabile in più cioè il numero di matricola, come faccio a farcela stare nella classe base di persone che non hanno quel campo li!? Viene perso?
    -- utente Kubuntu --

  4. #4
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Caio.. in pratica dichiarando Studente s = new Persona("Tom"); non tratterai più con un oggetto di tipo studente, ma di tipo persona... per la VM a runtime s sarà una persona... di conseguenza la variabile "matricola" che appartiene a studente non sarà più utilizzabile perchè....., come dire , l'oggetto studente è come se non fosse stato proprio creato ( non è proprio così però... per rendere l'idea ). Al contrario non si può fare Persona p = new Studente("Roger"); in quanto come ti ha già detto Luc@s non tutte le persone sono degli studenti.
    Ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  5. #5
    quindi l'assegnazione p=s è come fare:
    Studente p = new Persona("Tom"); // ??? :master:
    -- utente Kubuntu --

  6. #6
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    No... non proprio... in pratica con Studente s = new Persona("Tom"); tu crei un nuovo oggetto di tipo persona indicato con s;
    facendo s = p; tu non fai altro che dare a s lo stesso indirizzo di memoria di p e poichè s implicitamente è, di fatto, una persona, la VM perderà il riferimento al vecchio indirizzo di memoria di s ( che in partenza era uno studente ) e punterà al nuovo indirizzo di memoria che è identico a quello di p ( che è una persona ) e non ti segnerà errori semplicemnte perchè non ce ne sono in quanto può, a tutti gli effetti, trattare s come fosse una persona.
    Spero di non averti confuso le idee ancora di più... ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  7. #7
    Originariamente inviato da Angelo1974
    Caio.. in pratica dichiarando Studente s = new Persona("Tom"); non tratterai più con un oggetto di tipo studente, ma di tipo persona... . Al contrario non si può fare Persona p = new Studente("Roger"); Ciao
    non è proprio corretto...

    se scrivi Persona p = new Studente (...) non c'è nessun problema
    se invece scrivi Studente p = new Persona (...) non te lo compilerà mai...

    Persona p = new Studente (..) è una riga legalissima in java...è proprio sulla dichiarazione di variabili padre per poi richiamare i costruttori delle classi figlie che si implementa il polimorfismo...

  8. #8
    tornando all'esempio nostro, si può fare p = s perchè è una normalissima promozione...

    è come convertire un Integer in un Object (cosa che succede automaticamente quando si usano i Vector)

    invece se devi convertire una classe in una derivata ci devi mettere il cast obbligatorio perchè l'oggetto viene specializzato

    (infatti quando riprendi gli oggetti da un vector sei costretto a fare il cast...)

    zao!

  9. #9
    allora forse non mi ricordo piu' il significato di p=s
    cosa vuol dire fare sto = tra due oggetti? gli si assegna ad uno l'indirizzo referent dell'altro? o gli si assegna ad uno lo stato dell'altro?
    -- utente Kubuntu --

  10. #10
    se usi tipi di dati primitivi (int, boolean, float, byte, double etc etc etc) facendo a=b metti in a una copia di b;

    se invece stai lavorando con OGGETTI (e non TDA base del linguaggio), l'assegnamento a=b da ad a lo stesso riferimento di b.

    In pratica guarda questo codice:

    codice:
    Integer a,b;
    int c,d;
    a = new Integer(3); 
    b = new Integer(3);
    c = 3;
    d = 3;
      .
      .
      .
      .
      .
    if (c==d) {...}
    if (a==b) {...}
    bene, la prima delle due condizioni in fondo risulkterà VERA mentre l'altra falsa, perchè gli oggetti vengono confrontati in base al loro indirizzo di memoria, mentre i TDA primitivi solo in base al loro valore, pertante c==d VERO mentre a==b FALSO sebbene abbiano lo stesso valore.

    Se fai a=b inoltre, dato che dopo di questa istruzione i due oggetti (non importa di che tipo siano) hanno la stessa immagine in memoria modificando uno MODIFICHI ANCHE L'ALTRO.

    per fare in modo che siano due copie devi fare:

    a = b.clone()

    che è un motodo di tutti gli object. in c++ invece (correggetemi) occorre usare un costruttore di copia x ottenere lo stesso scopo.

    ciauz!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.