İlginizi Çekebilir
Java Overriding Kavramı
  1. Ana Sayfa
  2. Java
  3. Java Overriding Nedir?

Java Overriding Nedir?

Daha önce Java’da Metotlar başlığı altında kısada olsa bahsetmiş olduğum, Nesne Yönelimli Programlama’nın yapı taşlarından olan override kavramını sizlerle “Java Overriding Nedir” başlığı altında inceleyerek, detaylarına ineceğiz.🔎

Her şeyin başlangıcını yaptığımız, programlarımızı çalıştırdığımız “Main” yapısının aslında bir metot olduğunu öğrendiğim zaman ve nesneye yönelimli programlama kavramına ayak uydurmaya, benimsemeye çalışırken uyguladığım pratiklerde metot yapılarını daha farklı görmemi sağlayan override kavramının tam olarak ne olduğuna, ne işe yaradığına bir 🔦 ışık tutarak konumuza giriş yapalım.

Java Overriding Nedir?

Önce teorik olarak tanımlamaya daha sonra ise aklımızda kalıcı bir yer elde edebilmesi için basit bir örnek kullanarak tanımın üzerinden bir kez daha geçmeyi düşünüyorum. Eğer başlığın sonunda kavramı tam olarak anlayamadıysanız konun aşağısında yer alan “yorum yap” kısmından benimle iletişime geçerek yardım alabileceğinizi unutmayın.

👨🏻‍🏫 Hadi Java Overriding kavramını öğrenmeye ve hayallerimizi gerçekleştirmeye birlikte başlayalım.

Java Overriding, programlarımızda kullandığımız kalıtım sayesinde üst sınıftan, alt sınıfa geçecek metotların o sınıf yapısına uygun bir şekilde tekrardan gövdesinin değiştirilmesine ve kod satırlarının yeniden şekil almasına olanak sağlayacaktır. Tabii bu imkanları sağlarken bazı uymamız ve dikkat etmemiz kuralların olduğunu unutmamalıyız.

Java Overriding ve Overloading Arasındaki Fark
Java Overriding Nedir

Bu teorik bilgiyi hemen bir örnek üzerinden giderek daha iyi anlamaya çalışalım. Örneğimiz üzerinde bir otomobil firmasını düşünerek ilk adımımızı atalım. Örneğimizdeki bu firma içerisinde çeşitli arabaların gösterildiği stantların bulunduğu yerlerin olduğunu ve bu stant bölgesinin önünde orada yer alan araçların özelliklerinin bulunduğunu bir tanıtım broşürünün olduğunu varsayalım. Bir müşteri olarak gittiğimiz bu firma içerisindeki stant önlerinde yer alan broşürlere baktığımızda araçların motor hacimlerinin, kullandığı enerjinin, boyasının ve diğer tüm teknik özelliklerinin değiştiğini gözlemleriz. Temelde aynı olarak gözüken başlıkların kendi içerisinde değişmesi, başka bir konuda hizmet vermesine imkan ver yapının bütünü override kavramının ta kendisidir.

Teorik bilgimizi verdikten ve akılları biraz daha karıştıracak örnek yapımızı oluşturduktan sonraki adımımızda Override yapısını kullanırken dikkat etmemiz gereken kurallar ve bize sağlamış olduğu avantajları incelemek var. Hadi gelin bu detaylara yakından bakalım.👀

Java Overriding Kullanım Kuralları

  • Üst sınıf içerisinde yer alan private metotlar override işlemine tabi tutulmaz. Aksi takdirde hata alınır.
  • Override ettiğimiz bir metodun erişim belirleyicisinin seviyesini düşüremeyiz fakat yükseltebiliriz.
  • Üst sınıftan miras aldığımız bir metodun dönüş tipini veya parametrelerini değiştiremeyiz.
  • Static ve Final olarak tanımlı metotları override edemeyiz.
  • Üst sınıfımızdaki ve alt sınıfımızda bulunan override edeceğimiz metot isimleri aynı olmalıdır.
  • Constructor (Yapıcı / Kurucu) metotlar override edilemez.

Java Overriding Kullanımının Avantajları

  • Temiz, sade ve anlaşılır kod satırları oluşturmamıza imkan sağlar.
  • Bir sınıfın hangi yapıda duruş sergileyeceğini ve metotların işlevlerinin nasıl uygulanacağını tanımlamamıza imkan sağlar.

Teorik bilgimizin şekillenmesi ve vermiş olduğumuz örneğin kod yapısını oluşturmaya başlamadan önce basit bir taslak ile Override kavramını kod üzerindeki işleyişini görelim.👀

