layout: page title: Java’da Nesnenin Nesneye Atanması —

Merhabalar arkadaşlar. Java’ya yeni başlamış ya da biraz ilerlemiş ama bu ayrımın farkında olmayan arkadaşlar için birşeyler yazmak istedim. Java’da bizim kullandığımız bir atama operatörü var : = Bu operatör bizim bir değer tutan değişkeni başka bir değişkene, nesneye atamamızı sağlar. Fakat burada kod yazarken dikkatli olmak gerekir. Bu atama operatörü primitive(ilkel) ve referans tipli değişkenler üzerinde atama yapılırken farklı davranmaktadır. Ne demek istediğimiz örnekle açıklıyayım:

PersonClass.java`

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package collections;
/**
 *
 * @author ilkaygunel
 */
public class PersonClass {
    String name;
    String surname;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
}

PersonClass sınıfımız son derece basit. Sadece isim ve soyisim özellikleri ile get-set metotlarına sahip.

AssignmetOperation.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package collections;
/**
 *
 * @author ilkaygunel
 */
public class AssignmentOperation {
    public static void main(String[] args) {
        int a=5;
        int b=a;
        b=10;
        System.out.println("A'nın Değeri:"+a+",B'nin değeri:"+b);
        PersonClass personClassObject1 = new PersonClass();
        personClassObject1.setName("ilkay");
        personClassObject1.setSurname("günel");
        PersonClass personClassObject2 = new PersonClass();
        personClassObject2=personClassObject1;
        personClassObject2.setName("onur");
        personClassObject2.setSurname("özcan");
        System.out.println("personClassObject1:"+personClassObject1.getName()+" "+personClassObject1.getSurname());
        System.out.println("personClassObject2:"+personClassObject2.getName()+" "+personClassObject2.getSurname());
    }
}

AssignmetOperation sınıfını incelediğimizde iki primitive nesne var. a ve b. Önce a’ya 5 değeri atanıyor. Sonra a b’ye atanıyor. Akabinde b’ye 10 atanıyor ve konsola değerler yazdırılıyor. Burada hiçbir sıkıntı yok. a nesnesi değerini koruyacak, b en son atanan 10 değerine sahip olacak. Peki PersonClass nesnelerinde durum ne? Şimdi ona bakalım. Kod içinde iki adet PersonClass nesnesi üretiliyor: personClassObject1 ve personClassObject2. personClassObject1 nesnesinin name surname özelliklerine değerler atanıyor, personClassObject1 nesnesi personClassObject2 nesnesine atanıyor. personClassObject2 nesnesinin name surname özellikleri set metodları ile değiştiriliyor. Son olarak da bu iki nesnenin değerleri ekrana yazdırılıyor. Konsol çıktısı ne imiş bir bakalım:

[]

Çıktıda gördüğümüz gibi pirimitive type olan int nesneler arası atama yapmada bir sıkıntı yok. Ama referans tipli nesneler olan personClassObject1 ve personClassObject2 birbirine atanması akabinde personClassObject2 üzerinde değişiklik yapılması personClassObject1 nesnesinin de özelliklerini etkiledi. Java dilinde eğer referans tipli değişkenler arası atama yapılırsa bu tip sorunla karşılaşmanız kaçınılmazdır. Çünkü atama yapılırken değer değil arka plandaki referans diğer nesneye atanıyor. Bu durumda iki nesne de aynı referansa sahip olduğu için birinde yapılan değişiklik diğerini de etkiliyor.

Peki bu durumu nasıl çözecez?

Çözüm aslında basit. Burada Java’nın en temel taşlarından biri olan Constructors (Yapılandırıcılar) devreye giriyor. Eğer oluşturulacak nesneye sadece değerlerin geçirilmesini sağlayan bir constructor daha yazılırsa sorun çözülecek. PersonClass sınıfımız için yapılandırıcıları şöyle güncelleyelim:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package collections;
/**
 *
 * @author ilkaygunel
 */
public class PersonClass {
    String name;
    String surname;
    public PersonClass(){
    }
    public PersonClass(PersonClass personClass)
    {
        this.setName(personClass.getName());
        this.setSurname(personClass.getSurname());
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
}

AssignmetOperations sınıfımızdaki personClassObject2 nesnesinin oluşturulması`ı değiştirilim ve personClassObject1 nesnesinin personClassObject2 nesnesine atandığı satırı silelim.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package collections;
/**
 *
 * @author ilkaygunel
 */
public class AssignmentOperation {
    public static void main(String[] args) {
        int a=5;
        int b=a;
        b=10;
        System.out.println("A'nın Değeri:"+a+",B'nin değeri:"+b);
        PersonClass personClassObject1 = new PersonClass();
        personClassObject1.setName("ilkay");
        personClassObject1.setSurname("günel");
        PersonClass personClassObject2 = new PersonClass(personClassObject1);
        personClassObject2.setName("onur");
        personClassObject2.setSurname("özcan");
        System.out.println("personClassObject1:"+personClassObject1.getName()+" "+personClassObject1.getSurname());
        System.out.println("personClassObject2:"+personClassObject2.getName()+" "+personClassObject2.getSurname());
    }
}

Konsol çıktısına bir de şimdi bakalım: []

Çıktıda gördüğümüz üzere personClassObject2 üzerinde yapılan değişiklik böylece personClassObject1 nesnesini etkilemedi. Bu tarz referans tipli atamalar yaparken dikkatli olun arkadaşlar. Doğrudan nesneyi nesneyi atamak yerine yapılandırıcı kullanarak nesnenin değerlerini geçirin yeni nesnenize. Aksi takdirde yazdığınız kod çok sorunlu hale gelecektir.

Bu yazıda bu kadar arkadaşlar. Başka yazıda görüşene kadar sağlıcakla kalın.