SORU
22 AĞUSTOS 2012, ÇARŞAMBA


Java çoğaltma nesneleri

Değişken değiştirmiyor Java değişkeni değiştirdiğinizde dayalı olduğunu öğrendim

int a = new Integer(5);
int b = a;
b = b   b;
System.out.println(a); // 5 as expected
System.out.println(b); // 10 as expected

Nesneler için benzer bir şey düşünmüştüm. Bu sınıf düşünün.

public class SomeObject {
    public String text;

    public SomeObject(String text) {
        this.setText(text);
    }

    public String getText() {
        return text;
    }   

    public void setText(String text) {
        this.text = text;
    }
}

Bu kodu denedim sonra kafam karıştı.

SomeObject s1 = new SomeObject("first");
SomeObject s2 = s1;
s2.setText("second");
System.out.println(s1.getText()); // second as UNexpected
System.out.println(s2.getText()); // second as expected

Bu nesnelerden herhangi birini değiştirmeden diğerini etkiler neden bana açıkla lütfen. Değişken metin değeri olan nesneleri de bellekte aynı yerde saklı olduğunu anlıyorum.

Değişkenler bağımsız ama nesneler için korelasyon için neden bu değerleri?

Eğer basit atama işi yapmak mı yoksa SomeObject yinelenen, nasıl da?

CEVAP
22 AĞUSTOS 2012, ÇARŞAMBA


Java'da her bir değişkenbaşvuru. Ne zaman bu kadar

SomeClass s2 = s1;

s1 işaret ederken aynı nesne için s2 nokta. Aslında s2 referans s1 SomeClass örneği gösteren değer atama.Sen değiştirirseniz, 15*, s2 *olarak değiştirilecekaynı nesneye işaret ediyor çünkü).

Bir istisnası vardır, ilkel türleri: int, double, float, boolean, char, byte, short, long. Değeri tarafından saklanır. Yani =, tek değer atamak, ama aynı nesneye işaret ederler, kullanırken başvurular olmadığı için (). Bu anlamına gelir

int b = a;

sadece setleri a değerine b değeri.a, b değişmez değiştirirseniz.

Günün sonunda, her şeye değer atama, sadece referans değeri ve nesne (yukarıda belirtildiği gibi ilkel türler hariç) değerini değil.

Eğer s1, bir kopyasını yapmak istiyorsanız sizin durumunuzda, bu gibi yapabilirsiniz:

SomeClass s1 = new SomeClass("first");
SomeClass s2 = new SomeClass(s1.getText());

Alternatif olarak, bir kopyasını kendi örnek, argüman ve kopya olarak örnek alır SomeClass yapıcı ekleyebilirsiniz.

class SomeClass {
  private String text;
  // all your fields and methods go here

  public SomeClass(SomeClass copyInstance) {
    this.text = new String(copyInstance.text);
  }
}

Bu bir nesne çok kolayca kopyalayabilirsiniz:

SomeClass s2 = new SomeClass(s1);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoHotkey Tutorials

    AutoHotkey T

    29 Mayıs 2010
  • OnlyFunClips

    OnlyFunClips

    16 ŞUBAT 2012
  • TheDamnWreckless

    TheDamnWreck

    12 Temmuz 2010