Anasayfa / JAVA / Java’da Sınıflar (Classes) ve Nesneler (Objects)

Java’da Sınıflar (Classes) ve Nesneler (Objects)

Java programlama dilini öğrenmeye başladığınızda duyacağınız en önemli terimlerin başında “Nesne Yönelimli Programlama” (Object-Oriented Programming – OOP) gelir. Bu programlama yaklaşımının ve Java’nın tam kalbinde ise iki temel kavram yatar: Sınıflar (Classes) ve Nesneler (Objects).

Eski tarz (prosedürel) programlamada odak noktası “yapılacak işlemler” iken, nesne yönelimli programlamada odak noktası gerçek dünyadaki varlıkları modelleyen “nesneler” ve bu nesnelerin sahip olduğu verilerdir. Bu rehberimizde, yazılım dünyasının bu en temel iki kavramını günlük hayattan örneklerle inceleyecek ve ilk kodlarımızı yazarak konuyu pekiştireceğiz.


1. Sınıf (Class) Nedir?

Bir sınıf (class), oluşturulacak nesnelerin ortak özelliklerini (verilerini) ve davranışlarını (metotlarını) tanımlayan bir kalıp, bir şablon veya bir plandır. Sınıflar, bellekte fiziksel olarak yer kaplayan gerçek varlıklar değil, sadece mantıksal tasarımlardır.

Günlük Hayattan Örnek (Otomobil Analojisi): Bir otomobil fabrikasını düşünün. Mühendisler önce otomobilin kağıt üzerinde bir planını (mimari çizimini) yaparlar. Bu planda otomobilin “markası, modeli, rengi” gibi özellikleri ve “gaza basınca hızlanması, frene basınca yavaşlaması” gibi genel davranışları belirlenir. İşte bu kağıt üzerindeki tasarım, Java’daki sınıf (class) kavramına karşılık gelir.

Hiç otomobil görmemiş birine otomobili anlatmak isterseniz, ona belli bir arabayı değil, bütün otomobillerde ortak olan bu genel özellikleri (sınıf tanımını) anlatırsınız.

Java’da bir sınıf temel olarak iki bileşenden oluşur:

  1. Nitelikler (Instance Variables / Özellikler): Nesnenin durumunu ve verilerini tutan değişkenlerdir (Örn: renk, marka).
  2. Yöntemler (Methods / Davranışlar): Nesnenin ne yapabileceğini belirleyen, veriler üzerinde işlem yapan kod bloklarıdır (Örn: gazaBas, dur).

2. Nesne (Object) Nedir?

Nesne (Object), bir sınıfın (şablonun) kullanılarak bellekte fiziksel olarak üretilmiş, elle tutulur, somut kopyasıdır. Bir sınıftan (kalıptan) istediğiniz sayıda nesne üretebilirsiniz ve üretilen her nesnenin kendine ait bağımsız verileri (durumu) olur.

Otomobil Analojisine Devam: Kağıt üzerindeki otomobil planını (sınıfı) kullanarak fabrikada banttan indirdiğiniz her bir gerçek otomobil bir nesnedir. Üretilen bu arabaların hepsi “Otomobil” sınıfındandır ama her birinin rengi farklı olabilir, veya her birinin kendine has bir plakası (kimliği) vardır. Örneğin “06-XYZ-1234” plakalı, kırmızı renkli belirli bir araba, Otomobil sınıfının somut bir nesnesidir (instance).

Aynı sınıftan üretilmiş iki farklı nesne, birbirlerinden tamamen bağımsızdır. Bir kırmızı spor otomobil 100 km hıza 6 saniyede çıkarken, mavi bir otomobil 12 saniyede çıkabilir; her ikisi de kendi içlerindeki özelliklere göre “hızlanma” davranışını sergiler.


3. Java’da Sınıf ve Nesne Oluşturmak (Kod Örneği)

Yukarıdaki teorik bilgileri Java koduna dökelim. Önce Otomobil adında bir sınıf (şablon) oluşturalım, ardından bu şablonu kullanarak gerçek nesneler üretelim.

// 1. ADIM: Sınıfı (Şablonu) Tanımlıyoruz
public class Otomobil {

    // Nitelikler (Instance Variables - Nesnenin Özellikleri)
    String marka;
    String renk;
    int hiz;

    // Yöntem (Method - Nesnenin Davranışı)
    public void gazaBas(int artisMiktari) {
        hiz = hiz + artisMiktari;
        System.out.println(marka + " hızlanıyor... Yeni hız: " + hiz);
    }

    public void bilgileriGoster() {
        System.out.println("Marka: " + marka + " | Renk: " + renk + " | Hız: " + hiz);
    }
}

Yukarıdaki kod sadece bir kalıptır, henüz ortada gerçek bir otomobil yoktur. Şimdi başka bir sınıfın içinde (main metodu barındıran çalıştırılabilir bir sınıfta) bu kalıbı kullanarak somut nesnelerimizi oluşturalım:

