Paylaşım , Takip İçin
Kalıtım/Miras Nedir?
- Kalıtım, mevcut sınıflardan yeni bir sınıf türetmeye denir.
- Türetilen bu yeni sınıflar, türetildiği sınıfa ait özelliklere sahip olur.
- Fakat bunun tam tersi doğru değildir. Yani üst sınıf, alt sınıfın tüm özelliklerine sahip olmayabilir.
- Java’da kalıtım yapmak için kullandığımız anahtar kelime extends dir.
- Kalıtım gerçek hayatta karşılaştığımız problemlerin modellenmesinde bize büyük kolaylık sağlamaktadır.
- Şimdi Kisi adında bir sınıfımız olsun ve bu sınıftan Ogrenci adında bir alt sınıf türettiğimizi düşünelim.
Kisi.java - Ogrenci.java
public class Kisi {
private String adSoyad;
private String dogumTarihi;
private char cinsiyet;
public void yaz() {
System.out.println("Kisi Sınıfı");
}
public class Ogrenci extends Kisi {
private int ogrNo;
private String bolum;
@Override
public void yaz() {
System.out.println("Ogrenci Sınıfı");
}
- Yukarıdaki örnek üzerinde de görülebileceği gibi Ogrenci sınıfı Kisi sınıfından türetilmiştir.
- Bu iki sınıftan birer nesne oluşturularak bu nesnelere yaz() metodu çalıştırıldığında ekranda ilgili sınıfın metodu çalışacaktır.
Üye Erişimleri
- Her ne kadar altsınıf süper sınıfın tüm üye değişken ve metotlarına erişebilse de, private olarak tanımlanan üyelere erişemez.
- Bu noktada private olarak tanımlanan değişkenlere erişebilmek için getter/setter metotlarının yazılması gerekir.
- Bir sonraki örnekte görülebileceği gibi Kisi sınıfındaki üye değişkenlere alt sınıftan değer atamak için getter/setter metotları tanımlanmıştır.
Örnek
public class Kisi {
private String adSoyad;
private String dogumTarihi;
private char cinsiyet;
public Kisi() {
this.adSoyad="";
this.dogumTarihi="";
this.cinsiyet=' ';
}
public String getAdSoyad() {
return adSoyad;
}
public void setAdSoyad(String adSoyad) {
this.adSoyad = adSoyad;
}
public String getDogumTarihi() {
return dogumTarihi;
}
public void setDogumTarihi(String dogumTarihi) {
this.dogumTarihi = dogumTarihi;
}
public char getCinsiyet() {
return cinsiyet;
}
public void setCinsiyet(char cinsiyet) {
this.cinsiyet = cinsiyet;
}
Super Class ve Sub Class
- Bir super sınıfa ait birden fazla alt sınıf tanımlanabilir.
- Fakat bir alt sınıf birden fazla super sınıftan türetilemez.
public class Ogrenci extends Kisi
- Bu ifadeye baktığımızda Kisi sınıfı süper sınıf, Ogrenci sınıfı ise bu sınıftan türetilen alt sınıf olarak anlaşılmalıdır.
- Örneğin Kişi sınıfından bir sınıf daha türetelim:
public class Personel extends Kisi
Personel.java
public class Personel extends Kisi {
private int sicilNo;
private String birim;
private String unvan;
private long dahiliTel;
public Personel(String adSoyad, String dogumTarihi, char cinsiyet,
int sicilNo, String birim, String unvan, long dahiliTel) {
super(adSoyad, dogumTarihi, cinsiyet);
this.sicilNo = sicilNo;
this.birim = birim;
this.unvan = unvan;
this.dahiliTel = dahiliTel;
}
//Getter/setter metotlarının ekleneceği yer.
}
super() Metodu ile Üst Sınıfın Yapılandırıcısını Çağırmak
- super() metodu özel bir metottur ve bir üst sınıfın üye değişken ve yapılandırıcılarına erişmek için kullanılır.
- Eğer süper sınıfa ait birden fazla yapılandırıcı metot varsa, yani yapılandırıcı metotlar aşırı yüklenmişse, bu durumda gönderilen parametrelerin tip ve sayısına göre hangi yapılandırıcı metodun çağırılacağı belirlenir.
- Personel.java içerisinde kullanılan super metodu.
super(adSoyad, dogumTarihi, cinsiyet);
- Yukarıda verilen kod üst sınıfa ait aşağıdaki yapılandırıcı metodu çağıracaktır.
public Kisi(String adSoyad, String dogumTarihi, char cinsiyet)
Yapılandırıcıları Bindirmek
- Bazı durumlarda bir üst sınıfa ait bir nesne kullanarak yapılandırıcı metotlar üst üste bindirilebilir
- this anahtar kelimesi bulunduğu sınıfı referans gösterir.
- super anahtar kelimesi ise bir üst sınıfa ait referansı döndürmektedir.
- Bunu bir Örnek ile gösterelim.
Örnek
public Ogrenci(String adSoyad, String dogumTarihi, char cinsiyet,int ogrNo,String bolum) {
super(adSoyad, dogumTarihi, cinsiyet);
this.ogrNo=ogrNo;
this.bolum=bolum;
}
public Ogrenci(Kisi obj,int ogrNo, String bolum)
{
super(obj);
this.ogrNo=ogrNo;
this.setBolum(bolum);
}
public Ogrenci(Ogrenci obj)
{
super(obj.getAdSoyad(),obj.getDogumTarihi(),obj.getCinsiyet());
this.setOgrNo(obj.ogrNo);
this.bolum=obj.getBolum();
}
Metotların Devre dışı Bırakılması (Overriding)
- Java’nın Çok Biçimlilik (Polymorphism) bunun iki yolunun olduğunu söylemiştik bunlar:
- Aşırı Yükleme (Overloading)
- Devre Dışı Bırakma (Overriding)
- Java’da bindirilmiş bir metot çağrıldığında, hangi metodun seçileceğini parametre sayısı ve tipi belirler.
- Metotların Aşırı Yüklenmesi (Overloading) kavramını daha önce anlatmıştık.
- Eğer bir sınıf, türetildiği sınıftaki bir metodu değiştiriyorsa buna overriding denir ve üst sınıfa ait aynı adlı metot devre dışı kalır.
Örnek
public class Kisi {
private String adSoyad;
private String dogumTarihi;
private char cinsiyet;
public void yaz() {
System.out.println("Kisi Sınıfı");
}
public class Ogrenci extends Kisi {
private int ogrNo;
private String bolum;
public Ogrenci(Kisi obj,int ogrNo, String bolum) {
super(obj);
this.ogrNo=ogrNo;
this.setBolum(bolum);
}
@Override
public void yaz() {
System.out.println("Ogrenci Sınıfı");
}
- Verilen Örnek içerisinde hem Kisi sınıfında hem de bu sınıftan türetilen Ogrenci alt sınıfında yaz metodu tanımlanmıştır.
- Metotlara dikkatlice bakıldığında her iki metotta parametre almamaktadır.
- Fakat Ogrenci sınıfı altında tanımlanan yaz() metodu üst sınıfta bulunan yaz() metodunu devre dışı bırakmaktadır.
- Overriding işlemi gerçekleştiğinde Java’da bu işlemin gerçekleştiğini belirtmek için metottan önce “@Override” dipnotu(Annotation) kullanılabilir.
- Eğer alt sınıf içerisinde bir yaz() metodu tanımlanmamış olsaydı, üst metoda ait yaz() metodu alt sınıf için otomatik olarak çalışacaktı.
Object Sınıfı
- Object sınıfı Java’da sıklıkla kullanılan bir sınıftır.
- Java’da oluşturduğunuz tüm sınıflar Object sınıfının bir alt sınıfı olarak Kabul edilebilir.
- Diğer sınıflardan oluşturulmuş nesneleri Object Sınıfına dönüştürürken herhangi bir tip dönüşümü (type casting) ifadesi yazmanıza gerek yoktur.
Kisi obj=new Kisi(“Osman Arda”, “01/01/1995”, ‘E’);
Object o=obj; //Object türünden bir nesneye casting
instance of Anahtar Kelimesi
- Bu anahtar Kelime genellikle Object tipindeki bir nesnenin hangi sınıfın nesnesi(Örneği) oluğunu bulmak için kullanılır.
Kisi obj=new Kisi("Osman Arda", "01/01/1995", 'E');
Object o=obj;
if(o instanceof Kisi) {
Kisi k=(Kisi)o;//Kisi sınıfına Casting gerçekleşir.
}
- Yukarıda verilen örneğe dikkat edildiğinde Object türündeki o nesnesinin Kisi sınıfının bir örneği olup olmadığına bakılır.
Object Örneği
public class objectClass {
public static void main(String[] args) {
Kisi obj=new Kisi("Osman Arda", "01/01/1995", 'E');
Object o=obj;//Object türünden bir nesneye casting
//instance of nesnenin tipini sorgular.
if(o instanceof Kisi) {
Kisi k=(Kisi)o;//Kisi sınıfına Casting gerçekleşir.
System.out.println(k.getAdSoyad());
System.out.println(k.getDogumTarihi());
System.out.println(k.getCinsiyet());
}
}
}
Paylaşım , Takip İçin