nesne yÖnelİmlİ programlama – hafta # 1...nesne yÖnelİmlİ programlama – hafta # 7...

68
NESNE YÖNELİMLİ PROGRAMLAMA – HAFTA # 7 Yrd.Doç.Dr.Hacer Karacan

Upload: others

Post on 30-Jan-2021

12 views

Category:

Documents


0 download

TRANSCRIPT

  • NESNE YÖNELİMLİ PROGRAMLAMA – HAFTA # 7

    Yrd.Doç.Dr.Hacer Karacan

  • İçerik

    • Sarma (Encapsulation)

    ▫ “Default” Erişim

    ▫ “Public” Erişim

    ▫ “Private” Erişim

    ▫ “Protected” Erişim

    • Erişim Düzeyleri Sıralaması

    • Kalıtım (Inheritance)

    • Çok Biçimlilik (Polimorfizm)

    • Soyut Sınıflar

    • Soyut Metodlar

    • Arayüzler

  • Sarma (Encapsulation)

    • Neden?

    ▫ Bilgi saklama

    ▫ Kullanıcıyı gereksiz detaylardan uzak tutma

    ▫ Oluşabilecek hataları önleme

    • “Kendimizi kendimizden korur!"

  • Sarma (Encapsulation)

    • Her sınıf çeşitli üyelerden (özellikler & metodlar) oluşur.

    • Bazı özellikler ve metodların ait olduğu sınıf’ın dışında erişimini sınırlama özelliğine 'encapsulation' (sarma/kapsülleme) denir.

    • Encapsulation sağlamak için “private”, “public” ve “protected” sözcükleri kullanılır.

    ▫ Bunlara erişim modifier (erişim belirleyici) denir. Hiç birini kullanmamak ta belli bir tercih anlamına gelir.

  • Erişim Belirleyiciler

  • Friendly (Default) Erişim

    • Hiç bir erişim belirleyici kullanılazsa, bu üye ’package private' olur.

    • Ona sadece aynı paketteki diğer sınıf’lar erişebilir, diğer paketlerdekiler erişemez.

  • Public Erişim

    • Sistemdeki bütün sınıfların erişebilmesini sağlamak için ’public' erişim belirleyicisi kullanılır.

    • Bu belirleyici özellikle başkaları erişsin diye yazılan özellik ve metodlar için kullanılır.

    • Bir nesnede ne kadar az “public” değişken varsa dışarıya o kadar sade görünür ve o kadar kolay kullanılır.

  • Private Erişim

    • Bir özellik veya metodun sadece tanımlandığı sınıftan erişilebilmesini, başka bir deyişle, o sınıf dışındaki bütün sınıflardan (aynı paket’de olsalar bile) erişiminin yasaklanmasını sağlamak için ’private' anahtar kelimesi kullanılır.

    ▫ Değişkenler ve metodlar için private belirleyicisi kullanılabilir. Sınıflar private olarak tanımlanamaz.

    • Bir değişkenin dışarıdan görülebilmesini ancak değiştirilememesini veya değiştirme işleminin sınıfın kontrolünde yapılmasını sağlamak için standart bir yöntem izlenir.

    ▫ Bir özelliği read-only (salt okunur) yapmak için, o özellik “private” yapılır.

    ▫ Ona erişmek için bir tane public metod yazılır. Bu şekilde dışarından özelliklerinin değerleri dolaylı olarak öğrenilmiş olur.

  • Örnek

    Bu sınıftan yaratılmış bir nesne’yi kullanan örnek yapalım.

    Buradaki value private olduğu için

    int v=d.value;

    yazarsak derleyici hata verir. (özellik orada olduğu halde artık erişilmez hale gelmiştir.)

    Ama değeri öğrenmek için getValue() metodu kullanılabildiği için programın

    işleyişini bozmaz. Biz bu değeri değiştirmek istersek :

    d.value=5;

    derleyici yine hata verecektir. (Bu şekilde sınıf kendi özelliğini korumuş oluyor.)

    public sınıf MyDiscreteUsersınıf{

    public static void main(){

    MyDiscreetsınıf d=new MyDiscreetsınıf();

    int v=d.getValue();

    System.out.println("Value : "+v);

    }

    }

    public sınıf MyDiscreetsınıf{

    private int value=3;

    public int getValue(){

    return value;

    }

    }

  • Örnek Bir değişkenin hem okunması hem de değiştirilmesi istenip sadece bunun kontrollü bir şekilde yapılmasını istersek yine özelliği private tutarız ve hem erişebilmek için hem de değiştirebilmek için iki ayrı metod yazarız.

    Bu değeri değiştirip sonra yeni değeri alan bir program yazalım.

    public sınıf MyControlledUsersınıf{

    public static void main(){

    MyControlledsınıf d=new MyControlledsınıf();

    d.setValue(-7);

    int v=d.getValue();

    System.out.println("Value : "+v);

    }

    }

    public sınıf MyControlledsınıf{

    private int value=3;

    public int getValue(){

    return value;

    }

    public void setValue(int v){

    if(v>0){

    value=v;

    }else{

    value=-v;

    }

    }

    }

    Bir değerin

    eksi

    olmamasını

    sağlayan

    bir sınıf

  • Protected Erişim

    • Bazı durumlarda bir özellik veya metodun dışarıya kapalı olması ancak o sınıftan türeyenlere açık olması istenebilir.

    • Bu durumda 'protected' erişim belirleyicisi kullanılır.

    • Bu anahtar sözcük, belli bir özellik veya metodun sadece ondan türetilen sınıfları ilgilendirmesi durumunda kullanılır.

    • Sınıf üyelerine aynı paket içindeki sınıf ve metodlardan, farklı paketten kalıtım yolu ile oluşturulmuş alt sınıflardan erişilebileceğini gösterir.

    • Değişkenler ve metodlar için protected belirleyicisi kullanılabilir. Sınıflar protected olarak tanımlanamaz.

  • Protected Erişim

    • Bir sınıf türediği sınıfın bütün public özelliklerine erişebilir hale gelir.

    ▫ Zaten bunlara her sınıftan erişilebilmektedir.

    ▫ Hiçbir private özellik türetilen sınıfa geçmez.Bunlar diğer bütün sınıflara da kapalıdır.

    ▫ Ancak protected özellik ve metodlar dışarıya kapalı oldukları halde, türetilen sınıf bunlara erişim hakkına sahiptir.

    • Erişim belirleyici olarak “protected” verilmiş özellik veya metodlara o sınıfla aynı paket içerisinde bulunan bütün sınıflar tarafından da erişilebilir.

  • Erişim Düzeyleri Sıralaması

    • Sarma / Kapsülleme düzeyleri için

    public > protected > friendly > private

    şeklinde bir sıralama yapılır.

    • Büyük olan düzey küçük olanların haklarını da kapsar.

    • Bir özelliğin “public” olup “private” özelliği içermemesi, yani tanımlandığı sınıftan erişilemez ama onun dışındaki bütün sınıflardan erişilir gibi bir duruma sahip olması söz konusu olamaz.

  • private değişkenlere erişim

    Özel değişkenlere (private) ulaşılması gerektiğinde erişim (accessor) metodu (get), özel değişkenleri değiştirmek gerektiğinde değiştirici (mutator) metodu (set) kullanılır.

    Erişim ve değiştirici metotlar diğer sınıfların ve nesnelerin erişebilmesi için public tanımlanır.

    Erişim metodu adı getDegiskenAdı() şeklinde

    tanımlanmalıdır.

    Değiştirici metodu adı setDegiskenAdi() şeklinde

    tanımlanmalıdır.

  • set ve get metotları

    Set metodu: Değişkenin değerini değiştirmek için kullanılır.

    Get metodu: Değişkenin değerine ulaşmak için kullanılır.

    Metot isimlerinde set ve get kullanılması zorunlu değildir. (Örneğin yaz ve oku kullanılabilir.) public void setDegisken(int sayi) { privateDegisken = sayi; } public int getDegisken() { return privateDegisken; }

  • set ve get metotları – örnek

    public class BankaHesabi3

    {

    private double hesapBakiyesi;

    public void setHesapBakiyesi(double Miktar)

    {

    hesapBakiyesi = Miktar;

    }

    public double paraCek(double cekilenMiktar)

    {

    double bakiye = hesapBakiyesi;

    bakiye -= cekilenMiktar;

    if(bakiye < 0.0)

    System.out.println("Yetersiz bakiye...");

    else

    hesapBakiyesi = bakiye;

    return hesapBakiyesi;

    }

  • set ve get metotları – örnek

    public double getHesapBakiyesi()

    {

    return hesapBakiyesi;

    }

    }

    import java.util.Scanner;

    public class deneBankaHesabi

    {

    public static void main(String [] args)

    {

    Scanner klavye = new Scanner(System.in);

    double kalan, miktar;

    BankaHesabi3 hesap = new BankaHesabi3();

  • set ve get metotları – örnek

    System.out.print("Hesabinizdaki para: ");

    kalan = klavye.nextDouble();

    System.out.print("Cekilecek para: ");

    miktar = klavye.nextDouble();

    hesap.setHesapBakiyesi(kalan);

    kalan = hesap.paraCek(miktar);

    System.out.println("Yeni bakiye= "+kalan);

    hesap.setHesapBakiyesi(kalan*1.1);

    kalan = hesap.getHesapBakiyesi();

    System.out.println("Yeni bakiye= "+kalan);

    }

    }

    Çıktı:

    Hesabinizdaki para: 10000

    Cekilecek para: 400

    Yeni bakiye= 9600.0

    Yeni bakiye= 10560.0

  • set ve get metotları

    setHesapBakiyesi() ve getHesapBakiyesi() metotları

    genel erişimli (public) oldukları için sınıf dışından çağrılarak ilgili değişken alanının okunması ve değiştirilmesi işlemleri yapılabilir.

    Her değişken için bu metotların yazılması zorunlu ve gerekli değildir.

    Tasarımcının kararına göre değişkenlere bu erişim hakkı verilebilir.

  • set ve get metotları – örnek

    public class KesirliSayi

    {

    private int pay;

    private int payda;

    public void setSayi(int pay1, int pay2)

    {

    pay = pay1;

    payda = pay2;

    }

    public int getPay()

    {

    return pay;

    }

    public int getPayda()

    {

    return payda;

    }

  • set ve get metotları – örnek

    public KesirliSayi topla(KesirliSayi sayi1)

    {

    KesirliSayi sayi2 = new KesirliSayi();

    sayi2.pay = sayi1.pay * payda + pay * sayi1.payda;

    sayi2.payda = sayi1.payda * payda;

    return sayi2;

    }

    public void yazdir()

    {

    System.out.println(pay + "/" + payda);

    }

    }

  • set ve get metotları – örnek

    import java.util.Scanner;

    public class DeneKesirliSayi

    {

    public static void main(String[] args)

    {

    int pay1, pay2, payda1, payda2;

    KesirliSayi ilkSayi = new KesirliSayi();

    KesirliSayi ikinciSayi = new KesirliSayi();

    KesirliSayi sayilarToplami;

    KesirliSayi sonSayi = new KesirliSayi();

    Scanner klavye = new Scanner(System.in);

    System.out.println("Birinci sayinin pay ve paydasi:");

    pay1 = klavye.nextInt();

    payda1 = klavye.nextInt();

    ilkSayi.setSayi(pay1, payda1);

  • set ve get metotları – örnek

    System.out.println("Ikinci sayinin pay ve paydasi:");

    pay2 = klavye.nextInt();

    payda2 = klavye.nextInt();

    ikinciSayi.setSayi(pay2, payda2);

    sayilarToplami = ilkSayi.topla(ikinciSayi);

    sayilarToplami.yazdir();

    sonSayi.setSayi(7,8);

    sonSayi.yazdir();

    }

    }

    Çıktı:

    Birinci sayinin pay ve paydasi: 10 2

    Ikinci sayinin pay ve paydasi: 10 5

    70/10

    7/8

  • Kuşatma prensiplerine göre iyi bir sınıf oluşturmak

    Sınıf tanımından hemen önce sınıfın, verilerin ve metodların amacını açıklayan bir yorum konmalıdır.

    Bütün sınıf değişkenleri “private” olarak tanımlanmalıdır.

    Diğer sınıflar ve programlar tarafından değerlerinin değiştirilmesi veya atanması gerekebilecek değişken ve metotlar için erişim ve değiştirici (get,set) metotları oluşturulmalıdır.

    Bütün public metotların başında metot hakkında bilgi veren kısa bir açıklama bulunmalıdır.

    Sınıf içinde kullanılan, dışarıdan erişilmeyecek metotlar “private” olarak tanımlanmalıdır. Bunlara yardımcı metotlar denir ve yalnızca sınıf içinde tanımlı diğer metotlar tarafından kullanılırlar.

  • Kalıtım (Inheritance)

  • Java’da Kalıtım

    • Bir sınıfın diğerindeki özellikleri miras olarak alması için kullanılan anahtar sözcük ’extends' dir.

    • Anlam olarak "Bu sınıf şu sınıfı genişletir” yani “ondaki özellik ve metodları alır ve yenilerini ekler" demektir.

  • Java’da Kalıtım

  • EKRAN ÇIKTISI

    Hayvan SINIFI YAPICISI

    DortAyakli SINIFI YAPICISI

    Otcul SINIFI YAPICISI

  • Superclass Yapılandırıcısı

    • Miras alınan sınıf Superclass

    • Miras alan sınıf Subclass

    • Herbir subclass, superclass olma adayıdır.

    • Subclass’ın bir üstündeki sınıf Direct Superclass

    ▫ Diğer superclass’lar Indirect Superclass

  • • Hiyerarşide üst sınıflara çıkıldıkça, en üst sınıftan aşağıya doğru tüm yapılandırıcılar çalışmakta fakat değerleri aktarılmamaktadır.

    • Bir sınıftan türeyen sınıfın yapılandırıcısı türediği sınıfın yapılandırıcısını 'super()' şeklinde çağırabilir.

    • Bu şekilde super class’a veri aktarılmış olur.

    Super Deyimi

  • • Ucgen sınıfından bir nesne 3 parametre alan yapıcı metodu ile oluşturulduğunda ilk 2 parametre ana sınıftaki yapılandırıcıya aktarılmış, böylece Sekil sınıfından türetilen nesnelerin ortak özelliği olan Taban ve Yuksekliği türeyen sınıfın içinde tekrar bildirme zorunluluğu ortadan kaldırılmıştır.

  • Superclass Yapılandırıcısı

    • Java’da (C++ ‘da desteklenen) çoklu kalıtım (multiple inheritance) desteklenmez.

    • Bir subclass’ın ancak bir tane direct superclass’ı olabilir.

    • Çoklu kalıtım yerine çoklu arayüz (multiple interface) kullanımı mevcuttur.

    • Üzerine yazma /çeşitleme (overriding) sayesinde türeyen sınıflarda miras alınan metodlar ihtiyaçlara göre değiştirilebilir.

  • Aşağıda temel bir sınıf olarak Tasit oluşturulmuştur.

    public class Tasit

    {

    private String isim;

    public Tasit()

    {

    isim = " ";

    }

    public Tasit(String ilkIsim)

    {

    isim = ilkIsim;

    }

    public void setIsim(String yeniIsim)

    {

    isim = yeniIsim;

    }

    public String getIsim()

    {

    return isim;

    }

  • Tasit sınıfı - devam

    public void ciktiYaz()

    {

    System.out.println("Isim: " + isim);

    }

    public boolean ayniIsim(Tasit digerTasit)

    {

    return (this.isim.equalsIgnoreCase(digerTasit.isim));

    }

    }

  • Alt Sınıflar

    Bir sınıf kullanılarak yeni sınıflar oluşturulabilir. Tasit sınıfı kullanılarak Otomobil sınıfı oluşturulmuştur.

    public class Otomobil extends Tasit{

    private int plakaNo;

    public Otomobil()

    {

    super();

    plakaNo = 0;

    }

    public Otomobil(String marka, int plakaNumarasi)

    {

    super(marka);

    plakaNo = plakaNumarasi;

    }

  • Otomobil sınıfı - devam

    public void reset(String yeniMarka, int yeniPlakaNumarasi)

    {

    setIsim(yeniMarka);

    plakaNo = yeniPlakaNumarasi;

    }

    public int getOtomobilPlakasi()

    {

    return plakaNo;

    }

    public void setPlakaNumarasi(int yeniPlakaNumarasi)

    {

    plakaNo = yeniPlakaNumarasi;

    }

  • Otomobil sınıfı - devam

    public void ciktiYaz()

    {

    System.out.println("Marka: " + getIsim());

    System.out.println("Plaka Numarasi: " + plakaNo);

    }

    public boolean equals(Otomobil digerOtomobil)

    {

    return (this.ayniIsim(digerOtomobil)

    && (this.plakaNo == digerOtomobil.plakaNo));

    }

    }

  • Aşağıdaki örnekte Tasit ve Otomobil sınıflarının

    kullanımı görülmektedir.

    public class KalitimDemo

    {

    public static void main(String[] args)

    {

    Otomobil c = new Otomobil();

    c.setIsim("Fiat");

    c.setPlakaNumarasi(1234);

    c.ciktiYaz();

    }

    }

    Çıktı:

    Marka: Fiat

    Plaka Numarası: 1234

  • Metot Tanımlarının Yeniden Yapılması

    Eğer hem temel sınıf hemde türetilen sınıfta aynı metot oluşturulmuşsa alt sınıf nesneleri kendi sınıflarına ait metodu kullanır.

    Önceki örnekte hem Tasit sınıfı hemde Otomobil sınıfı ciktiYaz() isimli metoda sahiptir. Her nesne kandi sınıfına ait

    metodu kullanır.

    Bir metot alt sınıfta tanımlanırken içeriği ve başlık kısmındaki parametereler istenildiği gibi değiştirilebilir.

    Bu yaklaşım, aynı isimle çok sayıda metot oluşturmaya yarayan metot fazladan yüklemeden farklıdır.

  • Metot Tanımlarının Yeniden Yapılması

    Eğer bir metodun alt sınıflarda değiştirilmesi istenmiyorsa aşağıdaki gibi tanımlanmalıdır.

    public final void metotAdi()

    Türetilmiş sınıflardan temel sınıflarda private olan üyeye erişim engellenmiştir.

    Alt sınıfta oluşturulan yeni bir metot, temel sınıfta private tanımlanmış olan bir üyeye erişemez.

  • Alt Sınıflarla Programlama Yaklaşımları

    Bir alt sınıf içindeki bir metodun çağırılması için this anahtar kelimesi

    kullanılmalıdır.

    public Otomobil(String ilkIsim)

    {

    this (ilkIsim, 1234);

    }

    Bu durumda Otomobil sınıfındaki

    public Otomobil(String marka, int plakaNumarasi)

    metodu çağırılmış olur.

    Bir alt sınıf içinde temel sınıfın metodu

    super.ciktiYaz();

    şeklinde çağırılabilir.

  • Alt Sınıflarla Programlama Yaklaşımları

    Önceki örnekte çiktiYaz() metodu aşağıdaki gibi yapılandırılabilir.

    public ciktiYaz()

    {

    super.ciktiYaz();

    System.out.println(“Plaka Numarası: ” + plakaNo);

    }

    Bu durumda önce Tasit sınıfındaki ciktiYaz() metodu çalışacak ardından Otomobil sınıfındaki işlemler yapılacaktır.

  • Birden Fazla Seviyeli Kalıtım

    Otomobil sınıfından bir alt sınıfı olarak Sedan adlı bir sınıf

    oluşturulmuş olsun.

    Yeni oluşturulan Sedan alt sınıfı hem Otomobil sınıfının hemde Tasit sınıfının metotlarını kullanabilecektir.

  • Örnek - Sedan - devam

    public class Sedan extends Otomobil

    {

    private int fiyat;

    public Sedan()

    {

    super();

    fiyat = 10000;

    }

    public Sedan(String marka, int plakaNo, int ilkFiyat)

    {

    super(Marka, plakaNo);

    setFiyat(ilkFiyat);

    }

  • Örnek - Sedan - devam

    public void reset(String yeniMarka,int yeniPlakaNo,int

    yeniFiyat)

    {

    reset(yeniMarka,yeniPlakaNo);

    setFiyat(yeniFiyat);

    }

    public getFiyat()

    {

    return fiyat;

    }

    setFiyat(int yeniFiyat)

    {

    fiyat = yeniFiyat;

    }

  • Örnek - Sedan - devam

    public void ciktiYaz()

    {

    super.ciktiYaz();

    System.out.println("otomobil fiyati " + fiyat);

    }

    public boolean equals(Sedan digerSedan)

    {

    return(super.equals(digerSedan)&&(this.fiyat ==

    digerSedan.fiyat));

    }

    }

  • Birden Fazla Seviyeli Kalıtım

    Aşağıdaki nesne kurucusu 3 değişken almaktadır.

    Metot içerisinde, Otomobil ana sınıfına ait nesne kurucusu iki

    parametreyle çağırılmaktadır. public Sedan(String marka, int plakaNo, int ilkFiyat) {

    super(Marka, plakaNo);

    setFiyat(ilkFiyat);

    }

    Sedan sınıfı içindeki reset() metodu 3 parametreye sahiptir ve kendi içinden Otomobil sınıfı içindeki ik parametreye sahip reset()

    metodunu çağırmaktadır. public void reset(String yeniMarka,int yeniPlakaNo,int

    yeniFiyat)

    {

    reset(yeniMarka,yeniPlakaNo);

    setFiyat(yeniFiyat);

    }

  • Örnek – KalitimDemo

    public class KalitimDemo2

    {

    public static void main(String[] args)

    {

    Sedan c = new Sedan("Toyota", 1234, 10000);

    c.ciktiYaz();

    }

    }

    Çıktı:

    Marka: Toyota

    Plaka Numarası: 1234

    Otomobil fiyati 10000

  • Çok Biçimlilik (Polimorfizm)

    • Bir nesnenin davranış şekillerinin duruma göre değişebilmesidir.

    • Eğer birden çok sınıfın ortak kullanacağı bir metod varsa, bu herbirinin temel alacağı bir ana sınıf içerisinde tanımlanabilir.

    ▫ Davranış şekillerindeki farklılıklar her sınıfın kendi yapısı içinde ifade edilir.

    ▫ Örneğin bir selam() metodu ekrana İngilizler için “hello” Almanlar için “hallo” yazdıracak biçimde çeşitlendirilebilir.

  • Bir metodun aynı isimle farklı parametrelerle çağırılmasına çok biçimlilik (polymorphism) denir.

    class Personel

    {

    public void calis();

    {

    System.out.println(“Bu is yerinde farkli insanlar

    calisir”);

    }

    }

    class Sekreter extends Pesonel

    {

    public void calis()

    {

    System.out.println(“Sekreter kadrolardan birisidir”);

    }

    }

  • Örnek – devam

    class Ogretmen extends Pesonel

    {

    public void calis()

    {

    System.out.println(“Ayrica hocalar da vardir”);

    }

    }

    public class CokBicimlilikDemo

    {

    public static void main(String [] args)

    {

    Personel kisi = new Personel();

    Sekreter s = new Sekreter();

    Ogretmen m = new Ogretmen();

    isYap(kisi);

    isYap(s);

    isYap(m);

    }

  • Örnek – devam

    public static void isYap(Personel kisi)

    {

    kisi.calis();

    }

    }

    Programda isYap() metodu farklı parametrelerle

    kullanılabilmektedir.

    Hangi parametrelerle çağırılırsa ilgili metot çağırılarak işlem yapılmaktadır.

    Çıktı:

    Bu is yerinde farkli insanlar calisir

    Sekreter kadrolardan birisidir

    Ayrica hocalar da vardir

  • Arayüz (Interface) Kavramı

    • Java'da arayüz (interface), bir sınıfta olması gereken metod ve özellikleri tanımlayan yapıdır.

    • Kendisi normal bir sınıf değildir, sadece neyin yapılacağını göstermekte, ancak nasıl yapılacağını göstermemektedir.

    • Java’da çoklu kalıtım dahili sınıflar ve arayüzlerle yapılmaktadır.

    • Arayüzler değişkenler ve gövdesiz (soyut) metodlardan oluşur.

    • Arayüzlerin kullanılmasındaki amaç farklı sınıfların, yapış şekilleri farklı dahi olsa aynı işlevleri yerine getirmelerini (polimorfizm) sağlamaktır.

  • Arayüz Oluşturma

    • Arayüz tanımlanırken Class ifadesi yerine Interface ifadesi kullanılır.

    • İçerdiği metodlar gövdesizdir.

    • Bu ifade, 'bir maddenin yoğunluğu, hacmi ve kütlesi olur’ demenin Java’daki yoludur.

    • Maddenin hacmi nasıl hesaplanır, kütlesi nasıl verilir, hiç bir şekilde belirtmemektedir.

    • Sadece ne olması gerektiğini söylemektedir.

    bir madde’de ne gibi işlevler ve özellikler

    olması gerektiğini belirten bir interface

    public interface Matter{ public double getDensity() public double getVolume(); public double getMass(); }

  • Arayüz Uygulaması

    • Bir sınıfın arayüzdeki bütün metodları içerdiğini, gerçekleştirdiğini belirtmesine uygulama (implementation) denir ve 'implements' anahtar kelimesiyle ifade edilir.

    • Burada "Küp/Küre diye bir nesnemiz var ve o bir maddedir, bir maddede olabilecek bütün nitelikler onda da bulunur." demiş olduk ve bunların nasıl hesaplandığını gösterdik.

    public class CubeMatter implements Matter{ public double density=1.0; public double edge=1.0; public double getDensity(){ return density; } public double getVolume(){ return edge*edge*edge; } public double getMass(){ return density*edge*edge*edge; } }

    public class SphereMatter implements Matter{ public double density=1.0; public double radius=1.0; public double getDensity(){ return density; } public double getVolume(){ return (3.14*radius*radius*radius)/3; } public double getMass(){ return density*(3.14*radius*radius*radius)/3; } }

  • Soyut Sınıflar

    • Bazı metodlarını tanımlamış, bazılarının uygulamasını kendisinden türeyen sınıflara bırakmış olan sınıflara soyut sınıf (abstract class) denir.

    • Tüm alt sınıfları tarafından paylaşılacak metodların tanımlarını içeren sınıflardır.

    • Bunun yanında içeriği belirlenmemiş sadece etiketi belli bir yada daha fazla soyut metod içerirler.

    • Soyut sınıftan nesne oluşturulamaz.

    • Mutlaka “extends” anahtar sözcüğü ile yeni sınıflara miras bırakarak kullanılmalıdır.

    • Sınıfın ve metodun soyut olduğunu belirtmek için “abstract” anahtar sözcüğü kullanılır.

  • Soyut Sınıf Oluşturma

    • Sınıfın ve metodun soyut olduğunu belirtmek için “abstract” anahtar sözcüğü kullanılır.

    • Soyut metodlar şu örneklerde belirtildiği gibi gövdeleri olmayacak şekilde tanımlanır:

    public abstract void s1();

    public abstract int s2(int a);

    • Eğer bir sınıf en az bir soyut metod içeriyorsa soyut sınıf olarak tanımlanması gereklidir.

    abstract class N{

    public abstract void s1();

    }

  • Soyut Sınıf Oluşturma

    • Eğer bir altsınıf soyut bir üst sınıftan türetilmiş ve üstsınıfın tüm soyut metodlarını kendi bünyesinde tanımlamamışsa o da bir soyut sınıf olmak zorundadır.

    abstract class N{

    public abstract void s1();

    }

    class N1 extends N{

    public void s1(){System.out.println(“s1) }

    }

    abstract class N2 extends N{

    public void s2(){System.out.println(“s2) }

    }

  • Soyut Sınıflar

    • Soyut sınıfların temel amacı büyük yazılım projelerinin organize bir şekilde geliştirilmelerini sağlamaktır.

    ▫ İlk önce bir soyut sınıf oluşturulur ve yazması planlanan metodlar bu sınıfa soyut şekilde konur.

    ▫ Sonra soyut sınıfların alt sınıfları tanımlanır.

    ▫ Bütün soyut metodların alt sınıflardaki ifadeleri tamamlandığında yazılım tamamlanmış olur.

  • Örnek # 1

    • Bir küp için de bir küre için de kütle, hacim ve yoğunluğun çarpımına eşittir.

    • Ancak önceki örnekte yaptığımız iki nesnede de bu ortak özelliği kullanamıyor ve kütle hesaplamasını kendisi yapılıyor.

    • Matter arayüzünü implement eden ne kadar sınıf varsa bu işlem o kadar tekrarlanacak demektir. Bu 'ortak' işlemi bir kere yapıp, hep onun kullanılmasını sağlamak mümkündür.

  • Örnek # 1(devam) • Soyut Body sınıfı , hem küpün

    hem de kürenin ortak özelliklerini içermektedir.

    • Yoğunluk özelliği ikisinde de ortaktır. Bu şekilde kalıtım yoluyla küp ve küreye geçebilir.

    • getVolume() metodu hacim hesaplamak için her nesne farklı bir method kullandığı için soyut bırakılmıştır.

    • getMass() hesaplaması sınıftan sınıfa değişmediği için tanımlanmıştır

    • Burada getMass() metodu henüz yazılmamış getVolume() metodunu kullanarak bir işlem yapabilmektedir.

    • Bu sadece NYP teknikleriyle mümkün olan bir programlama işlemidir.

    abstract public class Body{ public double density=1.0; public Body(double d){ density=d; } public double getDensity(){ return density; } public double getMass(){ return density*getVolume(); } abstract public double getVolume(); }

  • Örnek # 1(devam)

    • İki sınıf ta getMass() diye bir metod yazmak zorunda kalmadan , hiç bir ek kodlama yapmadan kütle hesabı yapabilmektedir.

    public class CubeBody extends Body{ public double edge=1.0; public CubeBody(double d,double e){ super(d); edge=e; } public double getVolume(){ return edge*edge*edge; } }

    public class SphereBody extends Body{ public double radius=1.0; public SphereBody(double d,double r){ super(d); radius=r; } public double getVolume(){ return (3.14 * radius * radius * radius )/3; } }

  • Örnek # 2 interface Nakliye {

    public void yukle(double yuk) ; public void bosalt(double yuk); }

    Class Ucak implements Nakliye{ double tonaj=80; public void yukle(double yuk){ if(yüktonaj) System.out.println(“Uçaktan boşaltılıyor…”) } }

    Class Gemi implements Nakliye{ double tonaj=10000; public void yukle(double yuk){ if(yüktonaj) System.out.println(“Gemiden boşaltılıyor…”) } }

  • Arayüzle Çoklu Kalıtım Sağlamak

    • Bir altsınıfın sadece bir direk üstsınıfı olabilir.

    • Ancak aynı anda bir sınıfı extend edip bir veya daha fazla arayüzü implement edebilir.

    • ’extends’ anahtar sözcüğünün aksine, ‘implements‘ anahtar sözcüğüyle bir sınıfın aldığı hiç bir şey yoktur. Sadece bazı metodları implement etmeyi taahhüt etmektedir.

  • Arayüzle Çoklu Kalıtım Sağlamak

    Cube sınıfı hem Body sınıfını extend edebilir hem de Matter arayüzünü implement edebilir.

    public class Cube extends Body implements Matter{

    // ...

    }

    Üstsınıf'ın bir arayüzü implement etmesi durumunda altsınıf ta etmiş sayılır.

    public class Body implements Matter{

    // ...

    }

    dersek

    public class Cube extends Body{

    // ...

    }

    dememiz yeterlidir. Cube sınıfı Matter’i implement etmeyi de miras yoluyla almış demektir.

  • Arayüzlerin Kullanım Özellikleri

    • Arayüzler bütün metodları soyut olan bir soyut sınıf gibi düşünülebilirler. Ancak sınıflardan ayrılan başka özellikleri vardır.

    • Ayrıca söylensin veya söylenmesin bütün metod ve özellikler public sayılır ve başlarına protected veya private gibi anahtar sözcükler alamazlar.

    • Arayüzlerde bütün özellikler public, final ve static’tir.

    • O yüzden arayüzlerde tanımlanan özellikler bir veya daha fazla sınıfta kullanılan sabitler için kullanılır.

  • Arayüzlerin Kullanım Özellikleri

    • Circle sınıfında tanımlanmadığı halde PI değişkeni, sadece MathConstants arayüzünü implement ettiği için erişilebilir durumdadır. Bu arayüzü implement eden başka bir sınıf ta aynı şekilde PI’ye erişebilir. Bu anlamda PI bir sabittir.

    • Ama PI sadece implement edilen class'lar tarafından görülmekte olduğundan global değildir.

    • Zaten Java’da global değişken ve sabit ihtiyacı duyulan yerlerde interface kullanılır.

    public interface MathConstants{ double PI=3.14; } public class Circle implements MathConstants{ private double radius=1.0; public getCircumference(){ return 2*PI*radius; } }

  • Soyut sınıf vs. Arayüz

    • Soyut sınıflar ve arayüzler , kendilerinden türetilen alt sınıflara ortak alanları ve üyeleri sunarlar.

    • Tanımlanış amaçları her ne kadar benzer olsa da yapıları ve kullanım şekilleri açısından farklılıkları vardır.

    • Arayüzler sadece özelliklerin ve metodların tanımlamalarını içerirken, Soyut sınıflarda alanlar ve üyelerin tanımlamaların yanı sıra işlevlerine de yer verilebilir.