Innanzitutto attento all'EDIT che avevo inserito nel messaggio con il codice, avevo scritto di fretta e inserito un errore macroscopico...
Riprendo da dove ero rimasto con le risposte :
xXNicolaXx ha scritto:
[...] allora, quindi il metodo set serve per modificare la variabile che in questo caso è la stringa nome e/o cognome, giusto? La classe passeggero è quindi completa come l'hai scritta tu.
Ok per il set. Nota che modificare le variabili con il metodo set è il modo più utilizzato per una lunga serie di motivi, non l'unico.
Non ha molto invece senso parlare di classe completa o meno, come fai a definire quando una classe è completa? Se hai i metodi getter e setter per ogni campo (quelli per cui vale la pena prevederli) e hai dei costruttori sensati, sei già a buon punto, ma puoi sempre aggiungere nuove funzionalità, ridefinire toString() è un esempio, ma potresti anche ridefinire equals() o aggiungere quanti e quali metodi vuoi... In questo caso direi che per ora è accettabile (ma considera i cambiamenti che avevo fatto).
xXNicolaXx ha scritto:
Non so se non ho capito io e chiedo scusa in anticipo, ma con quel metodo stampa "System.out.println("Nome : " +getNome());" mi va a stampare l'ultimo nome inserito..quindi se ad esempio metto come primo nome pippo e poi chiedo di inserirne un altro e digito baudo, lui quando chiederò la stampa mi fa vedere solamente baudo..forse perchè appunto devo poi inserirlo in un vettore che contiene nome+cognome?
No, questo non è esatto. Stai continuando a focalizzarti su quell' "ultimo nome inserito", ma non è assolutamente così. Il metodo getNome() è definito nella classe Passeggero, e può essere richiamato su qualsiasi oggetto di quella classe. Continui a confondere oggetti con array, ma questo è un punto cruciale. L'oggetto Passeggero contiene al proprio interno i campi nome,cognome,numero e i metodi sopra elencati. Non è un vettore che contiene nome+cognome, questi dati sono variabili di Passeggero.
Poi se vuoi le tue istanze di Passeggero possono essere inserite in un vettore, ma i metodi definiti su Passeggero li puoi richiamare su qualunque passeggero, che sia contenuto in un array (in qualsiasi posizione), in un'altra struttura, o anche creato sul momento (come facevo nella classe Test).
xXNicolaXx ha scritto:
public Passeggero[] persone;
In questo modo creo un vettore persone che contiene i parametri passati dentro il costruttore della classe passeggeri? Nelle parentesi quadre dopo Passeggeri, devo aggiungere "nome, cognome" o sto proprio sbagliando tutto?
In questo modo crei un vettore di oggetti Passeggero (ora la classe si chiama in questo modo, non più Passeggeri) : ogni singola elemento del vettore è un oggetto Passeggero, che può essere istanziato con i parametri che passi al costruttore di Passeggero. Nelle parentesi quadre non devi aggiungere proprio nulla, quella è solo la dichiarazione di un array.
Passando ora al tuo ultimo messaggio :
Fino ad Aeroporto nulla di particolare, per ora va bene, poi potrai decidere come/dove organizzare il tuo ciclo.
La classe Registrazione e Passeggero invece non vanno bene!
In Passeggero le variabili non dovresti tenerle public, ma mantenerle private come prima e accedere a quei campi con i metodi get (è a quello che servono i metodi getXXX()).
Poi hai reinserito un costruttore che setta anche la variabile numero, se leggi il messaggio scritto in precedenza spiegavo che questo è pericoloso (dovresti controllare il vincolo di unicità). Riprendi il codice che ho modificato, quello con la variabile numeroPasseggeri.
La variabile statica che si autoincrementa è il metodo migliore (a questo punto della tua preparazione perlomeno) per assegnare automaticamente il numero al passeggero, in modo che non ci siano errori di alcun genere quando passi tu il numero via costruttore.
Infine in Passeggero dovresti aggiungere il metodo toString() come dicevo in precedenza. Non è obbligatorio, ma quanto fai in Registrazione dimostra che non hai ancora capito bene il concetto (vedi sotto).
In Registrazione infatti dichiari un Passeggero pass (al cui costruttore passi stringhe vuote per il nome e il cognome). Questo Passeggero è totalmente inutile !
Le stringhe che leggi in registra() dallo scanner non devono modificare il nome di un Passeggero già esistente (pass), devono essere memorizzate per poi creare un nuovo Passeggero con i dati che hai letto!
In futuro potrai avere un metodo che modifica tali informazioni (con i metodi setXXX(), non utilizzando variabili pubbliche), ma per ora occupati di leggere le stringhe e creare il nuovo Passeggero passando al costruttore (è qui che devi usare la keyword new) le stringhe che hai memorizzato in due variabili temporanee.
Infine il metodo stampa scritto così non va bene. Se non vuoi ridefinire toString() in Passeggero (ma dovresti), e vuoi mantenere un metodo di stampa in Registrazione, questo metodo deve quantomeno ricevere in ingresso il Passeggero da 'stampare' e invocare su
quella istanza i metodi getXXX() che restituiscono i dati.
Tu invece in stampa() stai scrivendo a video le informazioni del Passeggero pass, ma invocando stampa() dopo aver creato un altro Passeggero continuerai a vedere sempre e solo le informazioni di pass.
xXNicolaXx ha scritto:
Ora le due domande...
1) per poter accedere alle variabili della classe Passeggero (nome, cognome e numero) le ho dovute impostare come public, perchè con private non mi ci faceva accedere. Cosa si usa per appunto poter accedere a una variabile privata?
2) Nel metodo stampa io ho scritto
System.out.println("Nome : " + pass.getNome);
Ma ho visto che funzionava pure così:
System.out.println("Nome : " + nome);
Qual'è la differenza, e quale dei è meglio usare?
Dai che forse piano piano sto iniziando a capire qualcosa
Alla prima domanda ho risposto sopra. Le variabili sono tenute private volontariamente per non potervi accedere dall'esterno. Per accedere si usano appunto i metodi get.
Per la seconda domanda la differenza è semplice: pass.getNome() restituisce la stringa nome dell'oggetto pass (di tipo Passeggero).
Se stampi invece la variabile nome, la variabile deve essere prima di tutto definita! Nella classe Registrazione non hai una variabile nome definita come campo, quindi se non la definisci neanche nel metodo stampa() riceverai un errore in compilazione, perché il compilatore non sa a cosa ti stai riferendo!