İlginizi Çekebilir
featured
  1. Ana Sayfa
  2. Java
  3. Java’da Kalıtım Nedir?

Java’da Kalıtım Nedir?

Nesneye yönelik programlama kavramını anlatırken temel özelliklerinden bahsederken Java’da Kalıtım (Inheritance) kavramından bahsetmiştim. Miras Alma olarak da bilinen Java’da kalıtım, sürekli kullanacağımız ortak özellikleri tekrar tekrar yazmamızı engeller.

Java’da Kalıtım Nedir?

Kalıtım, mevcut sınıflardaki elemanlarımızı kullanarak yeni sınıflar türetmemize olanak sağlar. Oluşturmuş olduğumuz bu sınıflar, türetildiği sınıfın özelliklerini ve ekstra olarak eklenecek yeni özelliklere sahip olabilirler. Teorik olarak anlamamız zor olabilir o yüzden bir örnek üzerinden gidelim.

Bir şirket içerisinde çalışanlarımızın çeşitli bilgilerini tutacağımız bir otomasyon geliştirmek isteyelim. Bu otomasyon içerisinde Employe isminde bir sınıf tanımlayarak işlemlerimizi yürütebiliriz. Employe sınıfında olan özellikleri kullanarak ekstra haklara sahip olacak GeneralManager sınıfında yer alacak genel müdürlere ekstra haklar vermek istersek Java’da Kalıtım (Inheritance) yani miras alma özelliğini kullanmamız gerekir.

Java’da Kalıtım Kullanımı

Bir sınıf üzerinden miras almak istediğimiz zaman kullanmamız gereken kelime extends‘dir. Temel şablonumuz şu şekilde olacaktır:

class Ustsinif{
    // Kullanılacak kod satırları.
}

class Altsinif extends Ustsinif {
    // Kullanılacak kod satırları.
}

Üst sınıfı anne ve baba olarak tanımlayabiliriz içlerinde bazı DNA verileri vardır ve üst sınıftan türetilen altsınıfı ise bu ebeveynin çocukları olarak görebiliriz. Üst sınıf verilerini kullanarak alt sınıf kendi benliğini kazanır.

Java’da Kalıtım Kavramları

Java’da kalıtım kavramı hakkında bilmemiz gereken bazı önemli kavramlar bulunuyor. Bu kavramları öğrenemezsek Java’da kalıtım konusunda zorluklar yaşayabiliriz. Bu kavramlar şu şekildedir;

  • Super Class (Üst Sınıf): İçerisinde bulunan özellikleri kalıtım yolu ile miras alınan temel sınıftır.
  • Sub Class (Alt Sınıf): Üst sınıftan türetilmiş bir sınıftır. Bağlı olunan üst sınıf içerisinden bir veriyi işlemek için çekmek istediğimiz zaman super tanımını kullanır.

Super class ve Sub class kavramını anlayabilmek için kalıtım kavramını anlatırken ilk vermiş olduğum örnek üzerinden yola çıkalım. Employe isminde bir üst sınıfımız bulunsun ve bu sınıfın özelliklerini kullanacak GeneralManager isminde alt sınıf oluşturarak bir örnek kod dizisi oluşturalım. Bu örneği oluştururken gerçekleştirdiğim aşamalar şu şekildedir;

#1 Employe isminde bir üst sınıf oluşturarak bu sınıfta temel olarak kullanılacak bazı elemanlar ve metot tanımlamaları gerçekleştirdim. Bu temel tanımlamalar her çalışan için bulunması gereken standartlığa sahip olmalıdır.

public class Employe {
    // Gerekli Değişkenler:
    String isim, soyad, bolum = "Çalışan", calisanBilgileri;
    int izingünü =14;
    double maas = 2500;
    // Yapıcı Metot Tanımlaması:
    Employe(String isim, String soyad){
        this.isim = isim;
        this.soyad = soyad;
    }
    // Yazdırılacak Metin Değişkenleri:
    void printInfo(){
        calisanBilgileri = "-> İsim ve Soyisim: "+ isim + " " + soyad + "\n-> Bölüm: " + bolum + "\n-> İzin Günü: "+ izingünü +" Gün" + "\n-> Maaş: " + maas +" TL";
        System.out.println(calisanBilgileri);
    }
}

