☕ 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:
- Pass by value ve pass by reference farklarını öğrenin
Balloonsınıfını oluşturunswap()metoduyla referans değişimini test edinchangeValue()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ür | Açıklama | Etki |
|---|---|---|
| Pass by Value | Değişkenin değeri kopyalanır. Metot içinde değişiklik orijinali etkilemez. | Orijinal değişken korunur |
| Pass by Reference | Değ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şken | Bellek Adresi | Renk Değeri | Durum |
|---|---|---|---|
| kirmizi | 50 | Kirmizi | Değişmedi |
| mavi | 100 | Kirmizi | Sadece ilk değişiklik etki etti |
| balloon (metod içi) | 200 | Mavi | Yeni 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 Tipi | Java’da Nasıl Aktarılır | Açıklama |
|---|---|---|
İlkel tipler (int, boolean) | Değer ile | Gerçek değer kopyalanır |
Nesne tipleri (class, array) | Referans değeri ile | Referansın adresi kopyalanır |
❓ Sıkça Sorulan Sorular (SSS)
- Java neden Pass by Reference değildir?
Çünkü metodlara nesnenin kendisi değil, o nesnenin adresinin bir kopyası aktarılır.
- swap() neden başarısız olur?
Sadece referans kopyalarını değiştirir, orijinal adresler aynı kalır.
- 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.
- 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.
- 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.