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

Java static Ne İşe Yarar? Sınıf ve Nesne Üyeleri Nasıl Ayrılır?

java-static-ne-ise-yarar-sinif-ve-nesne-uyeleri-nasil-ayrilir
Bu yazıda neler var?
  1. Java’da static bir üyeyi sınıfa bağlamak ne anlama gelir?
  2. Ortak sayaç ve nesneye özel ad, çalışan kodda nasıl görünür?
  3. static metot, instance alana neden doğrudan erişemez?
  4. Bir üyeye static yazıp yazmayacağına nasıl karar verilir?

Java static ne işe yarar sorusunun kısa cevabı şudur: static, bir alanı veya metodu belirli bir nesneye değil, doğrudan sınıfa bağlar. Bu nedenle ilgili üyeye sınıf adı üzerinden, nesne oluşturmadan erişilebilir. Buna karşılık instance üyeler, oluşturulan her nesnenin kendi durumuyla birlikte çalışır.

Örneğin bütün öğrencileri sayan ortak bir sayaç static olabilir. Bir öğrencinin adı ise her nesnede farklı olabileceği için instance alan olarak tanımlanır. Bu ayrım, sınıfa ait ortak bilgilerle nesneye özel bilgileri birbirinden ayırmayı sağlar.

Java’da static bir üyeyi sınıfa bağlamak ne anlama gelir?

Java’da static bir üyeyi sınıfa bağlamak ne anlama gelir?

Bir sınıfın static alanı, o sınıftan kaç nesne oluşturulursa oluşturulsun sınıf düzeyinde ortak olarak tutulur. Aynı sınıftaki nesneler bu alana erişebilir ve alanın değerini paylaşır. static metot da belirli bir nesnenin verisine bağlı olmayan davranışlar için kullanılır.

Sınıfa ait üyelere erişim genellikle SınıfAdı.üyeAdı biçimindedir. Örneğin Ogrenci.toplamOgrenci ifadesi, Ogrenci sınıfındaki ortak toplamOgrenci alanına erişir. Benzer biçimde bir static metot, Ogrenci.bilgiYazdir() gibi sınıf adı üzerinden çağrılabilir.

Java programlarının başlangıç noktası olan main metodu da static olarak tanımlanır. Böylece Java, Main sınıfından ayrıca bir nesne oluşturmadan bu metodu çalıştırabilir.

Instance alanlar ise her nesne için ayrı değer taşır. Aynı sınıftan oluşturulan iki nesnenin ad alanı birbirinden farklı olabilir. Bu alanlara nesne referansı üzerinden, yani nesneReferansi.alan biçiminde erişilir. Örneğin birinci.ad ve ikinci.ad ifadeleri, iki farklı Ogrenci nesnesinin kendi ad değerlerini gösterir.

Instance metotlar da bir nesne referansı üzerinden çağrılır. Metodun kodu sınıf içinde tanımlansa da metot, çağrıldığı nesnenin instance alanlarıyla çalışabilir. Bu nedenle static üyeler sınıfa ait ortak bilgileri, instance üyeler ise nesneye özel bilgileri temsil eder.

Ortak sayaç ve nesneye özel ad, çalışan kodda nasıl görünür?

Aşağıdaki örnekte Ogrenci sınıfında iki farklı üye türü bulunur. toplamOgrenci static olduğu için bütün öğrenciler tarafından paylaşılır. ad alanı ise instance alandır ve her öğrenci nesnesi kendi ad değerini saklar.

public class Main {
    public static void main(String[] args) {
        Ogrenci birinci = new Ogrenci("Deniz");
        Ogrenci ikinci = new Ogrenci("Ece");

        System.out.println("Toplam öğrenci: " + Ogrenci.toplamOgrenci);
        System.out.println("Birinci öğrencinin adı: " + birinci.ad);
        System.out.println("İkinci öğrencinin adı: " + ikinci.ad);
    }
}

class Ogrenci {
    static int toplamOgrenci = 0;
    String ad;

    Ogrenci(String ad) {
        this.ad = ad;
        toplamOgrenci++;
    }
}

Programın beklenen çıktısı şöyledir:

Toplam öğrenci: 2
Birinci öğrencinin adı: Deniz
İkinci öğrencinin adı: Ece

Program çalışırken önce new Ogrenci("Deniz") ifadesiyle birinci nesne oluşturulur. Yapıcı metot çalışır, ad alanına Deniz değeri atanır ve ortak sayaç bir artırılır. Bu aşamada Ogrenci.toplamOgrenci değeri 1 olur.

Ardından ikinci nesne oluşturulur. Bu nesnenin ad alanına Ece atanır. Sayaç ise yeni bir nesnenin kendi kopyası değildir; sınıfa ait ortak alan olduğu için mevcut değer 1’den 2’ye çıkar. Böylece iki nesnenin adları farklı kalırken toplam nesne sayısı tek bir ortak alanda tutulur.