#2 Oluşturmuş olduğumuz genel çalışan özelliklerini alt sınfımız olan GeneralManager sınıfında değiştirebilmek için yapıcı metot içerisinde gerekli tanımlamaları gerçekleştiriyorum.

public class GeneralManager extends Employe{

    GeneralManager (String isim, String soyad){
        super(isim,soyad);
        bolum = "Genel Müdür";
        maas = 9000;
        izingünü = 30;
    }
}

#3 Yapılan değişiklikleri ve kayıt alınan çalışan bilgilerinin çıktısını alabilmek için Main sınıfı içerisinde ilk önce tanımlama sonrasında ise ekrana yazdırma işlemlerini gerçekleştiriyorum.

public class Main {
    public static void main(String[] args){
        // Çalışan Ekleyelim:
        Employe e1 = new Employe("Faruk","Yıldız");
        GeneralManager g1 = new GeneralManager("Emre","Çelen");
        // Ekrana Yazdırma Komutları:
        System.out.println("--------------\n-> Personel Oluşturuldu\n--------------");
        e1.printInfo();
        System.out.println("--------------\n-> Genel Müdür Oluşturuldu\n--------------");
        g1.printInfo();
        System.out.println("--------------");
    }
}

Kod Çıktısı:

Java'da Kalıtım Nasıl Yapılır.
Java’da Kalıtım

Java’da Kalıtım çalışma prensibi temel olarak yukarıdaki örnek gibi ilerlemektedir. Kalıtım (Inheritance), programlarınızda kullanımının size sağlayacağı bir takım faydalar vardır. Bu faydaları aşağıdaki başlıkta sizler için listeleyeceğim.

Java Kalıtım Faydaları

  • Önceden oluşturduğumuz sınıflar, projelerimiz üzerinde denenmiş ve hatasızdır. Bu yüzden kalıtım ile oluşturduğumuz bir alt sınıfı kullanacağımız zaman hata ile karşılaşma ihtimalimiz azalır.
  • Daha önceden yazılmış kod parçacıklarını tekrar tekrar yazma sıkıntısından kurtararak alt sınıflarda kullanmamıza olanak sağlar. Bu durumda zaman ve emek tasarrufu sağlar.
  • Gerçekleştireceğimiz bir değişikliği her sınıfta ayrı ayrı uğraşmak yerine super class üzerinde güncelleme yapma esnekliği oluşturur.

Java’da kalıtım faydaları hakkında maddeler bu şekilde uzayarak gidebileceği gibi doğru kullanmama durumunda kendinizi içinden çıkılmayacak bir duruma getirtebilirsiniz. Bu durumu önlemek için bir örnek dizisi daha oluşturarak çıktısına birlikte göz atalım.

Bu örnek üzerinde bir bankayı ele alalım ve kredi satışı için gerekli sınıfları oluşturduktan sonra çeşitli hesaplamaları yapmasını isteyeceğimiz bir üst sınıf ve alt sınıf ilişkisi kuralım. Bu örnek için uygulayacağım aşamalar şu şekildedir;

#1 Super Class (Üst Sınıf) olarak KrediTurleri isminde bir sınıf oluşturarak her kredide bulunacağını düşündüğüm belirli değişkenler ve metotlar tanımladım.

public class KrediTurleri {
    // Değişken Tanımlaması:
    String verilenKredi,krediTuru;
    int vadeSayisi;
    double krediTutari,faizOrani;

    // Faiz Hesaplayacak Metot Tanımlaması:
    double odenecekTutar(){
        return krediTutari+((krediTutari/vadeSayisi)*faizOrani*vadeSayisi);
    }
    String krediBilgileri(){
        return "-> Kredi İsmi: "+verilenKredi+"\n-> Kredi Türü: "+krediTuru+"\n-> Alınan Kredi Miktarı: "+krediTutari+"\n-> Faiz Oranı: " +faizOrani + "\t Vade Sayısı: " + vadeSayisi +"\n-> Odenecek Tutar: "+ odenecekTutar();
    }
}

