Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
YayınlayanSaziye Yalman Değiştirilmiş 9 yıl önce
1
Hata Ayıklama (Debugging), Arayüzler (Interfaces), Polimorfizm
2
Hata Ayıklama (Debugging) Hata Ayıklama –75% Psikolojik –20% Mantık –5% Kafeyin Java genelde hatalı değildir Verilen kodlar genelde hatalı değildir Sizin yazdığınız kod büyük ihtimal hatalı olabilir! Mainler yazarak test etme burada devreye girer! Geriye doğru giderek kontrol edin...Bolca "System.out.printf"
3
Mini-tekrar Referanslar: Nesnelere işaretçiler. İşaretçiler ile ilgili karışık birçok özelliği içerir. Kalıtım: "extends“ ifadesi ile gösterilir. –Alt sınıflar ana sınıfın bütün alanlarını ve metodlarını kalıtım yoluyla edinirler. –Alt sınıfları kendi dosyaları içinde tanımlayın. Diziler de birer nesnedir. Referans gerektirir. Watch[] watchArray = new Watch[]; Çoğunlukla, static kullanmaktan sakının Referans oluşturma ile nesne oluşturma: TetrisBlock tb; tb = new TetrisBlock();
4
Sorular?
5
Çoklu kalıtım (Multiple Inheritance) Bazı diller çoklu kalıtıma izin vermektedir. Çoklu kalıtım, biçok potansiyel isimlendirme karışıklığını da beraberinde getirir. (örneğin, Pet.doYourThing() ve Animal.doYourThing()) Genelde varılan uzlaşma: çoklu kalıtımın sebep olduğu problemler getirdiği avantajlardan daha fazladır. Java tekli kalıtıma izin verir. Java çoklu kalıtıma izin vermez. Interface (Arayüz) Java çoklu kalıtımla aynı işleve sahip bir yapı sağlamaktadır: Interface (Arayüz) Animal Dog Pet
6
Arayüzün kullanımına dair bir örnek görmüştük public class P1Constants { public static final int FEETPERMILE = 5280; } public class SomeOtherClass {... public int convertFeet2Miles(int feet) { return feet * P1Constants.FEETPERMILE; }... }
7
Arayüzün kullanımına dair bir örnek görmüştük public interface P1Constants { final int FEETPERMILE = 5280; } public class SomeOtherClass implements P1Constants {... public int convertFeet2Miles(int feet) { return feet * FEETPERMILE; }... }
8
Fakat esas önemli özellik... Animal AquaticLandBased Goldfish Shark DogCat Giraffe Şöyle bir yapımız olsun Fakat bazı hayvanların aynı zamanda da evcil hayvan (Pet) olmasını istiyorum.
9
Evcil Hayvanlar (Pets) birer isme sahip olur! public interface Pet { public String getName(); public void setName(String name); } Not: Değişken adı tanımlamıyoruz
10
Öyleyse, bir köpeğin (dog) evcil (pet) olmasını istiyorsam: class Dog implements Pet { private String name; /* Diğer ek alanlar eklenebilir */ public String getName() { return name; } public void setName(String name) { this.name = name; } /* Diğer ek alanlar eklenebilir */ }
11
Sorular?
13
Görünürlük ve Erişim Görünürlük Değiştiricisi: Erişebilir: public protected private Tüm sınıflar Evet Hayır Hayır Bir alt sınıf Evet Evet Hayır Sınfın bir üyesi Evet Evet Evet Görünürlük değiştiricisini mutlaka belirtin. ilkeler: Sadece sınıfın “yapmayı vaad ettiği” genel işlemleri public yapın Bütün alanları private tanımlayın Diğer bütün “private” metodları protected tanımlayın Paketler hakkında yeterli bilginiz yoksa bu değiştiricileri yazmayı unutmayın Herhangi bir nesne, her alana ulaşabilir ve her metodu çağırabilir mi?
14
Daha fazla Polimorfizm
15
Son bölümde... Son dersteki Polimorfizm hakkındaki bilgilere tekrar bakalım. Bu konu, sadece Java’nın değil bütün nesneye yönelik programlama dillerinin en önemli özelliklerinden biridir. Nasıl çalıştığını anlamanız bir zorunluluktur. Tekrar edelim
16
Tekrar class Animal { public void move ( ) { System.out.println (“I am an animal and am moving.”); } } // of Animal class Fish extends Animal { public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish class Bird extends Animal { public void move( ) { System.out.println (“Flap, flap, flap again”); } } // of Bird class Dog extends Animal { public void move ( ) { System.out.println (“Run, scratch, walk, run”); } public void bark ( ){ System.out.println (“Arf Arf”); } } // of Dog 7. Derste birçok hayvan oluşturduk...
17
Tekrar class Driver { public static void main (String[ ] argv) { Animal[ ] animalArray = new Animal[3]; int iIndex; animalArray[0] = new Bird( ); animalArray[1] = new Dog( ); animalArray[2] = new Fish( ); for (iIndex=0; iIndex < animalArray.length; iIndex++) { animalArray[iIndex].move( ); } // of for } // of main } // of Driver Çıktı: Flap, flap, flap again Run, scratch, walk, run Swim, swim, swim, swim! Çeşitli türdeki hayvanları bir dizide tutmak için Polimorfizm ‘den faydalanıldı. Gene, her hayvana özel davranışı çağırmak için dinamik bağlama (dynamic binding) kullanıldı.
18
ve... Daha kompleks bir sınıf örneği kullanarak, bir nesnenin nasıl oluşturulduğuna bir daha bakalım... class Animal { public int numLegs; public static int total = 0; public String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal Bu sefer, hem üye değişkenler hem de sınıf değişkenleri mevcut. int total,nüfus(population)sayacıdır ve bir sınıf değişkenidir. int numLegs hayvanın kaç tane ayağının olduğu bilgisini tutan üye değişkendir. String strType ise hayvanı tarif eden üye değişkendir. Bu, en iyi dizayn yöntemi olmayabilir. Unutmayınki, bu akademik bir örnek. Bu yüzden böyle yapıyoruz.
19
ve... Daha kompleks bir sınıf örneği kullanarak, bir nesnenin nasıl oluşturulduğuna bir daha bakalım... class Animal { public int numLegs; public static int total = 0; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “legs.”; } } // of Animal move() metodu daha önceki ile aynı. Sadece bir yapılandırıcı ve toString()adında basit bir metod eklendi.
20
Ve ayrıca... class Fish extends Animal { public Fish(int numLegs){ super(numLegs); strType = “Fish”; } public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish Fish sınıfı da hemen hemen aynı. Sadece, ana sınıfın yapılandırıcısını çağıran ve strType alanına gerekli atamayı yapan yeni bir yapılandırıcı eklenmiştir.
21
Ve ayrıca... class Bird extends Animal { public Bird(int numLegs){ super (numLegs); strType = “Bird”; } public void move( ) { System.out.println (“Flap, flap, flap again”); } } // of Bird Bird sınıfı için de aynı şeyler geçerli. Yeni bir yapılandırıcı ekledik ve type (tür) bilgisinin gerektiği şekilde atamasını yaptık.
22
Ve ayrıca... class Dog extends Animal { public Dog(int numLegs){ super (numLegs); strType = “Dog”; } public void move ( ) { System.out.println (“Run, scratch, walk, run”); } public void bark ( ){ System.out.println (“Arf Arf”); } } // of Dog Dog sınıfı için de aynı şeyler geçerli. Yeni bir yapılandırıcı ekledik ve type (tür) bilgisinin gerektiği şekilde atamasını yaptık.
23
Ve sonuçta... class Driver { public static void main (String[ ] argv) { Animal[ ] animalArray = new Animal[3]; int iIndex; animalArray[0] = new Bird(2); animalArray[1] = new Dog(4); animalArray[2] = new Fish(0); for (i=0; i < animalArray.length; i++) { System.out.println (animalArray[i].toString()); animalArray[i].move( ); } // of for System.out.println (“Total Count: “ + Animal.total); } // of main } // of Driver Yapılandırıcılara uygun değerleri vererek Driver sınıfını da düzeltmiş bulunuyoruz.
24
Ne olur? class Animal { public int numLegs; public static int total = 0; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal class Fish extends Animal { public Fish(int numLegs){ super(numLegs); strType = “Fish”; } public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish class Bird extends Animal { public Bird(int numLegs){ super (numLegs); strType = “Bird”; } public void move( ) { System.out.println (“Flap, flap, flap again”); } } // of Bird class Dog extends Animal { public Dog(int numLegs){ super (numLegs); strType = “Dog”; } public void move ( ) { System.out.println (“Run, scratch, walk, run”); } public void bark ( ){ System.out.println (“Arf Arf”); } } // of Dog class Driver { public static void main (String[ ] argv) { Animal[ ] animalArray = new Animal[3]; int iIndex; animalArray[0] = new Bird(2); animalArray[1] = new Dog(3); animalArray[2] = new Fish(0); for (i=0; i < animalArray.length; i++) { System.out.println (animalArray[i].toString()); animalArray[i].move( ); } // of for } // of main } // of Driver Eğer Driver ‘ı çalıştırırsak ne olur? Bundan önemlisi, neden olur?
25
Belleğe bir bakış class Animal { public int numLegs; public static int total; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal Bu nesnelerin bellekteki görüntülerine bir göz atalım. Bunu yapmadan önce ne yazdıklarımızı özetleyelim. Bazı semboller ve gösterim şekilleri üzerinde anlaşmaya varmamız gerekiyor. Animal int numLegs String strType toString(); move(); Animal türünden oluşturulmuş nesneleri birer kutuyla göstereceğiz. Değişkenler için küçük bir oda ve de birkaç metodumuz var.
26
Belleğe bir bakış class Animal { public int numLegs; public static int total; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal Bu nesnelerin bellekteki görüntülerine bir göz atalım. Bunu yapmadan önce ne yazdıklarımızı özetleyelim. Bazı semboller ve gösterim şekilleri üzerinde anlaşmaya varmamız gerekiyor. Animal int numLegs String strType toString(); move(); Animal sınıfı Object sınıfından türediğinden (IS-A ilişkisi), Object sınıfı için de bir kutu çiziyoruz. Object toString() Sonraki sınıflarda, UML diyagramlarını göreceksiniz. Fakat şimdilik sadece kutuları ve ok işaretlerini göreceksiniz.
27
Belleğe bir bakış class Animal { public int numLegs; public static int total; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal Fish sınıfı daha kompleks. Object sınıfından türeyen Animal sınıfından türemiştir. Animal int numLegs String strType toString(); move(); Object toString() class Fish extends Animal { public Fish(int numLegs){ super(numLegs); strType = “Fish”; } public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish Fish move(); Bu bütün alan, bellekte Fish objesi için ayrılan alandır. Fish aynı zamanda bir Animal olduğundan, bir Animal da aynı zamanda bir Object olduğundan, çizilen üç kutunun tamamı bir nesneyi belirtmektedir.
28
Belleğe bir bakış Böylece, eğer Fish türünden bir örnek nesne oluşturursak, çizdiğimiz bu bellek bloğuna işaret eden bir referans elde etmiş oluruz. Animal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Fish fTemp; fTemp = new Fish(0); fTemp Genel olarak, bütün olarak bir blok bir nesneyi ifade etmesine rağmen, referansımız bloğun sadece bir kısmına işaret edecek. Referansımız Fish türünden olduğu için, ok işareti, bloğun Fish kısmına işaret eder.
29
Nesne oluşturma zaman çizelgemize tekrar bakalım... Hatırlarsak, Fish(int) ile yapıladırıcı çağırıldığı zaman aynı zamanda açık olarak (explicitly- Fish yapılandırıcısının içinden) Animal(int) yapılandırıcısı da çağırılmaktadır. Açık olarak bu yapılandırıcı çağırılmasaydı bile, Java, üstü kapalı olarak ana sınıfın yapılandırıcısını çağıracaktı; tıpkı Animal sınıfının yapılandırıcısı çağırıldığı zaman, onun da üstü kapalı olarak Object sınıfınınkini çağırması gibi. Animal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Fish fTemp = new Fish(0); fTemp Animal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Animal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Bir Fish yapabilmek için Java önce Animal yapar. Bir Animal yapabilmek için Java önce Object yapar 1 23
30
Wow.Animal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Object oTemp; oTemp = new Fish(0); oTemp Başka birşeyi farkettiniz mi? Bütün Fish ‘ler aynı zamanda Object türünden olduğu için bellek bloğunun bu kısmına Object türünden referans sağlayabiliriz. Referansın bloğa neresinden işaret edeceğini ayarlıyoruz, bu da referans türünü yansıtmaktadır. Bir adet Fish Sınıfı örneği
31
İşte!!!Animal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Animal aTemp; aTemp = new Fish(0); aTemp Öyleyse, yeni referanslar oluşturarak, bellek bloğumuza değişik noktalardan işaret etmelerini sağlayabiliriz. Referansın yerini kaydırarak nesneye çok şekillilik kazandırabilirz. Referansın işaret ettiği noktayı ayarlıyoruz, böylece referansın türü de yansıtılmış olmaktadır.
32
Evet, çooook güzel!!! Animal int numLegs = 3 String strType toString(); move(); Object toString() Fish move(); ref Polimorfizm ile ilgili basit bir örnek. Fish
33
Evet, çooook güzel!!! Animal int numLegs = 3 String strType toString(); move(); Object toString() Fish move(); ref Polimorfizm ile ilgili basit bir örnek. Animal
34
Evet, çooook güzel!!! Animal int numLegs = 3 String strType toString(); move(); Object toString() Fish move(); ref Polimorfizm ile ilgili basit bir örnek. Hepsi de aynı nesne. Sadece ona işaret eden referans tipini değiştiriyoruz. Object
35
PolimorfizmAnimal int numLegs = 3 String strType toString(); move(); Object toString() Fish move(); ref Kelime anlamı olarak, Polimorfizm, “Bir çok form” anlamına gelir. Öyleyse, bizim için anlamı, “Bir nesne; birçok form”. <type> Bir nesne Çeşitli formlar
36
BöyleceAnimal int numLegs = 0 String strType toString(); move(); Object toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Object toString() Dog move(); bark(); Animal int numLegs = 2 String strType toString(); move(); Object toString() Bird move(); Öyleyse, Fish, Dog ve Bird sınıflarına ait birer örnek üyeyi temsil eden ve uygun referans türleriyle işaret edilmiş 3 kutumuz var. Fish fTemp = new Fish(0); Dog dTemp = new Dog(3); Bird bTemp = new Bird(2); fTempdTempbTemp
37
Hatırlama class Animal { public int numLegs; public static int total = 0; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal class Fish extends Animal { public Fish(int numLegs){ super(numLegs); strType = “Fish”; } public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish class Bird extends Animal { public Bird(int numLegs){ super (numLegs); strType = “Bird”; } public void move( ) { System.out.println (“Flap, flap, flap again”); } } // of Bird class Dog extends Animal { public Dog(int numLegs){ super (numLegs); strType = “Dog”; } public void move ( ) { System.out.println (“Run, scratch, walk, run”); } public void bark ( ){ System.out.println (“Arf Arf”); } } // of Dog Kalıtımın bellekte nasıl görüldüğünü göstermiş olduk. Hatırlarsak, String türünden ifadelere işaret eden sınıflarımız da mevcuttu. String türü bir String ifadeye işaret eder. Kaynak kodunuz içindeki “ ” işaretleri arasındaki ifadelerdir. Harfi harfine neyse o.
38
Sabit havuzu (Constant Pool). Java Sanal Makinesi (Java Virtual Machine) ‘nin Sabit Havuzu adında bir alanı mevcuttur. Bildirimi yapılan sabitleri (final değişkenler) ki bu değişkenler değişitirilemediğinden dolayı, tutan bir alandır. Anlaşılacağı üzere, burası String ifadelerin de tutulduğu yerdir. Animal aTemp; aTemp = new Bird(2); aTemp Object toString() Bird move(); Animal int numLegs = 2 String strType toString(); move(); Constant Pool “Animal” “Fish” “Bird” “Dog”
39
Object toString() Bird move(); Animal int numLegs = 2 String strType toString(); move(); Sabit Havuzu “Animal” “Fish” “Bird” “Dog” Sabit havuzu (Constant Pool) Stringler aynı zamanda birer Object (nesne) olduğundan ve referanslar yoluyla adreslenebildiklerinden, Animal sınıfı içersindeki strType değişkeni Sabit Havuzu içerisindeki “Bird” alanını işaret etmektedir. Animal aTemp; aTemp = new Bird(2); aTemp
40
Object toString() Bird move(); Animal int numLegs = 2 String strType toString(); move(); Constant Pool “Animal” “Fish” “Bird” “Dog” Sabit havuzu (Constant Pool) Unutmayın ki, temel (primitive) türler için bu olay daha değişiktir. Temel türler referans değildirler. Öyleyse sadece, alanın değerini sağ yan tarafına yazıyoruz. Animal aTemp; aTemp = new Bird(2); aTemp ZITLIK
41
Object toString() Bird move(); Animal int numLegs = 2 String strType toString(); move(); Aslında... Constant Pool Aslında, String türündeki strType, Object sınıfından türemiştir. Öyleyse, Sabit Havuzunu kalıtıma sahip nesneler topluluğu olarak yeniden çizebiliriz. Object toString(); String “Animal” Object toString(); String “Dog” Object toString(); String “Fish” Object toString(); String “Bird” aTemp Animal aTemp; aTemp = new Bird(2); Fakat iş daha da kompleks bir yapı alıyor.
42
Keanu Reeves ne derdi? “Whoa.”
43
Constant Pool “Animal” “Fish” “Bird” “Dog” Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 3 String strType toString(); move(); Fish Object toString() Animal int numLegs = 0 String strType toString(); move(); Dog bark(); Öyleyse, detayları görmezden gelip, sadece şunu unutmayacağız: Java ‘da nesneler referanslar vasıtasıyla ele alınır. Sürücü sınıfımız (Driver class) tarafından oluşturulan her bir nesnenin kendine ait değerleri (numLegs) ve referansları vardır.
44
Constant Pool “Animal” “Fish” “Bird” “Dog” Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Şunu da not edelim: eğer String türündeki strType ‘a başka bir şeyi işaret edecek şekilde atama yaparsak, Sabit Havuzunu işaret etmeyebilir. Bird bTemp = new Bird(0); bTemp.setType (IOHelper.readLine()); Object toString() String <whatever IOHelper returns> new String(); substring(); and IOHelper.readLine(); Gibi ilemler yeni String nesneleri tahsis edilmesini sağlar.
45
Ya üye değişkeni olmayan veriler? Object toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Object toString() Dog move(); bark(); Animal int numLegs = 0 String strType toString(); move(); numLegs üye değişkendir total sınıf değişkenidir int türündeki numLegs değişkeni Animal sınıfına ait bir üye değişkendir ve her üye nesne, kendi kopyasına sahiptir. Fakat int türündeki total değişkeni(nüfus sayacı), static tanımlanmıştır. Öyleyse, bir sınıf değişkenidir. Peki, bu türü, diyagramlarımızda nasıl gösterebiliriz?
46
Ya üye değişkeni olmayan veriler? Java ‘da Sınıf Havuzu (Class Pool) dediğimiz, programınız içerisinde kullandığınız her sınıfla ilgili bilgileri tutan bir yer mevcuttur. Burayı, program kodunuzun tutulduğu bir ”text” alanı olarak düşünebilirsiniz. Belleğin diğer alanları, nesnelerin tutulduğu “veri” alanıdır. Sınıf havuzunu ülkeler klübü olarak düşünebilirsiniz. Üye olabilmek için bir sınıfa sahip olmanız gerekir. class Animal { public int numLegs; public static int total = 0; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal Sınıf Havuzu Object toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Object toString() Dog move(); bark(); Animal int numLegs = 0 String strType toString(); move();
47
class Animal { public int numLegs; public static int total = 0; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal class Fish extends Animal { public Fish(int numLegs){ super(numLegs); strType = “Fish”; } public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish class Bird extends Animal { public Bird(int numLegs){ super (numLegs); strType = “Bird”; } public void move( ) { System.out.println (“Flap, flap, flap again”); } } // of Bird class Dog extends Animal { public Dog(int numLegs){ super (numLegs); strType = “Dog”; } public void move ( ) { System.out.println (“Run, scratch, walk, run”); } public void bark ( ){ System.out.println (“Arf Arf”); } } // of Dog class Driver { public static void main (String[ ] argv) { Animal[ ] animalArray = new Animal[3]; int iIndex; animalArray[0] = new Bird(2); animalArray[1] = new Dog(3); animalArray[2] = new Fish(0); for (i=0; i < animalArray.length; i++) { System.out.println (animalArray[i].toString()); animalArray[i].move( ); } // of for } // of main } // of Driver Sınıf havuzu Görüldüğü üzere Sınıf Havuzu çok büyüt boyutlardadır. Sadece sizin sınıflarınızı değil, programınızın çalışabilmesi için kullandığınız bütün Java sınıfları da (String, Object, Integer, vb.. ) buraya yüklenir. Java, çalışan kodun ve her sınıfın içindeki metodların izini tutabilmek için Sınıf Havuzunu kullanır. Static değişkenler sınıfa ait olduğu için yani üye değişken olmadıklarından bu depolama alanının bir parçası gibi davranılırlar. (Animal sınıfnın içinde) static int total: 3
48
class Animal { public int numLegs; public static int total = 0; private String strType; public Animal (int numLegs){ this.numLegs = numLegs; strType = “Animal”; total++; } public void move ( ) { System.out.println (“I am an animal and am moving.”); } public String toString(){ return strType + “ with “ + numLegs + “ legs.”; } } // of Animal class Fish extends Animal { public Fish(int numLegs){ super(numLegs); strType = “Fish”; } public void move( ) { System.out.println (“Swim, swim, swim, swim!”); } } // of Fish class Bird extends Animal { public Bird(int numLegs){ super (numLegs); strType = “Bird”; } public void move( ) { System.out.println (“Flap, flap, flap again”); } } // of Bird class Dog extends Animal { public Dog(int numLegs){ super (numLegs); strType = “Dog”; } public void move ( ) { System.out.println (“Run, scratch, walk, run”); } public void bark ( ){ System.out.println (“Arf Arf”); } } // of Dog class Driver { public static void main (String[ ] argv) { Animal[ ] animalArray = new Animal[3]; int iIndex; animalArray[0] = new Bird(2); animalArray[1] = new Dog(3); animalArray[2] = new Fish(0); for (i=0; i < animalArray.length; i++) { System.out.println (animalArray[i].toString()); animalArray[i].move( ); } // of for } // of main } // of Driver Sınıf havuzu (Animal sınıfının içinde) static int total: 3 İşte bu, sınıf isimlerini kullanarak sınıf metodlarını çağırabilmemizin ya da harekete geçirebilmemizin nedenidir. Üye değişkenlere erişirken o sınıfa ait bir üye nesne kullanmak zorundayız. int x = Animal.total; int leg = myDog.getLegCount();
49
Stil: Sınıf değişkenleri nesnelerle de kullanılabilir. Integer iTemp = new Integer(3); String strNumber = “42”; int x = iTemp.parseInt(strNumber); // Tamam int y = Integer.parseInt (strNumber); // Daha iyi Fakat, sınıf ismini kullanarak sınıf metodlarına ve alanlarına ulaşmak konvansiyonel bir yöntemdir. Sınıfın bir üyesini kullanarak erişme yöntemi de çalışır ancak sanki bu işlem sadece bu yöntemle yapılır izlenimi verir. Öyleyse, (1) Hangisi çalışıyorsa onu kullanın. (2) Fakat hangisi daha anlaşılır ve açıksa onu kullanın.
50
(Hala hayatta mısınız...)
51
Organizasyondaki temel ilke, Animal türünden türetilmiş olmanın verdiği ortak özelliktir. Fish, Dog ve Bird hepsi de Animal türünden türedikleri için, Animal türünden bir dizi oluşturarak bu sınıfın değişik gösterimlerini tutmasını sağlayabiliriz. Polimorfizm ‘e geri dönüş Görüldüğü gibi, nesnelerimizi bellekte temsil eden 3 adet bloğumuz mevcut ki, hepsi biribirinden farklı, hepsi de tek, eşsiz (unique) referanslar ve temel türlere sahiptir. Peki bu tamamen farklı nesneler heterojen bir dizinin içinde nasıl tutulabilir?Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark();
52
Object türünden bir dizi de oluşturabilirdik. Fakat, Object sınıfı, move() gibi metodlara sahip olmadığından, dizinin elemanlarında bu metodları çağırmaya kalktığımızda problemler çıkardı. Polimorfizm ‘e geri dönüş Görüldüğü gibi, nesnelerimizi bellekte temsil eden 3 adet bloğumuz mevcut ki, hepsi biribirinden farklı, hepsi de tek, eşsiz (unique) referanslar ve temel türlere sahiptir. Peki bu tamamen farklı nesneler heterojen bir dizinin içinde nasıl tutulabilir?Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark();
53
Öyleyse, Animal sınıfını ortak tür olarak seçiyoruz. Dizi de tutmayı planladığımız bütün elemanlar da bu sınıftan türediklerinden hepsi de bu sınıfa ait özellikleri ortak olarak taşımaktadırlar. Polimorfizm ‘e geri dönüş Görüldüğü gibi, nesnelerimizi bellekte temsil eden 3 adet bloğumuz mevcut ki, hepsi biribirinden farklı, hepsi de tek, eşsiz (unique) referanslar ve temel türlere sahiptir. Peki bu tamamen farklı nesneler heterojen bir dizinin içinde nasıl tutulabilir?Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark();
54
Polimorfizm ‘e geri dönüş Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Hatırlarsak, bellekteki aynı Fish, Dog ya da Bird alanlarına referans eden birçok referans türü olabilir. Diziler tek bir türdeki üyelerden oluşabileceği için, Animal türüne işaret eden referansları çok şekilli kullanmış oluyoruz. Bird bTemp = new Bird(); Object oTemp = (Object) bTemp; Animal aTemp = (Animal) bTemp; aTempbTempoTemp Burada dönüşüme gerek yoktu, çünkü yukarı dönüşüm yapıyoruz, açık olması için böyle yazıldı
55
Bellekte biçok nesne olduğu zaman, üyelere işaret eden referanslarımızı çok şekilli kullanmış oluyoruz. Böylece, her üye, değişik alt sınıf türünden olmasına rağmen Animal türünden bir dizi elde etmiş oluyoruz.Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Unutmayın ki,dizi nesnesinin int türündeki “length” alanı final özelliğindedir. Dolayısıyla, dizilerin boyutlarını bir kere atadıktan sonra değiştiremezsiniz. Sadece, daha büyük boyutlusunu oluşturur ve küçük olandaki verileri diğerine aktarabilirsiniz. Flaşşş: Diziler de birer nesnedir ve Object sınıfından türemişlerdir. [ 0 ] [ 1 ] [ 2 ]
56
Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Resmimiz doğru mu? Aşağıdaki kod çalışınca olan: Object oTemp; oTemp = animalArray[1]; oTemp Hayır, resim doğru değil. Kod çalışır fakat okumuz yanlış yere işaret etmektedir.
57
Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Resmimiz doğru mu? Aşağıdaki kod çalışınca olan: Object oTemp; oTemp = animalArray[1]; oTemp Şimdi daha iyi.
58
Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Bir satır kod daha ekleyelim: Object oTemp; oTemp = animalArray[1]; oTemp.move(); oTemp Peki bu çalışır mı? HAYIR. Object sınıfı move() diye bir metoda sahip değil.
59
Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Düzgün şekli: Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; oTemp aTemp aşağı doğru tür dönüşümü Unutmayın ki, aşağı doğru tür dönüşümü (down casting ) gerekli
60
Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Düzgün şekli: Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; aTemp.move(); oTemp aTemp Hmm... Daha yakından inceleyelim.
61
Object toString() Animal int numLegs = 2 String strType toString(); move(); Bird Object toString() Animal int numLegs = 0 String strType toString(); move(); Fish Object toString() Animal int numLegs = 3 String strType toString(); move(); Dog bark(); Animal [ ] final int length = 3 Object toString(); Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; aTemp.move(); oTemp aTemp Object toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Hem Animal hem de Fish sınıfları move() metoduna sahip Peki, aTemp. move() komut satırı çalıştığında hangisininki çağırılır? Kullandığımız referans türü Animal türünden. Peki bu, Animal mı yoksa Fish sınıfının metodunun çağırılıp çağırılmadığını belirtir mi?
62
Dinamik Bağlama (Dynamic Binding) Object toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; aTemp.move(); aTemp Dinamik bağlama işlevi, çalışma zamanında, en spesifik olan metodun (davranışın) harekete geçmesini sağlar. Burada, Fish move() metodu ana sınıfınınkinden daha spesifiktir. Öyleyse, aTemp.move() satırının çalışmasıyla birlikte Fish sınıfına ait move() metodu harekete geçer. Şunu iyice kavrayın. Ne yaptığını anlayın. Nesneye yönelik Programlama dillerinin en ömenli özelliklerinden biridir.
63
KontrolObject toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; System.out.println (oTemp.toString()); oTemp Peki: System.out.println ( ((Object)oTemp).toString() ); Burada ne oluyor? Tür dönüşümü (casting) dinamik bağalamya göre daha üstün bir güce mi sahip?
64
Mantık Kontrolü Object toString() Fish move(); Animal int numLegs = 3 String strType toString(); move(); Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; System.out.println (oTemp.toString()); oTemp Peki: System.out.println ( ((Object)oTemp).toString() ); Burada ne oluyor? Tür dönüşümü nasıl yapılırsa yapılsın, dinamik bağlama işlevi ağır basar. Yeçekimi kuvveti gibi birşey.
65
Mantık Kontrolü Object toString() Fish move(); toString(); Animal int numLegs = 3 String strType toString(); move(); Object oTemp; oTemp = animalArray[1]; Animal aTemp = (Animal) oTemp; System.out.println (oTemp.toString()); oTemp Peki ya Fish sınıfı da kendisine ait bir toString() metoduna sahip olsaydı? Tür dönüşümü nasıl yapılırsa yapılsın, dinamik bağlama işlevi ağır basar. Yeçekimi kuvveti gibi birşey. her zaman Dinamik bağlama, çalışma zamanında, her zaman, metodun en spesifik versiyonu çalıştırır.
66
“Her Zaman?” Object toString() Fish move(); toString(); Animal int numLegs = 3 String strType toString(); move(); Object oTemp; oTemp = animalArray[1]; oTemp.move(); // WRONG! oTemp Dinamik bağlama mucizeler oluşturabilir mi? Aktif sınıfta çağırılan metod mevcut olmasa bile, türeyen sınıflardaki bu metodun çağırılması mümkün mü? dinamik bağlama tip güvenliğini Javada ihlal etmez. HAYIR. Bu, bir derleme hatasına neden olur. Java, çok güçlü yazılmıştır. Şu anlama geliyor, eğer bir metoda çağrıda bulunulduğu zaman o metod sınıfta mevcut olması gerekir, her ne kadar dinamik bağlama o metodun bir versiyonunu daha alt sınıflarda bulsa bile. Bu nedenle: Hayır, dinamik bağlama tip güvenliğini Javada ihlal etmez. Object sınıfında move() diye bir metod mevcut değil
67
if (getSorular()) cevaplaSorular(); else dersiBitir();
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.