Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java’da static ve instance değişken farkı nasıl anlaşılır?

javada-static-ve-instance-degisken-farki
Bu yazıda neler var?
  1. Bir alan neden tüm nesnelerde aynı değeri gösterebilir?
  2. Ad bilgisini static yapmak neden hataya yol açar?
  3. Doğru çözüm: Ad instance, toplam sayı static olmalı
  4. Static metot instance alanına neden doğrudan erişemez?
  5. Static mi instance mı? Hızlı karar kontrol listesi
  6. Java öğrenirken bu ayrımı nasıl pekiştirebilirsin?
  7. Sık Sorulan Sorular

Java’da static ve instance değişken farkı şu soruyla anlaşılır: Bu bilgi sınıfa mı aittir, yoksa oluşturulan nesneye mi? static alan sınıf düzeyinde tek bir ortak değer tutar; instance alan ise her nesne için ayrı değer taşır.

Bu nedenle bir nesnenin alanı değiştiğinde diğer nesneler de etkileniyorsa, büyük olasılıkla nesneye özel olması gereken alan yanlışlıkla static tanımlanmıştır. İlk kararın şu olsun: Bu bilgi tüm nesneler için ortak mı, yoksa her nesneye göre değişiyor mu?

Bir alan neden tüm nesnelerde aynı değeri gösterebilir?

Java’da sınıf, benzer nesnelerin hangi alanlara ve davranışlara sahip olacağını tanımlayan yapıdır. Nesne ise bu sınıftan oluşturulan tekil örnektir. Örneğin Student sınıfından iki farklı öğrenci nesnesi oluşturabilirsin.

Bir alan static olarak tanımlandığında, bu alan her nesne için yeniden oluşturulmaz. Sınıfa bağlı tek bir ortak alan bulunur. Bir nesne bu değeri değiştirirse, aynı sınıftan oluşturulan diğer nesneler de yeni değeri görür.

Instance alanlarda ise durum farklıdır. static olmayan bir alan, oluşturulan her nesnenin kendi içinde ayrı tutulur. Bu yüzden iki öğrencinin adı, yaşı veya okul bilgisi birbirinden farklı olabilir.

Özellik static alan instance alan
Kime aittir? Sınıfa Nesneye
Kaç ortak değer vardır? Sınıf için tek ortak değer Her nesne için ayrı değer
Ne zaman kullanılır? Toplam sayı veya ortak ayar gibi bilgilerde Ad, yaş veya kişisel durum gibi bilgilerde

Örneğin “oluşturulan toplam öğrenci sayısı” sınıfa ait ortak bir bilgidir. Ancak “öğrencinin adı” her nesneye göre değiştiği için instance alan olmalıdır.

Ad bilgisini static yapmak neden hataya yol açar?

Ad bilgisini static yapmak neden hataya yol açar?

Aşağıdaki örnekte name alanı yanlışlıkla static tanımlanmıştır. totalStudents alanının static olması ise doğrudur; çünkü toplam sayı tüm öğrenciler için ortak olarak tutulabilir.

public class Student {
    static String name;
    static int totalStudents;

    public static void main(String[] args) {
        Student student1 = new Student();
        student1.name = "Ayşe";
        Student.totalStudents++;

        Student student2 = new Student();
        student2.name = "Mehmet";
        Student.totalStudents++;

        System.out.println(student1.name);
        System.out.println(student2.name);
        System.out.println(Student.totalStudents);
    }
}

Beklenen çıktı:

Mehmet
Mehmet
2

Kodun akışı şöyledir:

  1. Student student1 = new Student(); satırı ilk nesneyi oluşturur.
  2. student1.name = "Ayşe"; satırı, nesneye özel bir alanı değil, sınıfın ortak name alanını Ayşe yapar.
  3. Student.totalStudents++; toplam öğrenci sayısını 1 artırır.
  4. Student student2 = new Student(); ikinci nesneyi oluşturur.
  5. student2.name = "Mehmet"; yeni bir ad alanı oluşturmaz; ortak name değerinin üzerine Mehmet yazar.
  6. Sonraki iki println satırı aynı ortak alanı okuduğu için iki kez Mehmet yazdırır.
  7. Toplam sayı iki nesne oluşturulduğu için 2 olur.

Buradaki hata, iki nesnenin farklı adlara sahip olması beklenirken ad bilgisinin sınıfa ait ortak bir alanda tutulmasıdır. name instance, totalStudents ise static olmalıdır.