Çıktıda sayaca Ogrenci.toplamOgrenci biçiminde sınıf adıyla, ad alanlarına ise birinci.ad ve ikinci.ad biçiminde ilgili nesneler üzerinden erişilir. Bu kullanım, static üyeyle instance üye arasındaki temel farkı doğrudan gösterir. Konuyu pekiştirmek için Java bilgi testini çözerek sınıf ve nesne üyeleriyle ilgili bilgini sınayabilirsin.

static metot, instance alana neden doğrudan erişemez?

static metot, instance alana neden doğrudan erişemez?

static metot, belirli bir nesneye değil sınıfa bağlıdır. Bu nedenle metot içinde kendiliğinden kullanılacak bir nesne ve o nesneye ait instance alan bulunmaz. Örneğin bir sınıfta iki farklı nesnenin adı varsa, static metot kendi başına hangi adı okuyacağını bilemez. Ada adlı nesnenin adını mı, Mert adlı nesnenin adını mı alacağı açıkça belirtilmelidir.

Instance verisine ulaşmak için metota ilgili nesnenin referansı verilebilir. Aşağıdaki örnekte printName static olmasına rağmen, parametre olarak aldığı Student referansı üzerinden name alanına erişir:

public class Student {
    private final String name;

    public Student(String name) {
        this.name = name;
    }

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

    public static void main(String[] args) {
        Student first = new Student("Ada");
        Student second = new Student("Mert");

        Student.printName(first);
        Student.printName(second);
    }
}

Burada student.name ifadesi, static metodun hangi nesneyle çalışacağını açıkça gösterir. Sadece name yazılsaydı, Java hangi nesnenin adının okunacağını belirleyemezdi. Static metotlarda belirli bir nesneyi temsil eden this referansı da bulunmaz.

Beklenen çıktı:

Ada
Mert

main metodunun static olması da aynı sınıf düzeyi mantığıyla açıklanır. Java programı başlatırken önce belirli bir Student nesnesi oluşturulmasını beklemeden bu metodu sınıf üzerinden çağırabilir. Instance metotlar genellikle first veya second gibi bir nesne üzerinden çağrılırken, Student.printName(first) yazımı static üyenin sınıfa bağlı olduğunu daha görünür kılar.

Bu örnekteki ayrımı pekiştirmek için Java bilgi testini çözerek sınıf ve nesne üyeleriyle ilgili seviyeni kontrol edebilirsin.

Bir üyeye static yazıp yazmayacağına nasıl karar verilir?

static kullanımı için her durumda geçerli, koşulsuz bir kural yoktur. Üyenin neyi temsil ettiğini, nasıl kullanılacağını ve belirli bir nesnenin durumuna ihtiyaç duyup duymadığını birlikte değerlendirmek gerekir. Aşağıdaki üç soruluk kontrol listesi bu kararı verirken yardımcı olabilir:

  1. Bu veri sınıfa mı, nesneye mi aittir? Ortak sayaç, sınıftan oluşturulan nesnelerin tümü için tek bir değer ifade ediyorsa sınıfa ait düşünülebilir ve static kullanılabilir. Buna karşılık name alanı her öğrenci nesnesi için farklıdır, bu nedenle instance alan olarak kalır.
  2. Nesne oluşturmadan kullanılmalı mı? Ortak sayaca belirli bir nesne seçmeden sınıf adı üzerinden erişmek gerekiyorsa static anlamlı olabilir. Bir öğrencinin adını okumak içinse önce o öğrenciyi temsil eden bir nesne gerekir.
  3. Metot belirli bir nesnenin durumuna ihtiyaç duyuyor mu? Yalnızca ortak sayaçla çalışan bir metot belirli bir nesnenin alanlarına ihtiyaç duymayabilir. Fakat bir öğrencinin adını yazdıran metot, hangi Student nesnesinin kullanılacağını bilmelidir. Böyle bir metot instance metot olabilir veya kendisine açıkça bir nesne referansı verilebilir.

Bu üç sorunun cevapları birlikte ele alınmalıdır. Bir alanın tüm nesneler için ortak olması static kararını destekleyebilir, ancak metot belirli bir nesnenin durumuna ihtiyaç duyuyorsa aynı yaklaşım metot için uygun olmayabilir. Static kullanmak kodu otomatik olarak daha iyi hâle getirmez; sınıf ve nesne arasındaki sorumluluğu doğru yansıtması önemlidir.

Bu ayrımı birebir geri bildirim ve kişiye özel alıştırmalarla çalışmak istersen Java Özel Ders programını inceleyebilirsin.

Bir üyeye static eklemeden önce onun ortak bir sınıf bilgisini mi, yoksa belirli bir nesnenin durumunu mu temsil ettiğini netleştirmek doğru başlangıçtır.

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