View Full Version : [Java] help programmino elementare
TuLKaS85
04-11-2006, 22:32
salve, devo fare un esercizio .
Sto cominvciando ad approcciare con Java :)
ora :
ho questa classe, e la traccia mi chiede inoltra di creare un metodo main all'interno di essa che provi il funzionamenteo.
Inoltre poi c'è un programma Java che richiama la classe e fa qualche operazione coi suoi metodi.
La mia domanda è questo metodo main di test cosa deve fare e come lo inserisco ??
public class Persona{
private String _nome;
private String _cognome;
public Persona(){
_nome="";
_cognome="";
}
public Persona(String nome,String cognome){
_nome=nome;
_cognome=cognome;
}
public String getNome(){
return _nome;
}
public String getCognome(){
return _cognome;
}
public void setNome(String nome){
_nome=nome;
}
public void setCognome(String cognome){
_cognome=cognome;
}
public void mostra(){
System.out.println( _nome);
System.out.println( _cognome);
}
public String toString (){
return "nome=" +_nome + "cognome="+ _cognome;
}
// qui ci metto public void main (){...?....?...?..}
}
leox@mitoalfaromeo
04-11-2006, 22:49
public class Persona{
private String _nome;
private String _cognome;
public Persona(){
_nome="";
_cognome="";
}
public Persona(String nome,String cognome){
_nome=nome;
_cognome=cognome;
}
public String getNome(){
return _nome;
}
public String getCognome(){
return _cognome;
}
public void setNome(String nome){
_nome=nome;
}
public void setCognome(String cognome){
_cognome=cognome;
}
public void mostra(){
System.out.println( _nome);
System.out.println( _cognome);
}
public String toString (){
return "nome= " +_nome + " cognome= "+ _cognome;
}
public static void main (String[] args){
Persona p1= new Persona();
Persona p2= new Persona("remo","labarca");
p1.setNome("gatto");
p1.setCognome("silvestro");
System.out.println(p1.getNome() +" "+ p1.getCognome());
System.out.println(p2.getNome() +" "+ p2.getCognome());
System.out.println(p1.toString() +" "+ p2.toString());
}
}
fatto...
ho sistemato anche qualche spazio nel "toString" perchè era illeggibile l'output.
TuLKaS85
04-11-2006, 23:15
si ci avevo pensato a fare una cosa del genere xò poi nel programma principale come richiamo quel main ??
se faccio :
public class Esercizio1_4{
public static void main(String[] args){
Persona persona = new Persona();
persona.main(); //????????
}
}
mad_hhatter
04-11-2006, 23:21
si ci avevo pensato a fare una cosa del genere xò poi nel programma principale come richiamo quel main ??
se faccio :
public class Esercizio1_4{
public static void main(String[] args){
Persona persona = new Persona();
persona.main(); //????????
}
}
no, non puoi chiamare il main della classe Persona usandolo come metodo non statico. al max lo chiami così: Persona.main(); nota la P maiuscola a indicare la classe, non l'istanza. e poi devi chiamarlo passandogli come argomento un vettore args valido, al limite un NULL.
però il tutto dipende da quello che vuoi fare. cioè, se hai già la classe Persona col metodo main puoi eseguire direttamente quella,mentre se è richiesto che venga implementata una classe apposita per i test, allora la cosa più elegante è rinominare il metodo main() della classe Persona come test() e poi chiamare tale metodo dal main della classe Esercizio.
il main lo hai già, basta che compili ed esegui il programma che ti ha passato leox@mitoalfaromeo
al max lo chiami così: Persona.main(); nota la P maiuscola a indicare la classe, non l'istanza. e poi devi chiamarlo passandogli come argomento un vettore args valido, al limite un NULL.
mi sa che non puoi chiamare un main da un main...
la cosa più elegante è rinominare il metodo main() della classe Persona come test() e poi chiamare tale metodo dal main della classe Esercizio.
questa è una cosa che in java non si fa mai, basta che crei una nuova classe TestEsercizio e ci metti dentro il main:
public static void main (String[] args){
Persona p1= new Persona();
Persona p2= new Persona("remo","labarca");
p1.setNome("gatto");
p1.setCognome("silvestro");
System.out.println(p1.getNome() +" "+ p1.getCognome());
System.out.println(p2.getNome() +" "+ p2.getCognome());
System.out.println(p1.toString() +" "+ p2.toString());
}
TuLKaS85
04-11-2006, 23:48
questo è l'esercizio :
Scrivere una classe Persona dotata dei seguenti attributi:
private String _nome
private String _cognome
dei seguenti metodi:
mostra()
String getNome(); void setNome(String nome)
String getCognome(); void setCognome(String cognome)
String toString() restituisce una stringa del tipo “nome=…,cognome=…”
e dei costruttori:
Persona()
Persona(String nome, String cognome)
Dotare la classe di un metodo main che ne provi il funzionamento
Scrivere un programma Java che ne provi il funzionamento
penso che allora sia + carino chaiamare il main della classe Persona come test() (in questo caso non ho bisogno di dichiararlo static e passargli String[] args giusto ???)
e devo ciamare il test() sempre dalla classe ? non dall'oggetto istanziato ?
cioe Persona persona = new Persona();
Persona.test(); giusto ??
mad_hhatter
05-11-2006, 00:13
se non lo chiami main puoi assegnargli una lista di argomenti vuota, cioè avrai un metodo test(){...} che non richiede parametri.
quanto al fatto di dichiararlo static o meno dipende dal tuo gusto personale: se vuoi che concettualmente il test sia una proprietà della classe alloralo fai static e lochiami tramite Persona.test().
se invece concepisci il metodo test come un metodo strettamente dipendente dall'istanza allora non farlo static e chiamalo tramite persona.test()
poichè nel test crei due istanze di persona, mi sembra concettualmente errato non dichiarare test static
mad_hhatter
05-11-2006, 00:15
questa è una cosa che in java non si fa mai
[/CODE]
e perchè mai? anzi, secondo me dotare una classe di un metodo di test a fini di debug e poi chiamare tale metodo dal main dell'applicazione è un'ottima tecnica per tenere il test della classe separato da utto il resto del programma
non è questo il caso in quanto si tratta di un piccolo programmino,
però il codice per il test conviene farlo sempre completamente esterno alla classe anche per non aver del codice che non serve a nulla nell'implementazione finale.
mad_hhatter
05-11-2006, 00:35
non è questo il caso in quanto si tratta di un piccolo programmino,
però il codice per il test conviene farlo sempre completamente esterno alla classe anche per non aver del codice che non serve a nulla nell'implementazione finale.
beh, dal testo del suo esercizio mi pare che questo sia il caso eccome...
dove conviene metter i test dipende da come è strutturato il codice. personalmente non ci vedo niente di male nel mettere del codice di test all'interno di una classe (se non altro perchè solo così puoi testare eventuali metodi privati - a meno di non usare classi statiche annidate)
TuLKaS85
05-11-2006, 01:17
se non lo chiami main puoi assegnargli una lista di argomenti vuota, cioè avrai un metodo test(){...} che non richiede parametri.
quanto al fatto di dichiararlo static o meno dipende dal tuo gusto personale: se vuoi che concettualmente il test sia una proprietà della classe alloralo fai static e lochiami tramite Persona.test().
se invece concepisci il metodo test come un metodo strettamente dipendente dall'istanza allora non farlo static e chiamalo tramite persona.test()
poichè nel test crei due istanze di persona, mi sembra concettualmente errato non dichiarare test static
ho provato dal programma a chiamare Persona.main(NULL); ma dà errore con test() tutto ok
purtroppo ho ancora un idea vaga di cosa significhi static, da quello che ho capito serve al main in quanto la virtual machine carica il main non instanziandolo....
poi per quello che riguarda le classi penso che se dichiaro un attributo o un metodo static questi siano strettamente legati alla classe ...
ditemi se dall'esempio dico bene :
la mia callse persona ha _nome static
se vado a modificare il nome e gli assegno FABIO allora Fabio sarà sempre legato a tutti gli oggetti creati di tipo Persona salvo una seguente rideinizione giusto ??
se è così sarebbe comodo avere il metodo test come statico giusto ?
in modo da fare un solo test che magari ritorni un valore(una flag magari) in questo modo tutte le istanze della classe create successivamente se avranno questo valore (ok), possono essere usate senza problemi senza rifare il test........ :mc:
mad_hhatter
05-11-2006, 02:14
che errore ti dà se chiami main(NULL)?
static, per metodi e campi, significa come hai detto tu, che il campo è UNICO per tutte le istanze della classe e il suo valore è COMUNE a tutte le istanze. un metodo statico è un metodo che concettualmente non va applicato ad una particolare istanza, ma ha significato legato alla classe in sè. solitamente serve a svolgere compiti di carattere generale o generico che non riguardano una istanza in particolare.
per quanto riguarda il test... diciamo che mettere un test che crea istanze di persona dentro alla classe Persona non è elegantissimo... il top sarebbe fare un metodo test non statico che fa qualcosa relativamente a una sola istanza di persona (ad esempio stampa i dati relativi alla persona). la creazione delle istanze di persona e la chiamata al metodo test vanno demandati al main della classe esercizio. questo a livello di pulizia ed eleganzadel codice. altrimenti puoi rendere test statico e fargli fare quello che vuoi
mad_hhatter
05-11-2006, 02:15
in modo da fare un solo test che magari ritorni un valore(una flag magari) in questo modo tutte le istanze della classe create successivamente se avranno questo valore (ok), possono essere usate senza problemi senza rifare il test........ :mc:
non mi è chiaro cosa intendi
Andrea16v
05-11-2006, 09:59
non è questo il caso in quanto si tratta di un piccolo programmino,
però il codice per il test conviene farlo sempre completamente esterno alla classe anche per non aver del codice che non serve a nulla nell'implementazione finale.
Concordo, e anche per altri motivi, prima le classi vere e proprie e poi una classe test in un altro file.. :)
TuLKaS85
05-11-2006, 10:35
Concordo, e anche per altri motivi, prima le classi vere e proprie e poi una classe test in un altro file..
beh a me così hanno chiesto, ed io così faccio, poi logicamente questi sono esercizi didattici e nulla più mi rendo conto che nella pratica tante cose non si fanno o si fanno meglio.
Cmq quando lancio dal programma principate Persona.main(NULL); mi dà errore sul NULL dice cannor find symbol stessa cosa se scrivo ciao cmq...
ho provato a mettere "" in questo caso dice main(java.lang.string[]) cannot be applied to (java.lang.string)
il main nella classe Persona l'ho scritto così :
public static void main (String[] args) è giusto il prototipo vero ?
Originariamente inviato da TuLKaS85
in modo da fare un solo test che magari ritorni un valore(una flag magari) in questo modo tutte le istanze della classe create successivamente se avranno questo valore (ok), possono essere usate senza problemi senza rifare il test........
non mi è chiaro cosa intendi
la mia idea su avere un metodo statico x il test era :
dichiaro una flag booleana statica di tipo private poi il metodo statico mi và ad alterare questa flag se il test appunto riesce positivo o meno...
in questo modo basta lanciare il test sulla classe una sola volta ed in seguito controllare solo la flag....
in tutti i casi era giusto un'idea buttata lì :D
mad_hhatter
05-11-2006, 11:04
NULL lo devi scrivere null, java è case sensitive. è però possibile che si incazzi se gli passi un null. se questo fosse il caso, crea un array di String così String[] s = new String[0] (metti 1 se non accetta array di dimensione nulla) e poi lo passi al main.
prova a vedere se così funziona, altrimenti aveva ragione chi diceva che non si può chiamare un main da un main...
per l'idea della flag mi sembra un po' contorta e francamente inutile: a quel punto fai direttamente una serie di test e poi in base ai valori ritornati decidi se il test è ok o meno... però tutto dipende da quello che vuoi testare, ovviamente :)
TuLKaS85
05-11-2006, 11:09
NULL lo devi scrivere null, java è case sensitive. è però possibile che si incazzi se gli passi un null. se questo fosse il caso, crea un array di String così String[] s = new String[0] (metti 1 se non accetta array di dimensione nulla) e poi lo passi al main.
prova a vedere se così funziona, altrimenti aveva ragione chi diceva che non si può chiamare un main da un main...
per l'idea della flag mi sembra un po' contorta e francamente inutile: a quel punto fai direttamente una serie di test e poi in base ai valori ritornati decidi se il test è ok o meno... però tutto dipende da quello che vuoi testare, ovviamente :)
ok grazie funziona con null minuscolo, cono abituato al c che lo mettevo maiuscolo :)
mad_hhatter
05-11-2006, 11:09
Concordo, e anche per altri motivi, prima le classi vere e proprie e poi una classe test in un altro file.. :)
se crei la classe P che ti serve e al suo interno fai una classe statica di nome Test alla fine della compilazione avrai una classe P e una p$Test. nella classe Test metti un main o un metodo pubblico o protetto che esegue i test e che puoi richiamare o direttamente (molto comodo) oppure dal main dell'applicazione.
i vantaggi sono:
- non hai un file sorgente separato per testate ogni singola classe
- se chiami direttamente il test non sporchi l'applicazione principale (posto che tu debba testare SOLO una classe per volta e non l'interazione tra più classi, ovvio :) )
mad_hhatter
05-11-2006, 11:10
ok grazie funziona con null minuscolo, cono abituato al c che lo mettevo maiuscolo :)
perfetto! quindi si possono "annidare" i main :) bene a sapersi
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.