Doğru çözüm: Ad instance, toplam sayı static olmalı

Bir öğrencinin adı yalnızca o öğrenci nesnesine aittir. Bu nedenle name alanı instance olmalıdır. Toplam öğrenci sayısı ise bütün nesneler için ortak tutulabileceğinden static tanımlanabilir.

class Student {
    String name;
    static int count = 0;
}

public class Main {
    public static void main(String[] args) {
        Student firstStudent = new Student();
        firstStudent.name = "Ada";
        Student.count++;

        Student secondStudent = new Student();
        secondStudent.name = "Mert";
        Student.count++;

        System.out.println(firstStudent.name);
        System.out.println(secondStudent.name);
        System.out.println(Student.count);
    }
}

Beklenen çıktı:

Ada
Mert
2

Kodun çalışma sırasını inceleyelim:

  • String name; satırında static kullanılmadığı için oluşturulan her Student nesnesi kendi name alanına sahip olur.
  • static int count = 0; sınıfa ait tek bir ortak sayaç oluşturur.
  • firstStudent.name = "Ada"; yalnızca ilk nesnenin adını değiştirir.
  • secondStudent.name = "Mert"; yalnızca ikinci nesnenin adını değiştirir; Ada bilgisi korunur.
  • Her nesne oluşturulduktan sonra Student.count++ çalışır ve ortak sayaç bir artırılır.
  • İlk iki çıktı nesnelerin kendi alanlarından, son çıktı ise sınıfa ait ortak count değerinden üretilir.

Teşhis kuralı nettir: Bir değer nesneye göre değişiyorsa instance, bütün nesneler için tek ortak değer gerekiyorsa static olmalıdır.

Static metot instance alanına neden doğrudan erişemez?

Static metot instance alanına neden doğrudan erişemez?

Static metot sınıfa aittir ve çağrılmak için belirli bir nesneye ihtiyaç duymaz. Instance alan ise belirli bir nesnenin parçasıdır. Bu nedenle static metot, hangi nesnenin name alanının kullanılacağını kendi başına bilemez.

class Student {
    String name;

    static void printName() {
        System.out.println(name);
    }
}

Bu kod derlenmez. Sorun System.out.println(name); satırındadır: printName() static olduğu hâlde name bir instance alanıdır. Ortada seçilmiş bir Student nesnesi bulunmadığından doğrudan erişim kurulamaz.

Çözüm olarak metoda kullanılacak nesne geçirilebilir:

class Student {
    String name;

    static void printName(Student student) {
        System.out.println(student.name);
    }
}

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.name = "Ada";

        Student.printName(student);
    }
}

Beklenen çıktı:

Ada
  • printName(Student student) metodu hangi nesneyle çalışacağını parametre üzerinden öğrenir.
  • student.name ifadesi, adı belirsiz biçimde istemek yerine verilen nesnenin alanına erişir.
  • Student.printName(student) çağrısı oluşturulan nesneyi static metoda gönderir.

Kısacası static metot belirli bir nesne bağlamında çalışmaz. Bir instance alanına erişmesi gerekiyorsa kullanılacak nesne açıkça belirtilmelidir.

Static mi instance mı? Hızlı karar kontrol listesi

Bir alanı tanımlamadan önce şu soruyu sor: Bu veri sınıfa mı ait, yoksa oluşturulan her nesneye ayrı ayrı mı ait? Aşağıdaki kontrol listesi, karar vermeyi kolaylaştırır.

  1. Değer tüm nesneler için aynı mı? Aynı olması gerekiyorsa alan static olabilir. Örneğin bir sınıfın ortak sabiti veya oluşturulan toplam öğrenci sayısı sınıfa ait ortak verilerdir.
  2. Her nesne kendi değerini mi taşıyor? Bir öğrencinin adı, bir hesabın bakiyesi veya bir kitabın başlığı gibi değerler nesneye özeldir. Bu alanlar instance olarak tanımlanmalıdır.
  3. Değer, nesne oluşturulmadan anlamlı mı? Veriyi kullanmak için belirli bir nesneye ihtiyaç yoksa static seçimi düşünülebilir. Ancak değer belirli bir nesnenin durumunu anlatıyorsa instance alanı daha uygundur.
  4. Bir nesnedeki değişiklik diğer nesneleri de etkilemeli mi? Evetse ortak bir static alan söz konusu olabilir. Hayırsa her nesnenin bağımsız değer taşıması gerekir.
  5. Alan kimin yaşam döngüsüne bağlı? Değer sınıfın tamamı var olduğu sürece ortak biçimde tutulacaksa static düşünülebilir. Her nesne oluşturulurken ortaya çıkıyor ve o nesneyle birlikte anlam taşıyorsa instance alan kullanılmalıdır.
