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

    [JAVA] array di oggetti di sottoclassi diverse

    Sono un totale newbie, sto studiando il linguaggio e vi chiedo una cosa che non ho trovato nel sito e nel forum.
    Vorrei capire come accedere a caratteristiche di oggetti istanziati in diverse sottoclassi e raggruppati nello stesso array.
    Credo che il problema sia tutto in
    "mezzo allSubOfMezzo[] = {ferrari,ducati};"

    Qui il mio main:
    codice:
    package locomozione;
    public class Main {
        public static void main(String[] args) {
    // Istanzio mezzi dalle sottoclassi
            auto ferrari = new auto();
            moto ducati = new moto();
    //creo array
            mezzo allSubOfMezzo[] = {ferrari,ducati};
    //vedete che ottengo il valore se accedo direttamente all'oggetto
            System.out.println("Ferrari is "+ferrari.TIPO_MEZZO);
            System.out.println("Ducati is "+ducati.TIPO_MEZZO);
    //Qui sotto il problema: non accedo alla caratteristiche degli oggetti tramite l'array
            System.out.println("allSubOfMezzo[0] (aka ferrari) is "+allSubOfMezzo[0].TIPO_MEZZO);
            System.out.println("allSubOfMezzo[1] (aka ducati) is "+allSubOfMezzo[1].TIPO_MEZZO);
        }
    }
    La superclasse :
    codice:
    package locomozione;
    public class mezzo /*implements comandiGuida*/{
        String TIPO_MEZZO;
        String LISTA_RUOTE[];
    }
    La sottoclasse auto:
    codice:
    package locomozione;
    //auto is a subclass of mezzo
    public class auto extends mezzo {
        static final String TIPO_MEZZO="auto";
    }
    E la sottoclasse moto:
    codice:
    package locomozione;
    //moto is a subclass of mezzo
    public class moto extends mezzo {
        static final String TIPO_MEZZO="moto";
    }
    Ciao,
    Andrea

  2. #2

    Re: [JAVA] array di oggetti di sottoclassi diverse

    Originariamente inviato da manzamanna
    codice:
    //Qui sotto il problema: non accedo alla caratteristiche degli oggetti tramite l'array
            System.out.println("allSubOfMezzo[0] (aka ferrari) is "+allSubOfMezzo[0].TIPO_MEZZO);
            System.out.println("allSubOfMezzo[1] (aka ducati) is "+allSubOfMezzo[1].TIPO_MEZZO);
    }
    Dovresti fare il cast:
    codice:
    System.out.println("allSubOfMezzo[0] (aka ferrari) is "+((auto)allSubOfMezzo[0]).TIPO_MEZZO);
    System.out.println("allSubOfMezzo[1] (aka ducati) is "+((moto)allSubOfMezzo[1]).TIPO_MEZZO);
    }
    perchè il TIPO_MEZZO nelle sottoclassi non corrisponde con il campo TIPO_MEZZO della superclasse Mezzo, sono diversi.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Si vede che sei totalmente newbie, visto anche che le convenzioni java (e della programmazione ad oggetti in genere) sono un mezzo optional.

    Intanto, le classi hanno in genere nome che inizia per lettera maiuscola, i nomi dei campi (se non sono costanti) iniziano per lettera minuscola.

    codice:
    public class Mezzo{
       private String tipo;
    
       public void setTipo(String tipo){this.tipo = tipo;}
       public String getTipo(){return tipo; }
    }
    è un esempio di classe modellata in modo corretto.
    Il tipo in genere non è una proprietà statica della classe: usare static indica che quella proprietà è valida per OGNI istanza della classe, cioè OGNI oggetto di quel tipo ha quel valore. Usare final indica che non puoi più modificarlo. Il tipo non è una proprietà di classe, ma è di istanza, cioè ogni oggetto di tipo mezzo ha associato un tipo di auto. Quindi definire la classe in quel modo non è corretto.

    In genere quando si eredita (si estende una classe) si aggiungono funzionalità alla stessa o si ridefinisce un comportamento, per cui non ha molto senso una roba del genere

    codice:
    public class moto extends mezzo {
        static final String TIPO_MEZZO="moto";
    }
    mentre è corretto una roba del tipo

    codice:
    public class Moto extends Mezzo{
       public String getTipo(){
          return "moto";
       }
    }
    in cui ridefinisci il comportamento per un oggetto di quel tipo.

    oppure

    [code]
    public class Moto extends Mezzo{
    public String getTipo(){
    return tipo;
    }
    }

    facendo attenzione ad aver dato a tipo valore "moto" al momento della creazione dell'oggetto

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: Re: [JAVA] array di oggetti di sottoclassi diverse

    Originariamente inviato da VincenzoTheBest
    Dovresti fare il cast:
    e hai ragione, ma in questo modo perdi il vantaggio di estendere, se definisce il tipo come proprietà di istanza e non di classe e definisce il metodo getTipo() (cioè usa la programmazione ad oggetti in modo corretto) non ha bisogno né di cast (che possono dare RuntimeException) né di altri controlli

  5. #5
    Ringrazio entrambi
    ciao

  6. #6
    Originariamente inviato da manzamanna
    Ringrazio entrambi
    ciao
    Inoltre se fai
    codice:
    System.out.print( allSubOfMezzo[0] )
    viene invocato il metodo toString() della classe Object ed otterresti come risultato il valore della seguente riga
    codice:
    getClass().getName() + '@' + Integer.toHexString(hashCode())
    .
    Questo perchè il metodo non è stato ridefinito da nessuna parte nel tuo codice.

    EDIT:
    Mentre invece se scrivi:
    codice:
    System.out.print( "allSubOfMezzo[0]" )
    ti viene semplicemente stampato ciò che è racchiuso tra le virgolette, in quanto al print stai passando una istanza della classe String e non l'oggetto di tipo Auto che intendevi.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da VincenzoTheBest
    Inoltre se fai
    codice:
    allSubOfMezzo[0]
    viene invocato il metodo toString() della classe Object ed otterresti come risultato il valore della seguente riga
    codice:
    getClass().getName() + '@' + Integer.toHexString(hashCode())
    .

    Questo perchè il metodo non è stato ridefinito da nessuna parte nel tuo codice.
    come lo aveva scritto otteneva null a dire il vero

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.