ProgramlamaBackend Geliştirici

Java'da new operatörü nasıl çalışır, bir nesne oluşturulduğunda tam olarak ne olur ve burada hangi tuzaklar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Java'da new operatörü yeni nesne örnekleri oluşturmak için kullanılır. Nesne oluşturma süreci hafıza ayırma, alanların başlatılması ve yapıcının çağrılmasını içerir.

Sorunun Tarihi

Klasik programlama dillerinde hafıza ayırma ve nesnenin başlatılması ayrı olarak gerçekleşebilirdi. Java'da bunlar birleştirilmiştir ve sanal makine (JVM) tarafından kontrol edilir, bu da hata ve bellek sızıntılarını azaltır.

Problem

Nesne oluşturma sürecinin yanlış anlaşılması, yanlış başlatmalara, bellek sızıntılarına veya beklenmedik davranışlara yol açabilir.

Çözüm

new operatörü kullanıldığında:

  1. JVM yığın (heap) üzerine nesne için hafıza ayırır.
  2. İlk aşamada alanlar sıfır değerleri (null, 0, false) ile doldurulur.
  3. Alanların başlatılması da dahil olmak üzere initializers çalıştırılır.
  4. Nesnenin yapıcısı çağrılır.
  5. Değişken oluşturulan nesneye bir referans alır.

Örnek kod:

Person p = new Person("Ivan", 20);

Bu işlemden sonra bellekte kullanılabilir ayrı bir Person nesnesi ortaya çıkar.

Anahtar özellikler:

  • Oluşturma sonrası nesnenin bütünlüğü ve doğruluğu garanti edilir.
  • Belleği serbest bırakma zorunluluğu yoktur (çöp toplayıcı çalışır).
  • Her new çağrısı ayrı bir nesne oluşturur (singleton deseni dışında).

Kandırmaca Soruları.

Nesne oluştururken new operatörünü kullanmaktan kaçınılabilir mi?

Evet. Örneğin, kopyalama (clone()), serileştirme, yansıtma kullanımı (Class.newInstance()) ile ancak bunların kendi nüansları ve sınırlamaları vardır.

new, dize havuzunda yeni bir nesne mi oluşturur?

Hayır. Eğer bir dize bu şekilde oluşturulursa — new String("abc"), bellek yığınında yeni bir nesne oluşturulur, bu String havuzunda zaten var olsa bile. Dizeler için sabitler kullanmak daha iyidir.

new operatörünün diziler için çalışması farklı mıdır?

Evet. Diziler için new operatörü dizi elemanlarının tümü için hafıza ayırır ve bunları varsayılan değerlerle başlatır, ancak bu elemanlar için yapıcıları çağırmaz, eğer bunlar ilkel türler değilse.

String[] arr = new String[5]; // Tüm elemanlar null olacak

Tipik Hatalar ve Anti-Desenler

  • Dizeleri oluşturmak için new kullanılması (sabitler yerine), bu da gereksiz nesnelere yol açar.
  • Başlatma ve yapıcıların sırası ile ilgili hatalar, özellikle miras alırken.
  • Çöp toplama hakkında unutkanlık — belleği manuel olarak serbest bırakmaya çalışmalar.

Hayattan Bir Örnek

Olumsuz Vaka

Geliştirici yazıyor:

String s1 = new String("hi"); String s2 = new String("hi"); System.out.println(s1 == s2); // false

Artıları:

  • Her dize kesinlikle ayrı bir nesnedir.

Eksileri:

  • Bellek üzerinde gereksiz yük.
  • == ile karşılaştırma çalışmayacak (farklı nesneler).

Olumlu Vaka

Geliştirici yazıyor:

String s1 = "hi"; String s2 = "hi"; System.out.println(s1 == s2); // true

Artıları:

  • Dizeler String havuzunda optimize edilmiştir.
  • Bellek tasarrufu, daha hızlı karşılaştırma.

Eksileri:

  • == ile karşılaştırma yalnızca sabitler için doğrudur, tüm durumlar için değil.