PDA

View Full Version : scambio dati tra classi java


atmp90
10-08-2007, 12:27
ciao,
sto cercando 2 classi (in 2 file differenti) che si scambiano dei dati (interi).
c'è qualche script?

grazie

ciao

roby

andbin
10-08-2007, 12:54
sto cercando 2 classi (in 2 file differenti) che si scambiano dei dati (interi).
c'è qualche script?Puoi descrivere meglio la questione? Non è che si capisca molto....

71104
10-08-2007, 13:04
ciao,
sto cercando 2 classi (in 2 file differenti) che si scambiano dei dati (interi). gliegli passi così come sono? :huh:
faccio un esempio :asd:

classe 1:

class Class1 {
private int i;
private Class2 class2;

private void pass() {
class2.pass(i);
}

}


classe 2 (in un altro file):

class Class2 {
public void pass(int passedValue) {
System.out.println("I\'m happy cause I got my value: " + passedValue);
}

}

71104
10-08-2007, 13:05
c'è qualche script? script...? :wtf:

atmp90
10-08-2007, 13:07
Puoi descrivere meglio la questione? Non è che si capisca molto....


ho 2 file (pseudocodice):
nel primo c'è la classe

public class primoprogramma

(

a=10;

stampa b;

)


nel secondo

public class secondoprogramma

(

stampa a

b=b+1;

)


voglio che il secondo programma stampi a e il primo b.. passandosi le variabili.
è possibile una cosa del genere..
o devo per forza avere tutte e 2 le classi nello stesso file e fare il passaggio di parametri tutto all'interno di uno stesso programma?


grazie


r.


71104 ha capito, intanto provo a fare come mi ha suggerito.. raga abbiate pazienza sto iniziando a programmare con java..

71104
10-08-2007, 13:21
voglio che il secondo programma stampi a e il primo b.. passandosi le variabili.
è possibile una cosa del genere..
o devo per forza avere tutte e 2 le classi nello stesso file e fare il passaggio di parametri tutto all'interno di uno stesso programma? nessuno ti obbliga a considerare ciascuna classe un programma separato: se i due files .java stanno nello stesso package e i due files .class stanno nella stessa cartella possono interagire tra di loro chiamandosi a vicenda nel contesto dello stesso processo. se invece i due files .java stanno in packages separati basta che usi import, l'importante è che la configurazione delle cartelle e dei files .class a runtime rispecchi quella dei files .java nei packages.

atmp90
10-08-2007, 13:53
nessuno ti obbliga a considerare ciascuna classe un programma separato: se i due files .java stanno nello stesso package e i due files .class stanno nella stessa cartella possono interagire tra di loro chiamandosi a vicenda nel contesto dello stesso processo. se invece i due files .java stanno in packages separati basta che usi import, l'importante è che la configurazione delle cartelle e dei files .class a runtime rispecchi quella dei files .java nei packages.

aldilà dei package che non conosco..
sono io che volutamente volevo provare le classi in 2 file separati:

class2.java compilato ok!

ma x class1 mi da un errore in compilazione:

class1.java:3:cannot resolve symbol
symbol: class Class2
location: class Class1
private Class2 class2;
^
1 error


che è???

71104
10-08-2007, 16:05
puoi riportare i due sorgenti?

atmp90
10-08-2007, 16:23
puoi riportare i due sorgenti?

sono esattamente quelli che hai scritto tu

naoto84
10-08-2007, 16:40
I nomi delle classi (e dei .class) devono essere maiuscoli.
Il file .class generato dalla prima compilazione andata a buon fine è nella stessa cartella?

atmp90
10-08-2007, 16:55
I nomi delle classi (e dei .class) devono essere maiuscoli.
Il file .class generato dalla prima compilazione andata a buon fine è nella stessa cartella?


sia che sono maiuscoli che minuscoli alla fine ho sempre lo stesso problema..