Alan türü Uygun kullanım Örnek
Ortak sabit Tüm nesneler için değişmeyen ortak bilgi Bir sınıfın ortak kapasite değeri
Sayaç O sınıftan kaç nesne üretildiğini takip etme totalStudents
Nesneye özel nitelik Her nesnenin bağımsız olarak taşıdığı bilgi name, studentNumber

Örneğin Student sınıfındaki name alanı static olmamalıdır; çünkü her öğrencinin adı farklı olabilir. Buna karşılık toplam öğrenci sayısı tüm nesneler için ortak takip edilecekse static tanımlanabilir. Bir alanı seçerken “ortak veri mi, nesneye özel veri mi?” sorusuna net cevap veremiyorsan, sınıfındaki kullanım amacını ve değişikliğin hangi nesneleri etkilemesi gerektiğini yeniden incele. Kendi seviyeni görmek için Java bilgi testini çözerek hangi konuları pekiştirmen gerektiğini belirleyebilirsin.

Java öğrenirken bu ayrımı nasıl pekiştirebilirsin?

Static ve instance ayrımını kalıcı hâle getirmenin en iyi yollarından biri, kavramları sırayla uygulamaktır. Önce bir sınıftaki alanların hangi nesneye ait olduğunu belirle; ardından bu alanları kullanan metotları yaz. Daha sonra kapsülleme ve birden fazla nesnenin durumunu yöneten daha büyük örneklere geç.

static kullanımını ezberlenecek bir kural gibi görme. Her alan için şu iki soruyu yazılı olarak cevapla: Bu bilgi tüm nesneler için ortak mı? ve Bir nesnenin değeri değiştiğinde diğer nesneler etkilenmeli mi? Cevaplar farklı nesnelerin bağımsız kalması gerektiğini gösteriyorsa instance alan kullan.

Bu ayrımı çalışmak için küçük bir uygulama oluşturabilirsin: İki öğrenci nesnesi üret, adlarını farklı ata ve toplam öğrenci sayısını ayrı bir static sayaçla izle. Ardından bir öğrencinin adını değiştirip diğer öğrencinin adının aynı kaldığını kontrol et. Daha yapılandırılmış ve kişiye göre ilerleyen bir çalışma arıyorsan Java birebir programı bu temel konuları uygulamalar üzerinden çalışmak için değerlendirilebilir.

Bir sonraki pratik adım olarak kendi yazdığın üç sınıftaki tüm alanları listele ve her birinin yanına “ortak” veya “nesneye özel” notunu düş. Ardından yalnızca gerekçesini açıklayabildiğin alanları static olarak bırak.

Sık Sorulan Sorular

Bir instance değişkenin değeri değişince neden başka bir nesnenin değeri değişmez?

Çünkü her nesne, instance değişken için kendisine ait ayrı bir değer tutar. Bir öğrencinin name alanını değiştirmek, başka bir Student nesnesinin kendi name alanını değiştirmez.

Bir sayacı static yapmak hangi durumlarda uygundur?

Sayaç, sınıftan oluşturulan tüm nesnelerin ortak toplamını veya sınıf düzeyindeki bir durumu izliyorsa static yapılabilir. Her nesnenin kendi bağımsız sayacı olması gerekiyorsa instance alan tercih edilmelidir.

Static bir metot instance değişkene erişmek için neden nesneye ihtiyaç duyar?

Static metot sınıfa ait çalışır; belirli bir nesnenin instance alanını kendiliğinden bilemez. Bu nedenle hangi nesnenin alanına erişeceğini belirtmek için bir nesne üzerinden işlem yapması gerekir.

Bir alanın static olup olmaması nasıl hızlı şekilde kontrol edilir?

Alan tüm nesneler için ortak mı, yoksa her nesne kendi değerini mi taşıyor diye sor. Ortak veri için static, nesneye özel veri için instance yaklaşımı kullanılır. Ayrıca bir nesnedeki değişikliğin diğer nesneleri etkilemesi gerekip gerekmediğini kontrol et.

Bu ayrımı doğru kurduğunda Java sınıflarındaki verilerin hangi düzeyde tutulması gerektiğini daha kolay anlayabilir ve nesneler arasındaki beklenmedik değer değişikliklerini önleyebilirsin.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara