|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Sep 2001
Messaggi: 68
|
[Java] Passaggio Argomenti a metodo
Ciao ragazzi, ho una domanda: sto progr da un po' in java e ho un piccolo probl:
vorrei passare una stringa ad un metodo, e vorrei che questo modificasse quest'ultima, ovvero vorrei che il valore fosse passato per riferimento: ora essendo un oggetto questo dovrebbe fare già questo, ma non è così: Piccolo Esempio: Codice:
public class TestArguments {
public void changeString(String s1)
{
s1 = s1 + "A";
}
public static void main (String args[])
{
TestArguments t = new TestArguments();
String s1="Inizio";
for (int i=0;i<10;i++)
{
t.changeString(s1);
System.out.println(s1);
}
}
}
Scusate se è una domanda facile o banale, ma sono agli inizi di 'sto linguaggio... Ciaouz! Ultima modifica di KaiserSoze : 09-08-2004 alle 10:50. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 2992
|
Java non permette di passare le variabili per riferimento quindi una soluzione al tuo problema potrebbe esser questa:
public class TestArguments { private String s1; public TestArguments(String s1) { this.s1=s1; } public void changeString() { s1 = s1 + "A"; } public String getResult() { return s1; } public static void main (String args[]) { String s1="Inizio"; TestArguments t = new TestArguments(s1); for (int i=0;i<10;i++) { t.changeString(); System.out.println(t.getResult()); } } } Ultima modifica di nucarote : 09-08-2004 alle 11:28. |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Sep 2001
Messaggi: 68
|
Grazie nucarote,
è un'alternativa alla soluzione che avevo trovato, solo che mi costringe a definire una stringa che diventa visibile in tutta la classe, ma questa non è la sua funzione: un'altra la soluzione trovata come dicevo è quella di usare un classe di appoggio che contenga la stringa, così da usarla come "tipo di dati"... Nel mio esempio sarebbe: Codice:
public class TestArguments {
public void changeString(MyString s1)
{
s1.s = s1.s + "A";
}
public static void main (String args[])
{
TestArguments t = new TestArguments();
MyString s1=new MyString("Inizio");
for (int i=0;i<10;i++)
{
t.changeString(s1);
System.out.println(s1.s);
}
}
}
public class MyString {
String s;
MyString(String s) {this.s=s;}
}
Anche se è un buon compromesso, non è il massimo, dovrei avere una classe "Struttura" con le stringhe da usare by Ref... Però una cosa: nei testi che ho visto i tipi primitivi (int, double, etc.) vengono passati per valore, mentre gli oggetti vengono passati per riferimento: le istanze di String sono in effetti un oggetto, perchè non vengono passate per riferimento? C'è forse un'overload di qualcosa (come per gli operatori)? Grazie ancora per l'aiuto! Ciaouz! |
|
|
|
|
|
#4 | |||
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
In java tutti gli argomenti sono passati PER VALORE, tipi primitivi o oggetti che siano. Ad ogni modo se passi un oggetto, quello che fai è passare il riferimento all'oggetto, è il riferimento l'argomento, non l'ogetto in sè, e quindi è il riferimento che è passato per valore ed è quindi immodificabile dal metodo, mentre attraverso il riferimento puoi modificare l'oggetto a cui esso punta. Il motivo pr cui non riesci a modificare la struiga passata come argomento è perchè tu fai: s = s + "A"; ma l'istruzione s + "A" è implementata di modo da creare un nuovo oggetto stringa che contiene il valore di s più il valore di "A", per questo viene ritornata una nuova stringa. Il motivo di ciò lo si può leggere nella documentazione della classse String: Quote:
Quote:
Codice:
//Creo uno StringBuffer vuoto
x = new StringBuffer();
//Appendo "a"; e come fare x + "a" se avessi una stringa;
x.append("a");
//Appendo un intero
x.append(4);
x.append("c");
//trasformo in stringa
x.toString()
ciao.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2004
Messaggi: 1578
|
Il tuo problema non è che String non venga passato per riferimento, perchè gli oggetti in Java vengono passati sempre e solo per riferimento.
Il problema sta in quello che hai fatto tu, hai cambiato la stringa referenziata da s1 con un altra, in c questo lo avresti potuto fare con un puntatore a puntatore, in Java non puoi, devi agire sullo stesso oggetto che ti è stato passato (come è stato detto sopra per esempio con uno StringBuffer) |
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Sep 2001
Messaggi: 68
|
anx721 e end.is.forever, Grazie ancora per le vostre spiegazioni; in particolare anx721 che con le tue note mi hai chiarito il problema. Proseguo sulla documentazione per i dettagli sullo StringBuffer di cui mi avete parlato.
Alla prossima, Byez! |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2004
Città: Paola(cs)
Messaggi: 3329
|
Re: [Java] Passaggio Argomenti a metodo
Quote:
__________________
Il pinguino paga con ![]() iPAD MINI 64GB WIFI+4G iMAC 2,93GHZ 2009 iPhone 5 32 gb MacBook Pro 2012 2,9ghz |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:29.




















