2009-12-22 11 views

cevap

9

Java argümanlarına değer aktarılırsa, nesne argümanları nesneye bir başvuru iletir, bu argümanın referansını değiştirebileceğiniz anlamına gelir, ancak referansı geçtiğiniz nesneyi değiştirmez. İki seçeneğiniz var, yeni nesneyi (tercih edilen) döndürün veya referansı yeni referansı alabilen bir kaba (koleksiyon, dizi vb.) Gönderin.) Örneğin:

private static String changeStringAndReturn(String s) { 
    return new String("new string"); 
} 
private static void changeStringInArray(String[] s) { 
    if (null != s && 0 < s.length) { 
     s[0] = new String("new string"); 
    } 
} 
+5

, argümanlar değer geçirilir! – Tarquila

+2

Komik olan şey, kodun doğru olduğudur, ancak "belgeler" yanıltıcıdır. Aynı şey onun koduyla aynı olup olmadığını merak ediyorum? – OscarRyz

+0

@ rsp -belgelerinizi düzeltebilir, çünkü kabul edilen yanıt – TStamper

5

Java'daki başvurular değeri tarafından geçirilir, böylece işlev içinde referansı değiştirseniz bile, değişiklikler işlevin içinde değiştirilmez, çünkü işlev içinde değiştirdiğiniz şey yalnızca orijinalin bir kopyasıdır referans orijinal referansın kendisi değil.

Ancak, yeni dizeyi orada (işlevin içinde) kendi başına değiştirmeye çalışmak yerine changeString yönteminizden döndürebilirsiniz. Eğer

private static void changeString(String[] s) { 
    s[0] = new String("new string"); 
} 

Dize iletmenin işlev yapmak ve Java birinci sınıf veri türü olarak bir 'işaretçi-to-a-referans' gibi bir kavrama sahip Yalnızca

4

. Yukarıdakileri beğenmezseniz, tek bir String alanı içeren küçük bir sınıf oluşturabilirsiniz.

0

Java'daki her şey değer olarak aktarıldığı için Java'da bu mümkün değildir. Argümanın bir nesne referansı olduğu bu durumda, referansın kendisi değil, yönteme iletilen referansın değeridir.

2

: Java nesnesinde, referanslara değer aktarımı yapamazsınız.

Gerçekten, bir sarmalayıcı like this oluşturup Eğer beklenen şekilde kullanabilirsiniz gerekiyorsa

:

private static void changeString(_<String> str) { 
    str.s("new string"); 
} 

public static void main(String[] args) { 
    _<String> s = new _<String>("old string"); 
    changeString(s); 
    System.out.println(s); // prints "new string" 
} 
2

Elbette, yeni dizeyi yerine değiştirmeye çalışmak yerine changeString yönteminizden döndürebilirsiniz.

Alternatif olarak, bir dize saran veya içeren bir nesneyi oluşturabilir ve bunu içeri aktarabilirsiniz. ChangeString yöntemi, nesnenize dahili olan dizeyi değiştirir ve ana yöntem yine de bu nesneye bir başvuruda bulunacaktır . Aksi takdirde, bunu yapamazsınız. Dize değişmezdir ve java nesneleri her zaman belirli bir nesneye işaret eden bir değer olarak geçirir. İşaret ettiğiniz yeri değiştirin ve artık aynı nesneyi referans göstermiyorsunuz.

1

Dizeler, Java'da değişmezdir ve parametreler değere göre geçirilir, böylece onları değiştiremezsiniz (C# içinde ref eşdeğeri yoktur). StringBuilder'dan geçirebilir ve içeriğini kolayca değiştirebilirsiniz.

0

Onun çirkin ama küresel statik Dize değişebilir:

Java'da
private static String s; 

    private static void changeString(String t) { 
     if(s.equals(t)) 
      s = new String("new string"); 
    } 

    public static void main(String[] args) { 
     s = new String("old string"); 
     changeString(s); 
     System.out.println(s); // expect "new string" 
    } 
İlgili konular