Java Overriding Örnekleri

Overriding kavramını anlayabilmemiz için oluşturmuş olduğum ilk örnek üzerinde bir çalışan kişilerin kaydını alacağımız, bilgilerini göstereceğimiz ve aynı sınıf üzerinden çalışanlarımıza zam yapabileceğimiz üç adet metodumun yer alacağı ve bu sınıfı kullanarak oluşturacağım mühendis çalışanlarının kaydını alacağım alt sınıfta override işlemini gerçekleştirmeyi düşünüyorum. Hadi gelin birlikte bu örneği nasıl yaptığımı aşama aşama giderek inceleyelim.

  1. Öncelikle “EmployeManager” isminde bir sınıf oluşturarak işime başladım.
  2. Oluşturmuş olduğum bu sınıf üzerinde çalışanların isimlerini, soyadlarını, çalışma mevkilerini ve aldıkları maaşları kayıt altında tutabilmek için bazı değişkenler tanımladım.
  3. Tanımlama işlemlerimden sonra bu değişkenlere değer atayabilmek için, atadığım değerleri gösterebilmek ve çalışanın maaşlarını düzenleyebilmek için üç adet metot tanımlamasını gerçekleştirerek içlerini doldurdum.
  4. Yapmış olduğum bu basit üç aşamadan sonra sınıfımın içerisi aşağıdaki hale geldi:

    public class EmployeManager {
        // Değişken Tanımlaması:
        String employeName, employeSurName,employeJob;
        double employeMoney;
        // Metotların Tanımlanması:
        public void addEmploye(String employeName,String employeSurName, String employeJob, double employeMoney){
            this.employeName = employeName;
            this.employeSurName = employeSurName;
            this.employeJob = employeJob;
            this.employeMoney = employeMoney;
        }
        public String getEmployeInfo() {
            if (employeName != null && employeSurName != null && employeJob != null) {
                if (employeMoney <= 0)
                    employeMoney = 0;
                return "----------\n< Çalışan Bilgileri >\n----------\n-> Çalışanın İsmi: " + employeName + "\n-> Çalışanın Soyismi: " +
                        employeSurName + "\n-> Çalışanın İşi: " + employeJob + "\n-> Çalışanın Aldığı Maaş: " + employeMoney + " TL\n----------";
            }
            return "----------\n< Çalışan Bulunamadı veya Mevcut Değil >\n----------\n-> Sistem üzerinde aratmış olduğunuz kullanıcı bilgileri tanımlı değil.\n----------";
        }
        public void makeRaise(double raiseValue){
            this.employeMoney += raiseValue;
            System.out.println("-> Başarılı Bir Şekilde "+employeName+" Çalışanına "+raiseValue +" TL Zam Yapıldı.\n-> Yeni Maaş: "+employeMoney +"TL\n----------");
        }
    }

    Üst sınıfımı bu şekilde oluşturduktan sonra örneğimi bitirmeye yönelik ve “Override” işlemini uygulayacağım aşamayı gerçekleştirmeye yönelik aşağıdaki adımlara geçmiş oldum.

  5. Mühendis çalışanlarını kayıt edebilmek ve override işlemini uygulayabilmek için “EmployeManager” sınıfından “EngineerManager” isminde bir alt sınıf oluşturarak işlemlerime devam ettim.
  6. @Override Annotation kavramını kullanarak makeRaise metodunun içerisindeki yapıya müdahale ettim.
  7. Bu işlem sonucunda “EngineerManager” sınıfının içeriği aşağıdaki editörde paylaştığım gibi bir hâl aldı.

    public class EngineerManager extends EmployeManager{
    
        @Override // -> Mühendis çalışanlarına ekstra olarak her zam sonunda +50TL eklenmesini istiyoruz.
        public void makeRaise(double raiseValue){
            super.employeMoney += raiseValue;
            super.employeMoney += 50;
            System.out.println("-> Başarılı Bir Şekilde "+employeName+" Çalışanına "+raiseValue +" TL ve Mühendis Olduğu İçin +50 TL Zam Yapıldı.\n-> Yeni Maaş: "+super.employeMoney +"TL \n----------");
        }
    }
  8. Son aşama olarak kodumuzun çıktısını görebilmek için “Main” sınıfımıza girerek gerekli tanımlamaları oluşturduktan sonra programımızı çalıştırıyoruz ve kodumuzun çıktısına göz atıyoruz.
  9. public class Main {
    
        public static void main(String[] args) {
    
            EmployeManager employeManager = new EmployeManager();
            employeManager.addEmploye("Metehan","Durmuş","Beden İşçisi",4000);
            System.out.println(employeManager.getEmployeInfo());
            employeManager.makeRaise(500);
            EngineerManager engineerManager = new EngineerManager();
            engineerManager.addEmploye("Oktay","Güden","Elektrik Elektronik Mühendisi",7500);
            System.out.println(engineerManager.getEmployeInfo());
            engineerManager.makeRaise(500);
        }
    }

