2016-04-28 21 views
0

さまざまな変数の値を増やすメソッドを作成しようとしています。ここでは、現在使用しているロジックのタイプの例ですが、メソッドが終了すると元の変数は変更されません。メソッドの外で値を変更できるようにするには、何を追加または置換する必要がありますか?メソッド内から変数の値を変更するにはどうすればよいですか?

static int num = 2; 
static String text = "3"; 

public static void up(int i, String s){ 
    //Debug 
    System.out.println("Before Change"); 
    System.out.println("I: " + i); 
    System.out.println("S: " + s); 
    System.out.println("Num: " + num); 
    System.out.println("Text: " + text); 

    //Code 
    i = i + 3; 
    s = String.valueOf(i); 

    //Debug 
    System.out.println("After Change"); 
    System.out.println("I: " + i); 
    System.out.println("S: " + s); 
    System.out.println("Num: " + num); 
    System.out.println("Text: " + text);    
} 

public static void main(String[] args) {  
    up(num, text); 

    //Debug 
    System.out.println("Out of Scope"); 
    System.out.println("Num: " + num); 
    System.out.println("Text: " + text); 
} 
+1

。この理由は、プリミティブ型にcall-by-valueを使用するjavaです。 – f1sh

+0

テキストは文字列オブジェクトのように関数呼び出しの外側では必ず更新されますが、numはint型です、プリミティブで、関数外では更新されません。 –

+0

@VineetKasat 'String'は' int'と同様に更新されません。 –

答えて

0

あなたはWrapperClassでそれを行うことができます。これは、JavaがPass By Valueを使用するためです。回避策は、複数の値がある場合はWrapperClassを作成することです。 WrapperClassを使用してクラスを変更する方法は次のとおりです。 Corba Javaフレームワークで作業する場合、参照セマンティクスを与えるためにHolder Classesを提供します。変数 `` i``はあなたが渡されたもののコピーではなく、(元)変数 `` num``あるので、たまたま

static int num = 2; 
    static String text = "3"; 

    public static void up(WrapperClass w){ 
     //Debug 
     System.out.println("Before Change"); 
     System.out.println("I: " + w.i); 
     System.out.println("S: " + w.s); 
     System.out.println("Num: " + num); 
     System.out.println("Text: " + text); 

     //Code 
     w.i = w.i + 3; 
     w.s = String.valueOf(w.i); 

     //Debug 
     System.out.println("After Change"); 
     System.out.println("I: " + w.i); 
     System.out.println("S: " + w.s); 
     System.out.println("Num: " + num); 
     System.out.println("Text: " + text); 
    } 

    public static void main(String[] args) { 
     WrapperClass w = new WrapperClass(); 
     w.i = num; 
     w.s = text; 
     up(w); 

     //Debug 
     System.out.println("Out of Scope"); 
     System.out.println("Num: " + w.i); 
     System.out.println("Text: " + w.s); 
    } 


    static class WrapperClass { 
    public int i; 
    public String s; 
    } 
+0

ありがとう、それは完全に動作します – JWHaydock

+0

その場合、他の人がこの参照を見ることができるように答えとupvoteを受け入れることができます。 – randominstanceOfLivingThing

+0

1つの小さな編集。 w.iとw.sを印刷するのではなく、実際に値を変更するためにメソッドを呼び出すと、num = w.iとtext = w.sを追加する必要がありました。 – JWHaydock

2
int i

、あなたの関数に渡しているString sは値でを渡されます。これは、変数のコピーのみを受け取ることを意味します。変数に対するアクションは、元の値には影響しません。

あなたはあなたの方法を変更し、それが変更された値を含むオブジェクトを返すことができます:

は、変更された値をカプセル化する新しいクラスを作成します。

class Result{ 
    int i; 
    String s; 
    public Result(int i, String s){ 
     this.i = i; 
     this.s = s; 
    } 
} 

今、あなたの方法は、このResult

を返すことができます。
public static Result up(int i, String s){ 
    //Code 
    i = i + 3; 
    s = String.valueOf(i); 
    return new Result(i, s); 
} 

メインメソッドで変更された値にアクセスできます。

呼び出し方法up(int i, String s) .ITは方法upの値を変更しないときあなたはただの変数iのコピー値を渡す
public static void main(String[] args) { 
    Result r = up(num, "test"); 
    System.out.println("int result " + r.i); 
    System.out.println("string result " + r.s); 
} 
+0

投稿したのと同じようにあなたの投稿を編集しました... – Fjotten

関連する問題