cmq per sicurezza i sorgenti e i .class che avevo prima li ho cancellati e ho riprovato con sorgenti con la prima lettera maiuscola, ma di fatto lui genera solo il Class2.class.
x il Class1.java non viene generato il .class (sto lavorando nella dir \bin)

Quindi c'è qualche problema nel codice del primo ( a meno che bisogna settare qualche variabile d'ambiente .. io quelle non le ho mai toccate.. perchè ho preferito sempre lavorare sotto /bin).

naoto84
10-08-2007, 17:07
sia che sono maiuscoli che minuscoli alla fine ho sempre lo stesso problema..

cmq per sicurezza i sorgenti e i .class che avevo prima li ho cancellati e ho riprovato con sorgenti con la prima lettera maiuscola, ma di fatto lui genera solo il Class2.class.
x il Class1.java non viene generato il .class (sto lavorando nella dir \bin)

Quindi c'è qualche problema nel codice del primo ( a meno che bisogna settare qualche variabile d'ambiente .. io quelle non le ho mai toccate.. perchè ho preferito sempre lavorare sotto /bin).

I nomi delle classi devono essere maiuscoli, in teoria una classe con un nome minuscolo dovrebbe costituire un errore di sintassi a tutti gli effetti.
Sei sotto bin, quindi hai visibile tutto quello che ti serve. Anche con il CLASSPATH non dovresti avere nessun problema... visto che stai lavorando nella stessa cartella.

Intanto piazza questa riga in cima al file Class1.java

import Class2;

E poi: in che ordini le compili? Dovresti compilare prima Class2.java e dopo Class1.java... anche se ad essere sincero non mi ricordo se il compilatore se li sbrighi da solo questi problemi.

71104
10-08-2007, 17:31
@atmp90: usi il compilatore da linea di comando o usi un IDE? penso sia la prima. comunque prova a compilare i due files contemporaneamente:

javac Class1.java Class2.java

atmp90
10-08-2007, 17:41
I nomi delle classi devono essere maiuscoli, in teoria una classe con un nome minuscolo dovrebbe costituire un errore di sintassi a tutti gli effetti.
Sei sotto bin, quindi hai visibile tutto quello che ti serve. Anche con il CLASSPATH non dovresti avere nessun problema... visto che stai lavorando nella stessa cartella.

Intanto piazza questa riga in cima al file Class1.java

import Class2;

E poi: in che ordini le compili? Dovresti compilare prima Class2.java e dopo Class1.java... anche se ad essere sincero non mi ricordo se il compilatore se li sbrighi da solo questi problemi.

(per il discorso delle maiuscole e minuscole la penso come te.. ma prima non mi dava errore.. non so perchè)

ho fatto poi come mi hai detto: aggiunto import e compilato Class2.java e poi Class1.java

su Class1 non c'è l'errore di prima ma un altro:
Class1.java:1: '.' expected
import Class2;
^
1 error


(la ^ cade sotto il ; )

71104
10-08-2007, 17:59
per forza, mica puoi importare una classe così, direttamente. le classi si importano solo quando fanno parte di un altro package, quindi il compilatore ha creduto che "Class2" fosse il nome di un package e dopo di esso si aspettava di trovarci un punto e poi il nome di un altro package oppure della classe da importare.

hai provato a compilare i due files contemporaneamente?

naoto84
10-08-2007, 18:03
Come non detto, ricordavo male. L'import si usa solo per importare da packages, era una mia forzatura :D . Toglilo pure.