#2 Tanımladığım üst sınıftaki değerleri kullanarak iki adet alt sınıf tanımladım. Bu tanımladığım alt sınıflardan TarımKredisi olana çeşitli indirim sağlamak için ödenecek tutar üzerinde Override yaparak yeni tutarı oluşturdum.

public class TarimKredisi extends KrediTurleri {

    TarimKredisi (double krediTutari, int vadeSayisi){
        this.krediTutari = krediTutari;
        this.vadeSayisi = vadeSayisi;
        verilenKredi = "Tarım Kredisi";
        krediTuru = "Kampanyalı Çiftci";
        faizOrani = 0.14;
    }
    @Override
    double odenecekTutar() {
        return super.odenecekTutar()-(krediTutari*(faizOrani-0.02)+50);
    }

}

#3 Standart kredi türü olarak tanımladığım ihtiyaç kredisi üzerinde ise gerekli bilgilerin tanımlamasını gerçekleştirdim.

public class IhtiyacKredisi extends KrediTurleri {
    IhtiyacKredisi (double krediTutari, int vadeSayisi){
        this.krediTutari = krediTutari;
        this.vadeSayisi = vadeSayisi;
        verilenKredi = "İhtiyaç Kredisi";
        krediTuru = "Standart";
        faizOrani = 0.25;
    }
}

#4 Kredi türleri tanımlama işlemim bittikten sonra Main sınıfı içerisinde kullanıcıdan istediği kredi tutarı, vade sayısı ve almak istediği kredi türünü sorarak switch kontrol yapısında işleme tabi tuttum.

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        // Scanner Tanımlaması:
        Scanner scanner = new Scanner(System.in);
        // Değişken Tanımlaması:
        double krediTutari;
        int vadeSayisi, krediTuru;

        // Ekrana yazdırma İşlemleri:
        System.out.println("------------------");
        System.out.print("-> Almak İstediğiniz Kredi Tutarı: ");
        krediTutari = scanner.nextDouble();
        System.out.print("-> İstediğiniz Vade: ");
        vadeSayisi = scanner.nextInt();
        System.out.println("------------------\n-> Almak İstediğiniz Kredi Türü: \n1-> İhtiyaç Kredisi \n2-> Tarım Kredisi \n------------------");
        System.out.print("-> Kredi Türü: ");
        krediTuru = scanner.nextInt();
        // Kredi Tanımlamaları:
        IhtiyacKredisi ihtiyacKredisi = new IhtiyacKredisi(krediTutari,vadeSayisi);
        TarimKredisi tarimKredisi = new TarimKredisi(krediTutari,vadeSayisi);
        // Kredi Hesaplaması:
        switch (krediTuru){
            case 1:
                System.out.println("------------------\n"+ihtiyacKredisi.krediBilgileri()+"\n------------------");
                break;
            case 2:
                System.out.println("------------------\n"+tarimKredisi.krediBilgileri()+"\n------------------");
                break;
            default:
                System.out.println("------------------\n-> Tanımsız Bir Değer Girdiniz.\n------------------");
                break;

        }
    }
}

Kod Çıktısı:

Java'da Kalıtım Nasıl Yapılır
Java’da Inheritance Örneği

Java’da Kalıtım konusunun sonuna gelirken her zaman olduğu gibi aklınıza takılan soruları veya konu işleyişi hakkında önerilerinizi aşağıda bulunan “yorum yap” kısmından benimle iletişime geçerek paylaşabilirsiniz. Kalıtım konusunda Oracle tarafından hazırlanmış dokümantasyona göz atmak isterseniz buradan ilgili sayfaya ulaşabilir veya bir diğer nesne tabanlı programlama konusu olan Java Encapsulation Kavramı içeriğine göz atabilirsiniz.

Yorum Yap

Yazar Hakkında

Yazmayı, öğrenmeyi, öğrendiklerini paylaşmayı , kodlamayı ve günün birinde Yönetim Bilişim Sistemleri Uzmanı olmanın hayalini kuran birisiyim.

Yorum Yap