Skip to main content

☕ Java’da Değer ile Geçiş (Pass by Value) Neden Esastır?

Java’da metot çağrılarında verilerin nasıl geçtiği sıkça tartışılır.
Peki, Java gerçekten “referans ile mi” geçer yoksa “değer ile mi”?
Bu rehberde, Java'nın her zaman değer ile geçiş (pass by value) kullandığını örneklerle kanıtlayacağız.


🧠 Teknik Özet

Ana konu: Java’nın metotlara argüman geçiş biçimi (Pass by Value)
Sorun: “Java pass by reference mi?” sorusu etrafındaki kafa karışıklığı
Adımlar:

  1. Pass by value ve pass by reference farklarını öğrenin
  2. Balloon sınıfını oluşturun
  3. swap() metoduyla referans değişimini test edin
  4. changeValue() metoduyla değer güncellemesini inceleyin

Amaç:
Nesne referanslarının bile değer olarak kopyalandığını anlayarak, Java’nın neden “gerçek pass by reference” olmadığını kavramak.


🔍 Java'da Argüman Geçişi: Değer mi, Referans mı?

Java her zaman değer ile geçiş (pass by value) kullanır.
Bu kural hem ilkel tipler (int, boolean) hem de nesne referansları için geçerlidir.

Kavram Farkı

TürAçıklamaEtki
Pass by ValueDeğişkenin değeri kopyalanır. Metot içinde değişiklik orijinali etkilemez.Orijinal değişken korunur
Pass by ReferenceDeğişkenin adresi (referansı) aktarılır.Metot orijinal nesneyi doğrudan değiştirebilir

Java’da bir değişken nesneyi değil, nesnenin bellekteki adresini tutar.
Metoda bu adresin kopyası gönderilir — bu yüzden “pass by reference gibi” görünse de aslında değildir.


🎈 1. Balloon Sınıfı (Yardımcı Nesne)

// Bu sınıf, renk bilgisini tutan basit bir nesneyi temsil eder.
public class Balloon {

private String color;

public Balloon(String c) {
this.color = c;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}
}

🔁 2. Swap() Metodu ile Pass by Value Kanıtı

swap() metodu iki nesnenin referansını değiştirmeye çalışır, ama aslında yalnızca referans kopyalarını değiştirir.


public class Test {

public static void main(String[] args) {
Balloon kirmizi = new Balloon("Kirmizi"); // Bellek adresi: 50
Balloon mavi = new Balloon("Mavi"); // Bellek adresi: 100

swap(kirmizi, mavi);
System.out.println("Swap sonrası:");
System.out.println("kirmizi rengi = " + kirmizi.getColor());
System.out.println("mavi rengi = " + mavi.getColor());

changeValue(mavi);
System.out.println("changeValue sonrası:");
System.out.println("mavi rengi = " + mavi.getColor());
}

public static void swap(Object o1, Object o2) {
Object temp = o1; // temp = 50
o1 = o2; // o1 = 100
o2 = temp; // o2 = 50
}
}

Beklenen Çıktı:


Swap sonrası:
kirmizi rengi = Kirmizi
mavi rengi = Mavi

🧩 Neden Böyle Oldu?

swap() içinde o1 ve o2 değişkenleri sadece referansların kopyalarını tutar.

Bu kopyalar takas edilse de, dışarıdaki kirmizi ve mavi değişkenleri aynı adresleri göstermeye devam eder. ➡️ Sonuç: Orijinal nesneler etkilenmez.


🎨 3. changeValue() Metodu ile Değer Güncellemesi

Şimdi aynı nesnenin içeriğini değiştirmeyi deneyelim.


private static void changeValue(Balloon balloon) {
balloon.setColor("Kirmizi"); // Bellek 100'deki nesnenin rengini değiştirir
balloon = new Balloon("Yesil"); // Yeni nesne (Bellek 200)
balloon.setColor("Mavi"); // 200 adresindeki nesneyi değiştirir
}```

Beklenen Çıktı:

```java

changeValue sonrası:
mavi rengi = Kirmizi

📘 Açıklama: balloon parametresi, mavi değişkeninin adresinin bir kopyasıdır (100).

İlk satır, orijinal nesnenin rengini “Kirmizi” yapar.

Yeni Balloon("Yesil") nesnesi (200) oluşturulduğunda, balloon artık yeni adrese geçer.

Ancak mavi hâlâ eski adresi (100) gösterir. ➡️ Yani, orijinal nesne sadece ilk satırdaki değişiklikten etkilenir.


🧠 4. Java’da Bellek Mantığı

DeğişkenBellek AdresiRenk DeğeriDurum
kirmizi50KirmiziDeğişmedi
mavi100KirmiziSadece ilk değişiklik etki etti
balloon (metod içi)200MaviYeni nesneye geçti

Java, bellekteki referansın adres değerini kopyalar.
Bu yüzden, metod içindeki referans değişimi dışarıya yansımaz.


📘 Pass by Value Davranışı Özet Tablosu

Veri TipiJava’da Nasıl AktarılırAçıklama
İlkel tipler (int, boolean)Değer ileGerçek değer kopyalanır
Nesne tipleri (class, array)Referans değeri ileReferansın adresi kopyalanır

❓ Sıkça Sorulan Sorular (SSS)

  1. Java neden Pass by Reference değildir?

Çünkü metodlara nesnenin kendisi değil, o nesnenin adresinin bir kopyası aktarılır.

  1. swap() neden başarısız olur?

Sadece referans kopyalarını değiştirir, orijinal adresler aynı kalır.

  1. changeValue() neden sadece ilk satırda etkili?

İlk satır aynı nesneyi değiştirir, sonrasında yeni nesne oluşturulduğu için bağlantı kopar.

  1. Diğer dillerde (C++, Python) durum farklı mı?

Evet. C++’ta referans doğrudan aktarılabilir, Python’da ise mutable tiplerde referans etkisi görülür.

  1. Bu prensip neden önemli?

Java kodlarındaki “beklenmeyen değişikliklerin” sebebini anlamanızı sağlar ve yan etkileri önler.


🏁 Sonuç

Bu örneklerle Java’nın her zaman pass by value mantığıyla çalıştığını öğrendiniz. Nesne referansları dahi değer olarak kopyalanır; yani bir metot, orijinal nesneye değil, onun adres kopyasına erişir.