Kod Çıktısı:

Java Overriding Örnek Kod Çıktısı
Java Overriding Örnekleri #1

Evet, ilk örneğimizi yaptığımıza göre artık “Java Overriding Nedir” başlığı altında vermiş olduğum araba örneğini ele alarak yeni bir örnek yapabiliriz. Bu örneğimizi yaparken izlediğim aşamaları aşağıda maddeler halinde detaylı bir şekilde incelerken sizlerin de eş zamanlı bir şekilde bu örneği oluşturmanızı istiyorum. Hadi örneğimizi oluşturmaya başlayalım. 💪🏻

  1. İlk başta “CarCompanyManager” isminde bir sınıf tanımlayarak işlemime başladım. Daha sonra bu sınıf üzerinde kullanmak ve çeşitli verileri tutacağım değişkenlerin tanımlamasını gerçekleştirdim.
  2. Tanımlamalarını yaptığım değişkenlere verilerin atanmasını ve bu atanan verilerin istenildiği takdirde gösterilmesini sağlayan iki adet metot tanımlaması gerçekleştirdim ve sınıfım aşağıdaki haline geldi.
  3. public class CarCompanyManager {
        String carName,carModel,carEnergy,carCountry;
        int yearOfProduction;
        double carMoney;
    
        public void addNewCar(String carName,String carModel, String carEnergy, String carCountry,int yearOfProduction, double carMoney){
            this.carName = carName;
            this.carModel = carModel;
            this.carEnergy = carEnergy;
            this.carCountry = carCountry;
            this.yearOfProduction = yearOfProduction;
            this.carMoney = carMoney;
        }
    
        public String getInfoCar(String stantName){
            if(carName != null && carModel != null && carEnergy != null && carCountry != null)
                return "----------\n< "+stantName+" Stant Araç Tanıtımı >\n----------\n-> Aracın Markası: "+carName+"\n-> Aracın Modeli: "+
                        carModel+"\n-> Aracın Kullandığı Yakıt: "+carEnergy+"\n-> Aracın Üretildiği Ülke: "+carCountry +
                        "\n-> Aracın Üretildiği Yıl: "+ yearOfProduction +"\n-> Aracın Fiyatı: "+carMoney+" TL\n----------";
            return "----------\n< Araç Bulunamadı >\n----------\n-> Aradığınız Kriterlerde Stant Üzerinde Araç Bulunmamaktadır.\n----------";
        }
    }
    

    Üst sınıfımı yukarıdaki örnekte olduğu gibi basit bir kaç adım ile oluşturdum. Böylelikle asıl bizi yoracak ve belki aklımızı karıştıracak kısım olan override ve overload uygulayacağımız bundan sonraki aşamaya geçmiş oldum.

  4. Motosiklet kayıtlarını oluşturacağımız, override ve overload işlemlerini gerçekleştireceğimiz sınıf olan “MotorcycleCompanyManager” isminde bir sınıf oluşturarak işlemlerime devam ettim.
  5. Override işlemini kullanarak ilk başta “getInfoCar” metodunun içeriğini değiştirdim ve daha sonra bu metodu overload işlemine tabi tutarak bir kaç çeşit yazdırma şekli ekledim.
    Bu işlemlerimi uyguladığım zaman sınıfımın içeriği bu şekilde bir hâl aldı:

    public class MotorcycleCompanyManager extends CarCompanyManager{
    
        // Override İşlemi:
        @Override
        public String getInfoCar(String stantName) {
            if (carName != null && carModel != null && carEnergy != null && carCountry != null)
                return "----------\n< " + stantName + " Stant Motosiklet Tanıtımı >\n----------\n-> Motosiklet Markası: " + super.carName + "\n-> Motosiklet Modeli: " +
                        carModel + "\n-> Motosiklet Kullandığı Yakıt: " + super.carEnergy + "\n-> Motosiklet Üretildiği Ülke: " + super.carCountry +
                        "\n-> Motosiklet Üretildiği Yıl: " + super.yearOfProduction + "\n-> Motosiklet Fiyatı: " + super.carMoney + " TL\n----------";
            return "----------\n< Motosiklet Bulunamadı >\n----------\n-> Aradığınız Kriterlerde Stant Üzerinde Araç Bulunmamaktadır.\n----------";
        }
        // Override Ettiğimiz Metodu Birde Overload İşlemine Tabii Tutuyoruz.
        public String getInfoCar(String stantName, String alert){
            if (carName != null && carModel != null && carEnergy != null && carCountry != null)
                return "----------\n< " + stantName + " Stant Motosiklet Tanıtımı >\n----------\n-> Motosiklet Markası: " + super.carName + "\n-> Motosiklet Modeli: " +
                        carModel + "\n-> Motosiklet Kullandığı Yakıt: " + super.carEnergy + "\n-> Motosiklet Üretildiği Ülke: " + super.carCountry +
                        "\n-> Motosiklet Üretildiği Yıl: " + super.yearOfProduction + "\n-> Motosiklet Fiyatı: " + super.carMoney + " TL\n----------"+"\n-> "+alert+"\n----------";
            return "----------\n< Motosiklet Bulunamadı >\n----------\n-> Aradığınız Kriterlerde Stant Üzerinde Araç Bulunmamaktadır.\n----------";
        }
        public String getInfoCar(String stantName, int year){
            if (carName != null && carModel != null && carEnergy != null && carCountry != null)
                if(super.yearOfProduction>year)
                    return "----------\n< " + stantName + " Stant Motosiklet Tanıtımı >\n----------\n-> Motosiklet Markası: " + super.carName + "\n-> Motosiklet Modeli: " +
                            carModel + "\n-> Motosiklet Kullandığı Yakıt: " + super.carEnergy + "\n-> Motosiklet Üretildiği Ülke: " + super.carCountry +
                            "\n-> Motosiklet Üretildiği Yıl: " + super.yearOfProduction + "\n-> Motosiklet Fiyatı: " + super.carMoney + " TL\n----------"+"\n-> İndirim Uygulanmadı.\n----------";
                else {
                    double discount,value;
                    discount = super.carMoney*0.12;
                    super.carMoney -= discount;
                    value = super.carMoney+discount;
                    return "----------\n< " + stantName + " Stant Motosiklet Tanıtımı >\n----------\n-> Motosiklet Markası: " + super.carName + "\n-> Motosiklet Modeli: " +
                            carModel + "\n-> Motosiklet Kullandığı Yakıt: " + super.carEnergy + "\n-> Motosiklet Üretildiği Ülke: " + super.carCountry +
                            "\n-> Motosiklet Üretildiği Yıl: " + super.yearOfProduction + "\n-> Motosiklet Fiyatı: " + super.carMoney + " TL\n----------"+"\n-> Tebrikler, "+discount +" Değerinde Bir İndirim Uygulandı.\n-> İndirimsiz Fiyatı: "+value+" TL\n----------";
                }
            return "----------\n< Motosiklet Bulunamadı >\n----------\n-> Aradığınız Kriterlerde Stant Üzerinde Araç Bulunmamaktadır.\n----------";
        }
    }
  6. Son olarak bu oluşturduğum sınıf yapılarının nasıl çalıştığını görebilmek için “Main” sınıfıma girerek, sınıfların tanımlamasını gerçekleştirdim.
  7. public class Main {
    
        public static void main(String[] args) {
    
            CarCompanyManager carCompanyManager = new CarCompanyManager();
            carCompanyManager.addNewCar("Ford","Transit","Benzin","ABD",2021,234800);
            System.out.println(carCompanyManager.getInfoCar("Çağlayan"));
    
            MotorcycleCompanyManager motorcycleCompanyManager = new MotorcycleCompanyManager();
            motorcycleCompanyManager.addNewCar("Harley-Davidson","Fat Boy","Benzin","ABD",2021,369567);
            System.out.println(motorcycleCompanyManager.getInfoCar("SOA","Fiyatlarımızda ÖTV ve KDV Yoktur."));
        }
    }

Kod Çıktısı:

Java Overriding ve Overload Örneği
Java Overriding ve Overload Kullanımı

Eğer override konusunda daha detaylı bir kaynak arıyorsanız Oracle tarafından hazırlanmış rehber konusuna buradan gidebileceğiniz gibi, Aklınıza takılan soruları ya da konu işleyişi hakkında önerilerinizi veya eleştirilerinizi aşağıda bulunan yorum yap kısmından bana iletebileceğinizi unutmayın.

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