Bu sunumda, Java'nın desteklediği iki önemli üstkavram anlatılıyor: ayrıksı durumlar ve kalıtlama. Ek olarak, nesnelerin değişmelerinin nasıl önüne geçilebileceği Cloneable arayüzünün gerçekleştirimiyle anlatılırken, Java ortamında karşılaştırılabilirlik kategorisini tanımlayan java.util.Comparable arayüzünün gerçekleştirim örneği de veriliyor.
NOT: Sunum içindeki bağlantılara tıklayarak daha ayrıntılı bilgilerin verildiği makalelere ulaşabilirsiniz.
4. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Tanım
Evreler
Ayrıksı Durum Sıradüzeni ve Örnek
Ayrıksı Durumlar Blog makalesi
Ayrıksı Durum
Bir programın çalışması sırasında ortaya çıkabilecek beklenmedik
durumlara ayrıksı durum denir. Ayrıksı durumun ortaya çıkması,
programın hatalı olduğu anlamına gelmez. Ancak; ayrıksı
durumların öngörülmeyip atlanması programı dayanıksız kılacaktır.
Örnek
Kullanıcının sağladığı girdi sonucu;
1 bölenin 0 olması ve bölme işleminin sonuç döndürememesi
2 verilen ada sahip bir dosyanın bulunamaması
3 işlenmekte olan bir dizinin sınırları dışına taşılması
Tevfik AKTUĞLU Java Programlama Dili
5. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Tanım
Evreler
Ayrıksı Durum Sıradüzeni ve Örnek
Ayrıksı Durum İlanı
Java’da olası ayrıksı durumlar metot başlıklarının sonuna eklenen
throws yantümcesiyle ilan edilir.
public void kayıtlarıYaz(String dosyaAdı)
throws FileNotFoundException { ... }
Bu, söz konusu metot içinde bir şeylerin yanlış gidebileceği
(throws) ve bu durumun halledilmesi için yeterli bilgi olmaması
nedeniyle topun çağırıcıya atıldığı (throw) anlamına gelir.
Dosya açılıp bazı kayıtlar yazılacak ama ya verilen adda bir dosya
yoksa? Belki, çağıran metot buna karşı önlemini almış ve
yedekleme amacıyla ikinci bir konuma aynı kayıtları yazdırarak veri
kaybını önler.
Tevfik AKTUĞLU Java Programlama Dili
7. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Tanım
Evreler
Ayrıksı Durum Sıradüzeni ve Örnek
Ayrıksı Durum Fırlatımı
public KesirliSayı(long pay, long payda)
throws SıfırPayda {
if (payda == 0) throw new SıfırPayda();
_pay = pay;
_payda = payda;
this.sadeleşmiş();
} // yapıcı(long,long) sonu
throw ayrıksı durum koşullarının oluştuğu ve çözümün metot
içindeki kısıtlı ortamda mümkün olmaması nedeniyle çağırıcıya
bu konuda haber verilmesi zorunluluğunu gösterir.
throw return komutunun benzeri olarak düşünülebilir. Biten
işin sonucu değil, işin neden bitemediğinin özet bilgisini içeren
bir ayrıksı durum nesnesi döndürülür.
Tevfik AKTUĞLU Java Programlama Dili
12. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Tanım
Evreler
Ayrıksı Durum Sıradüzeni ve Örnek
Ayrıksı Durum Kotarımı-catch
Ortaya çıkan durum için hangi bloğun seçileceğine yukarıdan
aşağıya bakılarak karar verilir. İlk eşleşme daha aşağı sıralardaki
blokların göz ardı edilmesine neden olacaktır. Dolayısıyla, genel
amaçlı kotarıcılar diğerlerinden sonra gelmelidir.
try { ... }
catch(RuntimeException e) { ... }
catch(SıfırPayda e) { ... }
Yukarıdaki blokların sırası hatalı! Çünkü, ortaya çıkabilecek
SıfırPayda durumunda ilk sırada bulunan RuntimeException
kotarıcısı işe soyunacakır. Doğrusu, kotarıcıların sırasını
değiştirmektir.
Tevfik AKTUĞLU Java Programlama Dili
13. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Tanım
Evreler
Ayrıksı Durum Sıradüzeni ve Örnek
Ayrıksı Durum Kotarımı-finally
finally, ayrıksı durum ortaya çıksa da çıkmasa da icra edilmesi
garanti edilen özel bir kotarıcı tanımlar. Genelde bir işlemin bitişi
sonrasında kaynakların geri döndürülmesi için kullanılır.
FileInputStream dosya = null;
try {
dosya = new FileInputStream(...);
...
} catch(FileNotFoundException e) { ... }
...
finally { dosya.close(); }
Pek çok zaman, çökme noktasına gelen bir programda ortama çeki
düzen verip hasarı en aza indiren düzenlemeleri yapmak için
kullanılır.
Tevfik AKTUĞLU Java Programlama Dili
18. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Tanım
Evreler
Ayrıksı Durum Sıradüzeni ve Örnek
Ayrıksı Durum Sınıf Sıradüzeni
Throwable: Sıradüzeninin tepesindeki sınıf.
Error: Programcının halli yolunda pek fazla bir şey
yapamayacağı normal dışı durumlar. Dolayısıyla, sistem
yazılımı üretecek azınlık bir grup dışında, programcıların bu
kategorideki hata durumlarını yakalaması beklenmez. Örnek
olarak, bellek yetersizliğine işaret eden OutOfMemoryError
hatasını verebiliriz.
Exception: Programcının yakalayıp düzeltme yönünde bir
şeyler yapabileceği beklenmedik durumlar.
RuntimeException ve altındaki sıradüzeninde bulunan ayrıksı
durumların kotarımı zorunlu değildir.
Geri kalan Exception sıradüzenindeki ayrıksı durumların
kotarılması veya çağrıyı yapan metodun başlığında da ilan
edilmesi zorunludur ve bu derleyici tarafından kontrol edilir.
Tevfik AKTUĞLU Java Programlama Dili
24. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Sınama Programı
Paket Tanımı ve import Yönergeleri
package etk.matematik;
import etk.matematik.ayrıksıdurumlar.*;
import static java.lang.System.err;
KesirliSayı sınıfı etk.matematik paketi içine konuluyor.
etk.matematik.ayrıksıdurumlar paketindeki tüm türler
programa görünür kılınıyor.
java.lang.System sınıfının static öğelerinden err, sınıf
adı olmadan kullanılabilir.
System.err standart hata dosyasını temsil eden çıktı ortamıdır
ve değiştirilmedikçe ekrana bağlanmıştır.
Tevfik AKTUĞLU Java Programlama Dili
26. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Sınama Programı
Comparable Arayüzü
Comparable arayüzü Java evrenindeki nesnelerin
karşılaştırılabilir olma standardını ortaya koyar.
Tanıma uyan sınıfların nesneleri sınıflarından bağımsız olarak
karşılaştırılabilir nesneler kategorisine de aittir.
KesirliSayı nesneleri kesirli sayılardan beklenen toplama,
çıkarma gibi işlemlerin yanısıra karşılaştırılabilir nesnelere has
sıralama, ikili arama gibi işlemlere de katılabilirler.
Tevfik AKTUĞLU Java Programlama Dili
27. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Sınama Programı
Comparable Arayüzü
Comparable arayüzü Java evrenindeki nesnelerin
karşılaştırılabilir olma standardını ortaya koyar.
Tanıma uyan sınıfların nesneleri sınıflarından bağımsız olarak
karşılaştırılabilir nesneler kategorisine de aittir.
KesirliSayı nesneleri kesirli sayılardan beklenen toplama,
çıkarma gibi işlemlerin yanısıra karşılaştırılabilir nesnelere has
sıralama, ikili arama gibi işlemlere de katılabilirler.
Fonksiyonel bir arayüz olan Comparable, ilan ettiği yegâne
ileti olan compareTo’nun gerçekleştirimi ile ileti alıcı ve aynı
sınıftan bir diğer nesne arasındaki sıralama durumuna açıklık
getirilmesini bekler.
İleti alıcı ile diğer nesne eşitse, 0 döndürülmelidir.
Olası bir sıralamada ileti alıcının ’önce’ gelmesi gerekiyorsa eksi
bir int, aksi takdirde artı bir int döndürülmelidir.
Tevfik AKTUĞLU Java Programlama Dili
39. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Sınama Programı
Comparable Arayüzünü Gerçekleştirmek
public int compareTo(KesirliSayı sağ) {
double sol_ = ((double) _pay) / _payda;
double sağ_ = ((double) sağ._pay) / sağ._payda;
if (sol_ > sağ_) return 1;
else if (sol_ == sağ_) return 0;
else return -1;
} // int compareTo(KesirliSayı) sonu
Yukarıdaki gerçekleştirim, kayan noktalı sayıların gerçel sayıları
kusurlu temsil etmesi nedeniyle birbirine yakın kesirli sayıları farklı
oldukları halde eşit gösterebilir.
Tevfik AKTUĞLU Java Programlama Dili
40. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Sınama Programı
Comparable Arayüzünü Gerçekleştirmek
/*
x - y = 0 ⇒ x = y
x - y > 0 ⇒ x > y
x - y < 0 ⇒ x < y
*/
public int compareTo(KesirliSayı sağ) {
long pay = çıkar(sağ).getPay();
if (pay == 0) return 0;
else return (pay > 0) ? 1 : -1;
} // int compareTo(KesirliSayı) sonu
Bu gerçekleştirim sayesinde, KesirliSayı nesneleri tutan kapları
Comparable içerik barındıran kaplar bekleyen Arrays.sort ve
Collections.sort gibi metotlara argüman olarak geçirebiliriz.
Tevfik AKTUĞLU Java Programlama Dili
51. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Kalıtlama Blog makalesi
Kalıtlama üstsınıf ve altsınıf arasında ”gibi olmak” ilişkisi
kurar.
Tamsayılar payda değeri 1 olan kesirli sayılardır. Dolayısıyla,
tamsayılar kesirli sayı gibi görülebilir.
Tanımında üstsınıf ilan edilmeyen sınıfların Object sınıfından
kalıtladığı varsayılır.
Üstsınıftaki public ve protected metotların tümü, erişim
niteleyicilerini koruyacak şekilde altsınıfta varlıklarını
sürdürürler.
Üstsınıfın nesnelerine gönderilen iletilerin tümü altsınıfın
nesnelerine de gönderilebilir.
İstenecek olursa, üstsınıftan kalıtlanan metot tanımları
altsınıfta ezilebilir.
Tevfik AKTUĞLU Java Programlama Dili
52. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Kalıtlama Blog makalesi
Kalıtlama üstsınıf ve altsınıf arasında ”gibi olmak” ilişkisi
kurar.
Tamsayılar payda değeri 1 olan kesirli sayılardır. Dolayısıyla,
tamsayılar kesirli sayı gibi görülebilir.
Tanımında üstsınıf ilan edilmeyen sınıfların Object sınıfından
kalıtladığı varsayılır.
Üstsınıftaki public ve protected metotların tümü, erişim
niteleyicilerini koruyacak şekilde altsınıfta varlıklarını
sürdürürler.
Üstsınıfın nesnelerine gönderilen iletilerin tümü altsınıfın
nesnelerine de gönderilebilir.
İstenecek olursa, üstsınıftan kalıtlanan metot tanımları
altsınıfta ezilebilir.
Java’da çoklu sınıf kalıtlama desteklenmez.
Tevfik AKTUĞLU Java Programlama Dili
53. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Kalıtlama Blog makalesi
Kalıtlama üstsınıf ve altsınıf arasında ”gibi olmak” ilişkisi
kurar.
Tamsayılar payda değeri 1 olan kesirli sayılardır. Dolayısıyla,
tamsayılar kesirli sayı gibi görülebilir.
Tanımında üstsınıf ilan edilmeyen sınıfların Object sınıfından
kalıtladığı varsayılır.
Üstsınıftaki public ve protected metotların tümü, erişim
niteleyicilerini koruyacak şekilde altsınıfta varlıklarını
sürdürürler.
Üstsınıfın nesnelerine gönderilen iletilerin tümü altsınıfın
nesnelerine de gönderilebilir.
İstenecek olursa, üstsınıftan kalıtlanan metot tanımları
altsınıfta ezilebilir.
Java’da çoklu sınıf kalıtlama desteklenmez.
Kalıtlama bir araçtır, amaç değil.
Tevfik AKTUĞLU Java Programlama Dili
54. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Kök Sınıf: Object
Tüm Java nesneleri, hangi sınıfa ait olurlarsa olsunlar, Object
sınıfı üyesi gibi görülebilirler.
Üstsınıf ilanı içermediği takdirde tanımlanmakta olan bir
sınıfın Object’ten kalıtladığı varsayılır.
equals, toString ve hashCode gibi tüm nesnelerin alması
olası iletiler bu sınıfta tanımlanmıştır. Söz konusu iletilerin
sınıf içinde gerçekleştirimi sağlanmayacak olursa, ileti
gönderimi sonrasında çağrılacak metot Object sınıfı içinde
sağlanmış olan gerçekleştirim olacaktır.
Tevfik AKTUĞLU Java Programlama Dili
64. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Neden Bu “Garip” Protokol?
Klonlama bir şeyin değişime uğramadan kopyalanması
demektir. Dolayısıyla, nesnenin klonlanması nesnedeki hassas
içeriğin de olduğu gibi kopyalanmasına neden olur.
Klonlamayı kopyalayan yapıcıdan üstün kılan performansıdır.
Kopyalayan yapıcıda tüm altalanlar teker teker kopyalanırken,
Object sınıfındaki klonlamada nesne büyüklüğündeki bellek,
içindeki yapısallık gözönüne alınmaksızın doğrudan kopyalanır.
Tevfik AKTUĞLU Java Programlama Dili
65. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Neden Bu “Garip” Protokol?
Klonlama bir şeyin değişime uğramadan kopyalanması
demektir. Dolayısıyla, nesnenin klonlanması nesnedeki hassas
içeriğin de olduğu gibi kopyalanmasına neden olur.
Klonlamayı kopyalayan yapıcıdan üstün kılan performansıdır.
Kopyalayan yapıcıda tüm altalanlar teker teker kopyalanırken,
Object sınıfındaki klonlamada nesne büyüklüğündeki bellek,
içindeki yapısallık gözönüne alınmaksızın doğrudan kopyalanır.
clone’un public tanımlanması, nesnelerin herkes tarafından
klonlanabileceği anlamına gelir. Güvenlik tehdidi olarak görülen
bu durum, erişimin protected yapılmasıyla önlenmiştir.
Tevfik AKTUĞLU Java Programlama Dili
66. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Neden Bu “Garip” Protokol?
Klonlama bir şeyin değişime uğramadan kopyalanması
demektir. Dolayısıyla, nesnenin klonlanması nesnedeki hassas
içeriğin de olduğu gibi kopyalanmasına neden olur.
Klonlamayı kopyalayan yapıcıdan üstün kılan performansıdır.
Kopyalayan yapıcıda tüm altalanlar teker teker kopyalanırken,
Object sınıfındaki klonlamada nesne büyüklüğündeki bellek,
içindeki yapısallık gözönüne alınmaksızın doğrudan kopyalanır.
clone’un public tanımlanması, nesnelerin herkes tarafından
klonlanabileceği anlamına gelir. Güvenlik tehdidi olarak görülen
bu durum, erişimin protected yapılmasıyla önlenmiştir.
Sınıfın Cloneable ilan edilmesi, gerçekleştirimcinin durumun
farkında olduğunun işaretidir.
Sınıfın Cloneable ilan edilmesi sonrasında erişimin
protected iken public’e değiştirilebilmesi, derleyicinin
ikilemin farkında olduğunun işaretidir.
Tevfik AKTUĞLU Java Programlama Dili
67. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Yapıcılar
public Tamsayı(long pay) { super(pay); }
public Tamsayı() { super(0); }
public Tamsayı(Tamsayı varolan) {
super(varolan.getPay());
} // yapıcı(Tamsayı) sonu
Yapıcılar kalıtlanmaz.
super(...) üstsınıfın uygun imzalı yapıcısını çağırır.
Üstsınıf yapıcı çağrısı ilk satırda yer almak zorundadır.
Üstsınıf yapıcı çağrısının yapılmaması durumunda, derleyici
üstsınıfın varsayılan yapıcısına çağrıyı söz konusu yapıcının ilk
satırı olarak ekler.
Tevfik AKTUĞLU Java Programlama Dili
72. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Ayrıksı Durumlar
Kalıtlama-Üstsınıf
Kalıtlama-Altsınıf
Sınıf Başlığı
Kaynak Kod
Dinamik İletim
Dinamik İletim
1 Bir nesneye gönderilebilecek iletiler, nesneyi temsil eden
tutacağın türüne göre belirlenir.
Tutacak türüne statik tür de denir.
2 Gönderilebilirliği derleyici tarafından onaylanan bir ileti
sonrasında çağrılacak metot nesnenin sınıfı içinde aranmaya
başlanır.
Nesne sınıfına dinamik tür de denir.
3 İleti ile aynı imzaya sahip bir metodun nesnenin sınıfı içinde
bulunması söz konusu metodun çağrılmasına neden olur. Aksi
takdirde, aramaya üstsınıfta devam edilir. Aramanın üstsınıfta
sürdürülmesi Object sınıfına kadar devam edebilir.
Tevfik AKTUĞLU Java Programlama Dili