types inheritance java single vs multiple inheritance
Basit örnekler yardımıyla Java'daki çeşitli kalıtım türleri hakkında her şeyi öğrenin. Java'nın çoklu mirası destekleyip desteklemediğini öğrenin:
Son eğitimimizde okuyuculara mirasla ilgili çeşitli temel kavramların yanı sıra Java'da Miras'ı tanıttık.
Bu eğitimde, kalıtım konusunu daha ayrıntılı inceleyeceğiz ve kalıtım türleri hakkında daha fazla bilgi edineceğiz.
=> TÜM Java Öğreticilerini Buradan Kontrol Edin.
bir uygulama yapmak için hangi yazılıma ihtiyacınız var
Ne öğreneceksin:
Java'da Kalıtım Türleri
Sınıfların miras alınma şekline ve kaç sınıfın miras alındığına bağlı olarak, aşağıdaki şekilde gösterildiği gibi aşağıdaki kalıtım türlerine sahibiz.
Yukarıdaki şekilde gösterildiği gibi, aşağıda açıklandığı gibi Nesne Yönelimli programlamada beş tür kalıtım vardır:
# 1) Tek Kalıtım: Türetilmiş bir sınıf veya alt sınıf yalnızca bir temel veya üst sınıftan miras aldığında, bu tek kalıtımdır.
# 2) Çok Düzeyli Kalıtım: Çok Seviyeli Devralmada, bir sınıfın bir temel sınıftan miras aldığı ve türetilmiş sınıfın da başka bir sınıf tarafından miras alındığı birden fazla seviyeye sahibiz.
# 3) Hiyerarşik Kalıtım: Bu tür kalıtımda, bir üst sınıf birden fazla sınıf tarafından miras alındığında bir miras hiyerarşisi oluşturulur.
# 4) Çoklu Kalıtım: Çoklu miras, bir sınıfın özellikleri ve davranışları birden fazla ebeveynden miras alabildiğidir.
# 5) Hibrit Kalıtım: Bir veya daha fazla kalıtım türü birleştirildiğinde, melez bir kalıtım haline gelir.
Java'nın sınıfları kullanarak yalnızca tek, çok düzeyli ve hiyerarşik miras türlerini desteklediğini unutmayın. Java, sınıflarla çoklu ve hibrit kalıtımı desteklemez.
Şimdi her bir kalıtım türünü programlama örnekleriyle ayrıntılı olarak tartışacağız.
Java'da Tek Kalıtım
Tek bir miras aşağıda gösterildiği gibi tasvir edilmiştir:
Burada bir alt sınıf, tek bir üst sınıftan miras alır. Bu tek mirastır. Köpek gibi herhangi bir hayvan, Hayvan türlerinden miras alır. Bu, miras almanın en basit şeklidir.
Aşağıda, Tek Kalıtımı açıklayan bir Java programı verilmiştir.
//base class:Animal class Animal { void Action_eat() { System.out.print('eating...'); } } //derived class:Dog class Dog extends Animal { void Action_bark() { System.out.print('barking...'); } } class Main{ public static void main(String args()){ Dog d=new Dog(); //create an object of derived class System.out.print('The dog is '); d.Action_bark(); //call derived class method System.out.print('
The dog is '); d.Action_eat(); //call base class method } }
Çıktı:
Burada, Hayvan türlerinde ortak olan temel Animal sınıfında eat (Action_eat) yöntemimiz var. Animal sınıfından türetilmiş bir köpek sınıfımız var. Köpek sınıfında, Köpek türlerine özel bir yöntemimiz var, havlama (Action_bark).
Daha sonra ana yöntemde bir Dog nesnesi oluşturuyoruz ve Dog sınıfı Animal sınıfını miras aldığından, bu nesne hem eat hem de bark yöntemini çağırabilir.
Java'da Çok Düzeyli Kalıtım
Çok düzeyli kalıtımda, bir miras zincirimiz var. Bu, türetilmiş bir sınıf tarafından miras alınan bir ebeveyn sınıfımız olduğu anlamına gelir. Türetilmiş sınıf, başka bir sınıfa ebeveyn olarak davranır ve böyle devam eder.
Çok seviyeli kalıtım aşağıdaki gibi temsil edilebilir:
Yukarıdaki şekilde görüldüğü gibi, B Sınıfı A Sınıfından miras kalan bir A sınıfı ebeveyn vardır. Sonra, B Sınıfından miras alan başka bir C sınıfı vardır. Böylece, bir kalıtım zinciri oluşturduğunu görebiliriz. Burada B sınıfı, A ve C sınıflarını birbirine bağlayan bir ara sınıf haline gelir.
Aşağıdaki Hayvan sınıfı örneğimizle devam ederek, Hayvan sınıfından türetilmiş bir Köpek sınıfımız olabilir. O zaman Dog sınıfından türetilmiş bir yavru köpek olan başka bir Puppy sınıfına sahip olabiliriz. Bu şekilde çok düzeyli mirasa sahip olabiliriz.
Çok Düzeyli Devralma için örnek bir program aşağıda gösterilmiştir.
import java.util.*; import java.lang.*; import java.io.*; //parent class A class A { public void print_A() { System.out.print('SoftwareTestingHelp '); } } //Derived class B - intermediary class B extends A { public void print_B() { System.out.print('Java Series '); } } //Derived Class C class C extends B { public void print_C() { System.out.print('Tutorials'); } } public class Main { public static void main(String() args) { C c_obj = new C(); //create Class C obj c_obj.print_A(); //call grandparent class method c_obj.print_B(); //call parent class method c_obj.print_C(); //call member method } }
Çıktı:
Yukarıda gösterilen tam zinciri programladık. Daha sonra ana yöntemde, C sınıfına ait bir nesne oluşturuyoruz. C sınıfı nesne, daha sonra ebeveyn B'nin ve büyük ebeveyn A'nın yöntemlerine erişebilir.
Java'da Hiyerarşik Kalıtım
Bir sınıf, kendisinden türetilmiş birden fazla sınıfa sahip olabilir. Yani bir temel veya üst sınıfımız ve birden fazla alt sınıfımız var. Bu tür miras, 'Hiyerarşik miras' olarak adlandırılır.
Hiyerarşik miras, aşağıda şematik olarak temsil edilmektedir:
Hiyerarşik kalıtımın bir örneği olarak, Hayvan sınıfını bir üst sınıf olarak temsil edebilir ve daha sonra bundan türetilmiş Kedi, Köpek, İnek gibi birden fazla hayvana sahip olabiliriz.
Aşağıdaki Java programı, Java'daki Hiyerarşik Devralmayı göstermektedir.
//class Parent class Parent { public void print_parent() { System.out.println('In ::Parent class'); } } //child1 class class Child1 extends Parent { public void print_child1() { System.out.println('In ::Child1 class'); } } //child2 class class Child2 extends Parent { public void print_child2() { System.out.println('In ::Child2 class'); } } //child3 class class Child3 extends Parent { public void print_child3() { System.out.println('In ::Child3 class'); } } public class Main { public static void main(String() args) { Child1 ch1 = new Child1(); //create a Child1 class object ch1.print_child1(); //call its member method Child2 ch2 = new Child2(); //create a Child2 class object ch2.print_child2(); //call its member method Child3 ch3 = new Child3(); //create a Child3 class object ch3.print_child3(); //call its member method ch3.print_parent(); //call parent class method with any object } }
Çıktı:
Programdan gördüğümüz gibi bir ebeveyn sınıfımız ve bu ebeveynden türetilmiş üç çocuk sınıfımız var. Ana yöntemde, alt sınıfların her birinin bir nesnesini oluşturuyoruz ve ilgili üye yöntemlerini çağırıyoruz.
Üst sınıfın yöntemlerini çağırmak için, tüm alt sınıf nesnelerini kullanabileceğimize dikkat edin, çünkü hepsinin üst sınıfa erişimi vardır.
Java'da Çoklu Kalıtım
Çoklu kalıtım, bir sınıfın birden fazla sınıftan miras alabileceği, yani bir sınıfın birden fazla ebeveyne sahip olabileceği bir durumdur. Bunu yaparak, sınıf birden fazla üst sınıfa sahip olabilir ve böylece tüm üst sınıflarının özelliklerini ve davranışını elde edebilir.
Çoklu Kalıtımın şematik temsili aşağıda gösterilmiştir:
Yukarıda gösterildiği gibi, aynı anda birden fazla sınıftan bir sınıf türetebiliriz. Bu şekilde türetilmiş sınıf, tüm üst sınıflarının özelliklerini edinecektir. Bu, özellikle miras alınan özellikler aynı olduğunda ciddi belirsizliklere yol açabilir.
Not:Java, sınıfları kullanarak çoklu mirası desteklemez. Ancak, kalıtımla ilgili bir sonraki dersimizde tartışacağımız arayüzleri kullanarak çoklu kalıtımı destekler.
Java, sınıflarla çoklu kalıtımı desteklemediğinden, ayrıntılara girmeyeceğiz. Bununla birlikte, öğreticinin ilerleyen bölümlerinde, Java'nın çoklu kalıtımı desteklememesinin nedenlerini anlamaya çalışacağız.
Java'da Hibrit Kalıtım
Hibrit kalıtım, yukarıda tartıştığımız bir veya daha fazla kalıtım türünün bir kombinasyonudur. Ancak herhangi bir kombinasyon, Java tarafından desteklenmeyen bir tür çoklu kalıtım ile sonuçlanır.
Hibrit bir kalıtım şematik olarak aşağıdaki gibi gösterilebilir.
Dolayısıyla Java, sınıflarla birlikte hibrit kalıtımı da desteklemez. Ancak çoklu kalıtım gibi, arayüzleri kullanarak Java'da hibrit kalıtım uygulayabiliriz. Bunu bir sonraki eğitimimizde ayrıntılı olarak tartışacağız.
Java Neden Çoklu Kalıtımı Desteklemiyor?
Java, programlarda basitliği hedefler. Bu, OOP özellikleri için bile geçerlidir. Dolayısıyla, çoklu kalıtım söz konusu olduğunda, birden fazla sınıftan bir sınıf türettiğimizde bazı belirsiz durumlar ortaya çıkabilir.
Şimdi programımızda birden fazla mirasa sahip olduğumuzda ortaya çıkabilecek sorunları anlayalım.
Aşağıdaki Çoklu Kalıtım sistemlerini düşünün.
Yukarıdaki sistemi görürsek, kendini açıklayıcıdır. Burada A sınıfı ve B sınıfı, C sınıfı tarafından miras alınan iki ebeveynli sınıflardır. Şimdi, hem A hem de B sınıflarının aynı ada sahip bir yönteme, yani print () olduğunu gösterdik. Dolayısıyla, C sınıfı A ve B'yi miras aldığında, print () yönteminin her iki sürümünü de alacaktır.
Bu durumda, C sınıfı hangi yöntemi miras alması gerektiğini bilemeyecektir. Çoklu miras durumunda ortaya çıkan yukarıda bahsettiğimiz belirsiz durum budur.
Bu nedenle, sınıf birden fazla sınıftan miras aldığında Java bir derleyici hatası verir.
Aşağıdaki Java programı bunu gösterecektir.
class A{ void print(){ System.out.println('Class A :: print()'); } } class B{ void print(){ System.out.println('Class B :: print()'); } } class C extends A , B{ //let C inherit from A and B } public class Main { public static void main(String() args) { C cObj = new C(); c.print(); } }
Çıktı:
Çıktıdan görüldüğü gibi, Java derleyicisi, sınıfın iki sınıfı genişlettiğini bulduğunda bir hata verir.
Java, iki sınıfın eşzamanlı olarak miras alınmasına izin vermese de, bize bu sınırlamayı aşmanın bir yolunu sunar. Sınıflar yerine arayüzler kullanarak çoklu kalıtımı simüle edebiliriz. Bunu sonraki eğitimlerimizde tartışacağız.
Elmas Problemi
Çoklu miras, 'Elmas sorunu' olarak adlandırılan bir durumla sonuçlanır.
Aşağıdaki miras sistemine sahip olduğumuzu düşünün.
class Super{ void show(){} } class Sub1 extends super{ void show1(){} } class Sub2 extends super{ void show2(){} } class sample extends Sub1,Sub2{ //Sample class code here }
Bu sistemi şematik olarak aşağıda gösterildiği gibi gösterebiliriz:
Yukarıdaki diyagramdan da görebileceğimiz gibi, tüm kalıtım sistemi bir elmas şeklinde görünür. Bu elmas yapısı nedeniyle belirsizliğe 'Elmas Problemi' adı verilir.
Çoklu kalıtım için daha önce açıklandığı gibi, buradaki belirsizlik, örnek sınıfının kalıtımın bir sonucu olarak elde ettiği show () yönteminin çok sayıda kopyasıdır. Birden fazla yol olduğundan, show () yöntemini gerçekleştirir ve hangi kopyanın devralınacağı konusunda bir belirsizlik vardır.
Çoklu kalıtımda olduğu gibi, elmas sorunu da arayüzler kullanılarak çözülebilir.
Java'da Kalıtım Kuralları
Şimdiye kadar kalıtımın temellerini ve Java'daki kalıtım türlerini gördük, hadi kalıtım içeren uygulamaları geliştirirken uymamız gereken bazı kuralları listeleyelim.
Kural 1: Java, Çoklu Devralmayı desteklemez
Daha önce gördüğümüz gibi, Java herhangi bir biçimde çoklu kalıtımı desteklemez. Bir programda birden fazla miras alma girişiminde bulunulduğunda, Java derleyicisi derleyici hatası verir.
Kural # 2: Java, Döngüsel Devralmaya izin vermez
Bir döngü oluşturmak için kendini miras alan bir sınıfa Döngüsel Miras denir.
Aşağıdaki sınıfları, sınıf1 ve sınıf2'yi düşünün.
ücretsiz çevrimiçi anime izlemek için web sitesi
sınıf1, sınıf 2'yi genişletir {}
sınıf2, sınıf 1'i genişletir {}
Yukarıdaki durum bir döngü oluşturur. Java'da buna izin verilmez.
Kural 3: Özel veri üyelerini devralamayız
Özel erişime sahip üyelerin devralınamayacağını 'Erişim değiştiriciler' konusunda zaten öğrendik.
Kural 4: Yapıcılar miras alınmaz
Oluşturucular, sınıf nesneleri oluşturmak için kullanıldığından, bir sınıftan diğerine miras alınmazlar.
Kural 5: Alt nesnelere erişmek için ebeveyn referansını kullanabiliriz
Zaten çeşitli miras örnekleri gördük. Üst sınıf türünde bir referans oluşturabilir ve ardından buna new anahtar sözcüğü kullanılarak oluşturulmuş türetilmiş bir sınıf nesnesi atayabiliriz.
Süper bir üst sınıfsa ve alt sınıf süperden türetilmişse aşağıda gösterildiği gibi.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Kural # 6: Türetilmiş kuruculardaki super () nedeniyle üst yapıcılar çalıştırılır
Kurallardan biri, kurucuların miras alınamayacağını belirtir. Ancak üst sınıfın kurucusu, türetilmiş sınıfın yapıcısı içinde super () çağrısı kullanılarak çalıştırılabilir.
Sıkça Sorulan Sorular
S # 1) Hangi kalıtım türü Java tarafından desteklenmez?
Cevap: Java, elmas problemi gibi uygulamalarda sorunlara yol açabileceğinden çoklu kalıtımı desteklemez. Java ayrıca, bir veya daha fazla kalıtım türünün bir kombinasyonu olduğu ve sonuçta birden çok kalıtıma dönüşebileceği için hibrit kalıtımı desteklemez.
S # 2) Sınıfın hangi üyelerinden miras alınabilir?
Cevap: Bir sınıf, temel sınıfının genel ve korumalı üyelerini devralabilir, ancak temel sınıfın özel üyelerine erişemez.
S # 3) Çoklu Devralmaya neden izin verilmiyor?
Cevap: Birden çok kalıtım, iki üst sınıfın aynı prototipe sahip yöntemlere sahip olması durumunda belirsizliğe neden olur. Bu durumda, türetilmiş sınıf, yöntemi hangi temel sınıftan miras alması gerektiği konusunda bir belirsizlikle karşı karşıyadır.
Çoklu kalıtım, Java'da bir elmas sorununa da neden olabilir. Dolayısıyla Java, çoklu mirası desteklemez.
S # 4) Neden Çoklu Kalıtıma ihtiyacınız var?
Cevap: Java ve C # gibi diller, birden çok arayüz kullanarak çoklu kalıtımı zorlar. Bu nedenle, özellikleri birden fazla arayüzden miras almamız gerektiğinde, birden fazla kalıtıma ihtiyacımız var.
S # 5) Çok Düzeyli Devralmanın başlıca kullanımı nedir?
Cevap: Başka bir sınıftan türetilen ve üçüncü bir sınıftan türetilen bir sınıfın, çok düzeyli kalıtım sergilediği söylenir. Bu tür kalıtımdaki seviyeler, açıklığı ve basitliği koruduğu sürece herhangi bir sayıya genişletilebilir.
Çok düzeyli kalıtım kullanarak farklı tür düzeylerini tasvir edebiliriz. Programlama bakış açısından, çeşitli düzeylerde uygulama sınıflarını temsil etmek istediğimizde, çok düzeyli kalıtıma geçiyoruz.
Sonuç
Bu eğitimde, Java'daki kalıtım türlerini tartıştık. Java yalnızca Tek, Çok Düzeyli ve Hiyerarşik kalıtım türlerini destekler. Java, Çoklu ve Karma kalıtımı desteklemez. Java'daki Çoklu kalıtım belirsizliği ve Elmas problemini tartıştık.
Daha sonra Java'da kalıtımı uygularken uymamız gereken çeşitli kuralları tartıştık. Bununla, Java'daki IS-A ilişkisi konusundaki tartışmamızı tamamladık.
=> Basit Java Eğitim Serisine Buradan Dikkat Edin.
Önerilen Kaynaklar
- Java'da Kalıtım Nedir - Örneklerle Eğitim
- C ++ 'da Kalıtım
- C ++ 'da Kalıtım Türleri
- Java Temelleri: Java Sözdizimi, Java Sınıfı ve Temel Java Kavramları
- Java Tamsayı ve Örneklerle Java BigInteger Sınıfı
- Java'da Sınıf Türleri: Soyut, Somut, Son, Statik
- Java Değişkenleri ve Türleri Örneklerle
- Örneklerle Java Tarayıcı Sınıfı Eğitimi