Se l'errore di prima non c'è più (e la compilazione non si è interrotta a causa di questo errore sull'import) allora era una questione di ordine di compilazione. Se invece non funziona nemmeno ora non mi viene in mente nient'altro. Sono abituato a lavorare con ambienti di sviluppo e devo dire che hanno contribuito a farmi dimenticare un po' di cose.

naoto84
10-08-2007, 18:04
...quindi il compilatore ha creduto che "Class2" fosse il nome di un package e dopo di esso si aspettava di trovarci un punto e poi il nome di un altro package oppure della classe da importare.

Esatto... me ne sono reso conto dall'errore. Chiedo perdono. :D

atmp90
10-08-2007, 18:29
per forza, mica puoi importare una classe così, direttamente. le classi si importano solo quando fanno parte di un altro package, quindi il compilatore ha creduto che "Class2" fosse il nome di un package e dopo di esso si aspettava di trovarci un punto e poi il nome di un altro package oppure della classe da importare.

hai provato a compilare i due files contemporaneamente?



avevi ragione! da compilare contemporaneamente! bene!.. mi ha creato i 2 file .class

sto usando ..linea di comando.
ora per eseguirli..?..
ho provato prima Class1 e poi Class2 .. e viceversa ma mi da, per entrambi, questo errore (quindi siamo in esecuzione):

Exception in thread "main" java.lang.NoSuchMethodError: main

nota: sto usando il comando

java -classpath . Class1 (o Class2)



.. perchè ho avuto nei miei primi programmi dei problemi e ho letto in internet che potevo risolverli così


mo'.. come faccio a risolvere quella eccezione?.. non è che devo eseguirli contemporaneamente?.. se sì con quale comando?



x naoto84: tranquillo, no problem.. capita.. sopratutto se facessero le cose + semplici e + immediate sarebbe + facile.

71104
10-08-2007, 18:39
mo'.. come faccio a risolvere quella eccezione?.. non è che devo eseguirli contemporaneamente?.. se sì con quale comando? il codice che avevo scritto prima non era un vero programma Java che potesse essere eseguito, era solo un esempio. ci manca il metodo main, ed inoltre non ho inizializzato ne' la variabile i ne' l'oggetto class2 all'interno di Class1. per farlo diventare un programma accettabile (oltre che sintatticamente corretto) cambia Class1.java nel seguente modo:

class Class1 {
private int i;
private Class2 class2;

public static void main(String[] args) {
i = 12345;
class2 = new Class2();
pass();
}

private void pass() {
class2.pass(i);
}

}


poi ricompila e fallo andare, dovrebbe stamparti il messaggio scritto in Class2.java.

U-Boat
10-08-2007, 18:43
I nomi delle classi devono essere maiuscoli, in teoria una classe con un nome minuscolo dovrebbe costituire un errore di sintassi a tutti gli effetti.


I nomi delle classi sguono le normali regole degli identificatori definiti dalla grammatica di Java, quindi possono essere tranquillamente tutti minuscoli o composti da caratteri come _

Le due classi seguenti compilano e vengono eseguite correttamente:


public class a {
public static void main(String[] args) {
System.out.println("Ciao");
}
}


public class _ {
public static void main(String[] args) {
System.out.println("Ciao");
}
}

Sono le code conventions di Java, indicate dalla Sun stessa, che prescrivono l'uso della prima lettera maiuscola e le iniziali delle parole seguenti (Pascal case) per i nomi delle classi e delle interfacce

naoto84
10-08-2007, 18:44
nota: sto usando il comando

java -classpath . Class1 (o Class2)



Questo comando che riporti serve a dichiarare un CLASSPATH (che è una variabile d'ambiente) temporaneo per la singola esecuzione. Scritto così non ne vedo l'utilità...

Vedo che stai partendo completamente da zero. Mi sento di consigliarti di usare un manuale di base, dove le cose da sapere sono esposte in modo ordinato. Impiegherai molto meno tempo e imparerai di più...

atmp90
10-08-2007, 18:51
Questo comando che riporti serve a dichiarare un CLASSPATH (che è una variabile d'ambiente) temporaneo per la singola esecuzione. Scritto così non fa assolutamente niente perché dovrebbe essere seguito da un percorso.

Vedo che stai partendo completamente da zero. Mi sento di consigliarti di usare un manuale di base, dove le cose da sapere sono esposte in modo ordinato. Impiegherai molto meno tempo e imparerai di più...


il comando
java -classpath . nomeprogramma
funziona con i programmi che avevo scritto prima.

ma allora che comando devo usare ora per Class1 e Class2?


in parte hai ragione per il manuale.. ne ho sfogliati 2 o 3 .. poi come dite voi.. mi sso' scuccià!! :)).. accidenti.. è possibile che non ci sia un esempio così semplice? uffffffffffff.. cmq poi riprendo gli esempi del testo che ho e con cui seguo il corso.. ho voluto fare un esperimento.. + avanti rispetto le mie poche conoscenze.. e cmq non ho trovato sul testo un esempio che mi potesse essere utile per il problema che mi ero posto

naoto84
10-08-2007, 18:54
il comando
java -classpath . nomeprogramma
funziona con i programmi che avevo scritto prima.

ma allora che comando devo usare ora per Class1 e Class2?

Funziona con quelli di prima e funzionerà con quelli appena scritti. Solamente specifica un'opzione inutile: puoi scrivere benissimo java nomeclasse...

E comunque la classe eseguibile, con le modifiche che ti ha scritto 71104, è solamente Class1. Quindi ora basta usare il comando java Class1

atmp90
10-08-2007, 19:10
mi da 3 errori di sintassi su Class1..
ma prima di passarmi il codice voi non riuscite a provarlo?..

errore1:

:6:non-static variable i cannot be referenced from a static context..

naoto84
10-08-2007, 19:16
mi da 3 errori di sintassi su Class1..
ma prima di passarmi il codice voi non riuscite a provarlo?..

errore1:

:6:non-static variable i cannot be referenced from a static context..

Da dove sono ora purtroppo non posso.
Gli errori sono causati da queste due dichiarazioni... sono errori a runtime dovuti al fatto che i membri della Class1 che puoi referenziare da dentro il main sono esclusivamente quelli statici, che esistono indipendentemente dal fatto che di Class1 ci siano istanze oppure no.

In Class1 sostituisci:

private int i;
private Class2 class2;

con

private static int i;
private static Class2 class2;

EDIT

Dimenticavo, anche qui devi aggiungere...

private static void pass()

71104
10-08-2007, 22:04
:6:non-static variable i cannot be referenced from a static context.. ops ^^
lo faccio sempre quell'errore. come ti è stato detto basta che dichiari come static le due variabili membro e il metodo.

ma prima di passarmi il codice voi non riuscite a provarlo?.. sorry ma Eclipse mi vizia, e al momento ce l'avevo chiuso :D

hai avuto altri errori?

atmp90
12-08-2007, 21:12
no, non ho avuto altri errori tanto è vero che mi hanno passato questa soluzione:

1° - file testp.java:

public class testp {
public static void main(String[] args) {
int c;
System.out.println ("Stampo a: " +primop.a);
System.out.println ("Stampo b: " +secondop.b);
System.out.println ("Scambio");
c=primop.a;
primop.a=secondop.b;
secondop.b=c;
System.out.println ("Stampo a: " +primop.a);
System.out.println ("Stampo b: " +secondop.b);

}
}


2° - file primop.java:

class primop {
static int a=10;
}



3° - file secondop.java:

class secondop {
static int b;
}



compilazione: javac primop.java secondop.java testp.java
esecuzione: java -classpath . testp

naoto84
13-08-2007, 10:31
no, non ho avuto altri errori tanto è vero che mi hanno passato questa soluzione:


Ma insomma, oltre ad accedere direttamente a variabili di istanza di altre classi e ad avere creato due classi uguali (a parte una inizializzazione) e ad usare due volte un dato non inizializzato... è giusto :p . Chi te l'ha passata?

(ma siamo sicuri che nel terzo file quel int b non è inizializzato?)