// 2. ADIM: Nesneleri (Somut Varlıkları) Üretiyoruz
public class Galeri {
    public static void main(String[] args) {

        // 1. Nesneyi oluşturuyoruz
        Otomobil araba1 = new Otomobil();

        // 1. Nesnenin özelliklerine değer atıyoruz
        araba1.marka = "Ford";
        araba1.renk = "Mavi";
        araba1.hiz = 0;

        // 2. Nesneyi oluşturuyoruz
        Otomobil araba2 = new Otomobil();

        // 2. Nesnenin özelliklerine değer atıyoruz
        araba2.marka = "Toyota";
        araba2.renk = "Kırmızı";
        araba2.hiz = 0;

        // Nesnelerin davranışlarını (metotlarını) çağırıyoruz
        araba1.gazaBas(50); // Çıktı: Ford hızlanıyor... Yeni hız: 50
        araba2.gazaBas(30); // Çıktı: Toyota hızlanıyor... Yeni hız: 30

        araba1.bilgileriGoster();
        araba2.bilgileriGoster();
    }
}


4. Bellekte Neler Oluyor? (new Operatörü ve Referanslar)

Sınıflar ve nesneler arasındaki farkı tam olarak kavramak için kodun arka planında, bilgisayarın belleğinde (RAM) neler olduğuna bakmalıyız. Java’da çok önemli bir kural vardır: Bir değişken hiçbir zaman bir nesnenin kendisini içinde barındıramaz; yalnızca o nesnenin bellekteki adresini (referansını) tutar.

Yukarıdaki örnekte kullandığımız şu satırı parçalarına ayıralım: Otomobil araba1 = new Otomobil();

Bu kod satırı aslında üç farklı işlem yapar:

  1. Otomobil araba1; : Bu kısım, belleğin Yığıt (Stack) adı verilen hızlı bölümünde araba1 adında bir referans değişkeni (tutamaç) yaratır. Şu anda ortada bir nesne yoktur.
  2. new Otomobil() : new anahtar kelimesi, belleğin Yığın (Heap) adı verilen geniş ve dinamik bölümüne gider, Otomobil sınıfının yapısına bakarak fiziksel bir nesne inşa eder ve özellikler için yer ayırır.
  3. = (Atama İşlemi): Eşittir işareti, Heap bellekte yeni yaratılan o somut nesnenin adresini alır ve Stack bellekteki araba1 isimli değişkene kopyalar. Artık araba1 değişkeni, o nesneyi uzaktan kumanda gibi işaret etmektedir.

Eğer araba1 değişkeninin henüz hiçbir nesneyi işaret etmemesini isterseniz ona null değerini atayabilirsiniz (Otomobil araba1 = null;). Bu, uzaktan kumandanın elinizde olduğunu ama kumandanın henüz bir televizyonla eşleşmediğini gösterir.


5. Yeni Başlayanların Yaptığı Kritik Hata: Referans Atamaları

Nesnelerin değişkenlerde değil, sadece o değişkenlerin içindeki adreslerle (referanslarla) tutulduğunu bilmek sizi devasa bir hatadan kurtarır. Lütfen şu koda dikkatlice bakın:

Otomobil araba1 = new Otomobil();
araba1.marka = "Honda";

Otomobil araba2 = araba1; // araba1'i araba2'ye atıyoruz
araba2.marka = "Mercedes";

System.out.println(araba1.marka); // Sizce ekrana ne yazar?

Pek çok yeni başlayan kişi ekrana “Honda” yazılacağını düşünür. Ancak cevap “Mercedes” olacaktır.

Neden mi? Çünkü araba2 = araba1; dediğinizde Java gidip arabanın yeni bir kopyasını (klonunu) üretmez. Sadece araba1‘in içindeki bellek adresini araba2‘ye kopyalar. Artık hem araba1 hem de araba2 uzaktan kumandaları, bellekteki aynı arabayı (aynı nesneyi) işaret etmektedir. Dolayısıyla araba2 üzerinden yaptığınız bir marka değişikliği, doğrudan tek olan o nesneyi etkiler ve araba1 üzerinden bakıldığında da değişikliğin yansıdığı görülür.


Özetle

Java’da programlama yaparken dünyayı Sınıflar (şablonlar/planlar) ve Nesneler (o planlardan üretilmiş, verileri tutan somut varlıklar) olarak modelliyoruz.

Bir projeye başlarken önce çözülecek probleme dair sınıfları kurgulayacak, onların içine değişkenler (özellikler) ve metotlar (davranışlar) yazacaksınız. Ardından new anahtar kelimesi ile bu sınıflardan nesneler üreterek, bu nesnelerin birbiriyle metotlar aracılığıyla haberleşmesini (iletişim kurmasını) sağlayacaksınız. Bu yapı, kodlarınızın çok daha düzenli, bakımı kolay ve tekrar kullanılabilir (reusable) olmasının temel anahtarıdır.

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

DERSLER