Javada Final Anahtar Kelimesi Ve Kullanımı

Bu yazımızda java programlama dilinde önemli bir yere sahip olan final anahtar kelimesi ve kullanımı ile ilgili örnekler vereceğiz. Final anahtar kelimesini kullanım bakımından 3 kısımda inceleyebiliriz.

  1. Değişken seviyesinde final kullanımı
  2. Metod seviyesinde final kullanımı
  3. Sınıf seviyesinde final kullanımı

1.Değişken Seviyesinde Final Kullanımı

Sınıflar içerisinde bulunan değişkenler, oluşturulan her nesne için farklı alanda  tekrar tekrar oluşturulmaktadır. final anahtar kelimesini kullanılan değişkenler ilk değerleri girildikten sonra değiştirilemezler.

Final değişkenlerine değerler ya tanımlamanın gerçekleştirildiği esnada yada sınıfa ait yapıcı metodu çağrıldığında verilmelidir. Bu belirtilen yerlerde değeri atanmazsa uygulamada hatalar alırız.

public class Urun{ 

    #urunadi final değişken olarak setlendi.
    private final String urunadi = "FLOWMETRE";
    
    public void urunAdiYazdir() {
        System.out.println("urunadi : "+urunadi);
    }
}

Bu verdiğimiz örnekte final olarak tanımlanan değişkenin değeri doğru terde verildiği için herhangi bir hata ile karşılaşmayacağız. Eğer final kelimesi ile belirtilen değişkenin değerini vermeseydik bize derleme sırasında “The blank final field urunadi may not have been initialized” şeklinde bir hata verecektir.

2.Metod seviyesinde final kullanımı

Java’da sınıflar içerisinde bulunan methodlarda final anahtar kelimesi kullanılarak oluşturulabilmektedir. Ancak final tanımlı olan method hiçbir şekilde başka sınıf tarafından miras alınsa bile override edilemez.

public class Urun{ 
    
    #urunsayisi Sınıf değişkeni. Program çalışır çalışmaz bellekte yer oluşturulur.
    public static int urunsayisi = 0;

    public final int urunsayisiGetir() {
        return urunsayisi;
    } 

}

public class Arac extends Urun { 
    
    public int urunsayisiGetir(){
        System.out.println("urunsayisi getir");
    }

}

Bu örneğimizde verilen kodlara bakarsak eğer Arac sınıfı Urun sınıfını miras almaktadır. Urun sınıf içerisinde bulunan urunsayisiGetir() metodu final olarak ayarlanmıştır. Aynı isimde bir metod Arac sınıfı içerisinde de tanımlanmış ve override edilmiştir. Bu da “Cannot override the final method from urunsayisiGetir” şeklinde bir hataya sebep olacaktır. Bu tür hatalardan uzaklaşmak için alt sınıflarda miras alınan sınıflardaki final metodları override edilmemelidir. Bu duruma bir örnek daha verelim.

public class FinalSuperClass{
 
    final void yaz() {
        System.out.println("Ana sinif final metodu");
    }
}
public class FinalSubClass extends FinalSuperClass{
    void yaz() {
 
        System.out.println("Alt sınıftaki final metodu");
 
    }
}

3.Sınıf seviyesinde final kullanımı

Bu kullanımı incelersek eğer  final olarak hazırlanan sınıflar başka sınıflar tarafından kesinlikle miras alınamazlar. Bir sınıfın zaten hiçbir şekilde başka sınıf tarafından miras alınmasını istemiyorsak bu yapıyı kullanırız. ufak bir kod örneği verelim.

public final class Dikdortgen {
 
}
class Kare extends Dikdortgen{
      
}

Bu yazığımız satırlar sonucunda yukarıdaki şekilde gördüğümüz hata ile karşılaşacağız. Çünkü biz sınıfımızı final değişkeni ile tanımladık bu durumda Kare sınıfı Dikdörtgen sınıfının kalıtımını alamaz.

 

KAYNAKÇA

  • http://yazilimdersi.info/makaleler/detay/86/javada-final-anahtar-kelimesinin-kullanimi
  • https://umiitkose.com/2016/08/java-final-deyimi-nedir-ne-ise-yarar/
  • http://www.ugurkizmaz.com/YazilimMakale-1635-Java-Final-Kullanimi.aspx
  • http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/
  • https://www.dijitalders.com/icerik/44/1078/final_ozelliginin_kullanimi.html

 




JAVA DÖNGÜ DEYİMLERİ

Belirli bir iş bir çok kez tekrarlanacaksa, programda bu iş bir kez yazılır ve döngü deyimleriyle istenildiği kadar tekrarlanabilir. Java’da bu işi yapan üç ayrı deyim vardır: while döngüsü, do..while .. döngüsü, for döngüsü.

For Döngüsü

For döngüsü, belirli bir sayıda yürütülmesi gereken döngüyü, verimli bir şekilde yazmanıza olanak sağlayan bir tekrarlı kontrol yapısıdır. For döngüsü, işlemlerin tekrar sayısının önceden belli olduğu durumlarda yararlıdır. Diğer bir genel kullanımıda bir dizinin elemanlarını sıralarken kullanılmasıdır. Kısaca for döngüsünün yapısı aşağıdaki gibidir.
[crayon-5c69486a22987924951960/]
For yapısını daha detaylı inleyecek olursak:

İlk parça, başlangıç değeri (initialization) dir. Burada bulunan işlemler, döngü başlamadan önce ve bir kere işlenir. Bu 1. değere birden fazla işlem yazılabilir, bunları da birbirinden ‘,’ virgül ile ayırmak gerekir. Ancak bu işlemlerin az tutulması daha iyi olacaktır.

İkinci parçada, koşul kontrolü yapılır. For döngüsünün her tekrarında kontrol edilmesi gereken kodu bu kısıma yazmak gerekir. Bu kod doğru olduğu sürece, döngü devam eder, eğer koşul sağlanmıyorsa döngüden çıkılır.

Üçüncü parçada yer alan kodlar ise; yine döngünün her turunda, süslü parantezin içindeki kodlar gibi çalışır. Tek fark, üçüncü parçadaki kodların başlangıcı, döngünün içinde yer alan kod parçalarının çalışmasından sonra olur.

Basit bir örnek vericek olursak;
[crayon-5c69486a2299d055680154/]
Ekran çıktısı aşağıdaki gibidir.
[crayon-5c69486a229a6224594230/]
For döngüsü ile ilgili bilinmesi gereken bir kaç küçk detay:

  • For döngüsünü kullanırken eğer döngü içinde bir satır kod çalıştırılacaksa süslü parantez {} kullanılmasına gerek yoktur. Ancak birden fazla satır döngü içinde çalıştırılacaksa kesinlikle süslü parantez{} kullanılmalıdır.
  • For döngüsünün parantez kısmında her bölüme bir şey yazmak zorunda değildir. Örnegin hepsi boşta bırakılabilir ya da başlangıç değeri kısmını boş bırakılıp döngünün dışında başlangıç değeri atayıp, ikinci ve üçüncü kısımları doldurulup döngü oluşturulunabilir.
    [crayon-5c69486a229ae875845658/]
  • For döngüsü döngüyü oluşturan değişkenleri tek bir satırda toplar. Dolayısıyla döngü yapısını daha rahat okumak ve değişkenlere değer atanmaıi ve güncellenmesi gibi komutların unutulmasında ortaya çıkabilecek hataların önüne geçebilmek açısından programcıya kolaylık sağlar.

For döngüsünü gerektiği zamanlarda iç içe de kullanabiliriz.
[crayon-5c69486a229b5385606407/]
Ekran çıktısı aşağıdaki gibidir.
[crayon-5c69486a229bc055834991/]

Örnek:

[crayon-5c69486a229c8967419901/]
Ekran çıktısı aşağıdaki gibidir.
[crayon-5c69486a229d2296748228/]

While Döngüsü

While cok kullanilan tekrarlama yapilarindan biridir. Belirli bir mantıksal deyim sağlandığı sürece, belirli bir işin tekrarlanması isteniyorsa, bu denetim yapısı kullanılır. Bu yapıda, tekrarlamanın kaç kez olacağını önceden bilmemiz gerekmez. While döngüsünün yapısı aşağıdaki gibidir.
[crayon-5c69486a229d9582752837/]
While döngüsünde koşulun en başta olması ayırt edici bir özelliktir. Program akışı önce buradaki koşulu mantıksal bir süzgeçten geçirir. Buna göre eğer koşula yazılan ifade matematiksel olarak true (doğru) değer döndürüyorsa, süslü parantezlerle çevrili bloktaki komutlar sırasıyla çalıştırılır. Eger programda boolean islemi sonuclandiracak bir ifade yoksa  bu döngü sonsuza kadar devam edebilir. Ancak false (yanlış) değerini döndürüyorsa, bu komutlar hiçbir zaman çalışmayacaktır. Bu durumda program akışına döngünün bittiği yerden devam eder.Burada while döngüsünün kilit noktası, döngünün hiç çalışmayabilir olmasıdır.

Örnek:

[crayon-5c69486a229e0121813316/]
Pogramın çıktısı aşağıdaki gibidir.
[crayon-5c69486a229e7686516119/]
While döngüsünün çalışma mantığı : Program while döngüsünün bulunduğu satıra geldiği zaman önce ifade sonucunun doğru olup olmadığını kontrol eder. Eğer ifade yanlış bir sonuç verirse döngüye hiç girmeden bir sonraki satırdan çalışmasına devam eder. Eğer ifade doğru bir sonuç verirse, döngüde yer alan ifade yanlış bir sonuç verene kadar, döngü içinde yer alan işlem satırlarını çalıştırır. Yani, ifade doğru olduğu sürece döngü çalışmasına devam eder. while döngüsünde ifadenin sonucu döngünün başlangıcında kontrol edildiğinden, ifadenin yanlış sonuç verdiği durumlarda döngü bir defa bile çalışmaz.

While döngüsünde, for döngüsünden farklı olarak, ilk değer atama ve artırma/azaltma bölümleri bulunmamaktadır. While döngüsünde ilk değer atama işlemi döngü öncesinde, artırma/azaltma işlemi ise döngü kod bloğu içinde yapılır.

Do-While Döngüsü

Do-While döngü yapısı ile While döngü yapısı birbirine çok benzer. Önemli farklardan biri do-while yapısında döngü en az bir kere tekrarlanır . Bunun nedeni döngü kontrolünün döngünün sonunda yapılmasıdır. Ama while döngü yapısında kontrol en başta olduğu için, döngü hiç dönmeyebilir. Bu yüzden do-while yapısı kullanırken döngünün en az bir kere döneceği unutulmamalıdır.Diğer önemli fark ise while döngüsünde ilk önce şart sağlanıyor mu diye kontrol edilip ona göre işlemler gerçekleştirilirken. Do while döngüsünde ilk önce işlem gerçekleştirilip daha sonra şart sağlanıyor mu diye kontrol edilir.

Do-While döngüsünü bir kodun kesin bir kez çalışması gerektiği yerlerde kullanılabilir. Do-While döngüsünün yapısı aşağıdaki gibidir:
[crayon-5c69486a229ef971230735/]
Boolean ifade döngünün sonunda görülmektedir, bu yüzden döngünün içindeki komutlar Boolean test edilmeden önce bir kere çalışır.Boolean ifade true ise, kontrol akışı geri atlama yapar ve döngü içindeki komutlar tekrar çalışır. Bu işlem, Boolean ifade false olana kadar tekrarlanır.

Program do döngüsüne geldiğinde hiç bir koşula bağlı olmadan direk olarak döngüye giriş yapar. Döngünün içinde yer alan işlem satırlarını çalıştırır. Eğer döngünün son satırında yer alan while deyimi ile ilgili ifade doğru sonuç vermez ise döngü sona erer. Do döngüsünde eğer sadece tek bir işlem satırı tekrarlanacaksa ({}) işaretlerine gerek yoktur. Döngü, while satırındaki ifade sonucu doğru olduğu sürece çalışmasına devam eder.

Örnek:

[crayon-5c69486a229fc807899716/]
Programın çıktısı aşağıdaki gibidir:
[crayon-5c69486a22a05063024313/]
While döngüsü ne verilen ifade doğru değil ise kod while döngüsü içerisine hiç girmeden sonraki satır ile işlemlere devam eder, do while döngüsü nde ise ifadenin doğru olup olmamasına bakmaksızın döngü bir sefer çalışır.

For, While ve Do While Döngülerinin Birlikte İncelenmesi

Döngülerle ilgili olarak 3 temel kavram bulunmaktadır:

  1. İlk değer atama
  2. Koşul
  3. Arttırma(Azaltma)
  •  For döngüsünde bütün kavramlar for satırında yer alan parantezler içinde tanımlanabileceği gibi, ilk değer atama bölümü döngü öncesinde ve artırma/azaltma bölümü döngü kod bloğu içinde tanımlanabilir.
  • While döngüsünde ilk değer atama bölümü döngü öncesinde, koşul bölümü while satırında yer alan parantezler içinde, artırma/azaltma bölümü ise koşul sağlandığı takdirde çalışan kod bloğunun içinde tanımlanır.
  • Do döngüsünde ise, ilk değer atama bölümü döngü öncesinde, koşul bölümü döngü sonundaki while satırında yer alan parantezler içinde, artırma/azaltma bölümü ise döngüye bağlı kod bloğu içinde tanımlanır.
  • Do döngüsünün diğer döngülerden en büyük farkı, koşul kontrolü döngü sonunda yapıldığı için, koşul sağlanmasa bile döngünün en az bir kez çalışmasıdır. for ve while döngüleri ise, koşul sağlanmadığı takdirde hiç çalışmaz.

Kaynakça

  1. http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/java/ch09/loops.htm
  2. https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-101/for-dongusu
  3. http://www.yazilimmutfagi.com/10373/dersler/java/javada-dongu-kullanimi-for-while-ve-do-while-donguleri.aspx
  4. https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-101/for-dongusu
  5. http://immibbilisim.com/blog/236/javada-kontrol-yapilari-ve-dongu-kaliplari
  6. https://www.mobilhanem.com/temel-java-dersleri-while-dongusu/
  7. https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-101/while-dongusu
  8. http://www.bilgigunlugum.net/java/2java_dongu.html
  9. https://emraharslanbm.wordpress.com/tag/do-while-dongusu/
  10. http://javayaz.com/?page_id=75



Override (Metotların Ezilmesi)

Override Nedir : 
Override türkçede ezmek, geçersiz kılmak anlamındadır.
Bizim yapacağımız şeyde budur  üst sınıftan alınan bir özelliği
Alt sınıfta değiştirmektir.

Override Kuralları : 

Üst sınıftan override edilen metot alt sınıfta aynı isimle tanımlanmalıdır.

Dönüş tipi aynı olmalıdır.

privatestaticfinal metotları override yapılamazlar. Ancak tekrar tanımlanarak kullanılabilir.

Örnek : Bir otomobil sınıfımız olsun onun altındada Mazdarx8 ve Opelcorsa bulunsun ve otomobilde ortak olmayan özellikleri override ederek değiştirelim.
[crayon-5c69486a2451c481660653/]
Ekran Çıktısı :

Otomobil : MazdaRx8
Özellikleri —>
Motor Gücü : 250 hp
Vites Türü : Manuel
Yakıt Türü : Benzin
Kasa Tipi : Sedan
Gidilen km : 0
Otomobil Rengi : Füme

Otomobil : OpelCorsa
Özellikleri —>
Motor Gücü : 100 hp
Vites Türü : Manuel
Yakıt Türü : Dizel
Kasa Tipi : Hatchback
Gidilen km : 140000
Otomobil Rengi : Beyaz

Kaynak

https://yazilimokulu.wordpress.com/tag/java-override/




GARBAGE COLLECTOR ( ÇÖP TOPLAYICI )

 Merhaba arkadaşlar, bu yazı Java’ da çöp toplayıcı kavramını anlatmak için yazılmıştır. Umarım yararlı olur.

ÇÖP TOPLAYICI NEDİR?

Öncelikle ” Çöp toplayıcı nedir? ” sorusuyla başlayalım; Programda bazı nesnelerin kullanımı bittiğinde bellekten silinmeleri gerekir, nesneye yönelik programlama dillerinde bu işlem otomatik olarak gerçekleşir. Yani programcının müdahalesi gerekmeden hafıza yönetimi gerçekleşir. İşte bunu gerçekleştiren yapı ise çöp toplayıcıdır.  Çöp toplayıcısının temel görevi, kullanılmayan nesneleri bulmak ve hafızadan silmektir.


  • Ancak çöp toplayıcısının ne zaman çöpleri temizleyeceği belli değildir !
  •  Java belirli aralıklarla programı kontrol edip , işi bitmiş ve işaretlenmemiş nesneleri siler. Bu şekilde biriken nesneler programda OutOfMemoryException hatası verir.
  • Eğer bir nesne new anahtar kelimesi ile oluşturup belleğe yerleşmek ister ve bellekte de yer kalmamış olursa; çöp toplayıcı hemen bellekteki gereksiz nesneleri silerek yer ayırır.
  • Nesneler, belleğin heap alanında toplandığı için çöp toplayıcı bu alanda işlem yapar.
  • Çöp toplama isteğini JVM ( Java Virtual Machine ) gönderir.
  • Kullanılmayan nesneleri temizleyerek o alanı belleğe tekrar iade eden çöp toplayıcı otomatik olarak çalışır.

Çöp Toplayıcı Hakkında Bilinmesi Gerekenler

  • Çöp toplayıcının temel görevi , kullanılmayan nesneleri bulmak ve hafızadan silmektir. Ancak çöp toplayıcının ne zaman çöpleri temizleyeceği belli değildir. Bu belirsizlik nedeniyle bazı durumlarda çöp toplama aracını biz programcılar olarak çalıştırmak isteyebiliriz. 
  • Bu araç tetiklense bile, özellikle tetiklenen anda çalışması garanti değildir. Çünkü bu aracın çalışması için bazı durumların olmuş olması gerekiyor. Bu durumların en önemlisi ve ilki ; sanal makine için ayrılan hafızanın  azalmış olması gerekiyor. İkinci durum ise kullanılmayan nesnelerin çoğalmış olması gerekiyor. Bu iki durumun oluşması çöp toplama sistemini otomatik devreye sokacaktır.

Çöp Toplayıcı İşleyişi

  • Çöp toplama yöntemi çeşitlidir. Eski yöntem ve yeni yöntem olarak 2 gruba ayrılabilir.
  • Eski yöntem referans sayma yöntemiyle yapılırdı. Bu yöntemde, bir nesne oluşturulduğunda kendisine ait bir sayaç çalışmaya başlardı. İlgili nesne her kullanıldığında bu sayaç arttırılır, nesnenin yoğun kullanıldığını temsil ederdi. Ve nesneyi kullanan diğer parçalar nesneyle ilişkisini kestiğinde, bu sayaç değeri azalırdı. Bu sayaç değeri ne zaman sıfırlanırsa çöp toplama sistemi tarafından hedef seçilirdi. Çünkü sayacı sıfırlanan nesne kullanılmayan nesnedir.
  • İkinci yöntem ise JVM içinde HOTSPOT ( sıcak bölge ) teknolojisi vardır. Bu teknoloji sayesinde hafızadaki nesneler eski ve yeni grup olarak ikiye ayrılır. Şayet bir nesne zaman içerisinde bir çöp toplayıcı tarafından temizlenmişse , hafıza bölgesindeki eski grup alanına kopyalanır. Çöp toplama aracı genel olarak eski nesnelerin bulunduğu bölümle ilgilendiği için , eski grup alanına kopyalanan çöp nesne temizlenir.
  • Ayrıca çöp toplayıcı referansa bağlı olmayan nesneleri hafızadan siler.
  • new Personel( );   //referans yoktur  
  • Ancak bir nesne referansa bağlı ise çöp toplayıcı bunlara dokunamaz!

System.gc( ) Komutu

Bazı durumlarda çöp toplayıcıyı çağırmamız gerekebilir. Bu durumda System. gc() komut ile istediğimiz zaman çöp toplama aracını tetikleyebiliriz. Tekrar belirtmek gerekirse, bu komut bile çöp toplayıcısının hemen çalışacağını garanti etmez. Ayrıca bu komut yerine Runtime.getRuntime.gc( ) komutunu da kullanabiliriz. Aşağıda bu konuyla ilgili örnek oluşturulmuştur. Örneğimizde Personel adında bir sınıfımız vardır ve bu sınıftan üretilen iki adet nesnemiz vardır. Aynı örnek üzerinden değerlendirme tekrar yapılacaktır.

Örnek:


public static void main( String[] args) {

Personel personel = new Personel();    //nesne oluşturuldu

new Personel();                                        //isimsiz bir nesne oluşturuldu

System.gc();                                             //çöp toplama aracı tetiklendi

}


Örnek Değerlendirme

  • İlk oluşturduğumuz personel nesnesi hafızada yer alacak, kullanılmadığı taktirde hafızadan silinecektir.
  • İkinci oluşturduğumuz personel nesnesi ise isimsizdir yani bir referansa bağlı değildir. Dolayısıyla çöp toplayıcının ilk hedeflerindendir çöp toplayıcı bunu derhal yok edecektir.

Örnek Şekillendirme

 

Çöp toplayıcı devreye girdikten sonra:

 

 

 

Finalize Metodu

  • Biz javada çöp toplayıcının çalışmaya başlayacağı esnada bazı komutlar işletmek isteriz, bunu finalize metodunu kullanarak yaparız.​
  • Finalize metodunun çalışması için sadece çöp toplama aracının devreye girmesi gerekiyor. Yani bizim bu metodu ayrıca çağırmamız gerekmiyor. Çöp toplama aracı devreye girince otomatik olarak bu metot çağrılacaktır ve bloktaki komutlar işleyecektir.

Aşağıda kullanımına ilişkin bir örnek verilmiştir.


public static void main( String[] args) {

Personel personel = new Personel();    //nesne oluşturuldu

new Personel();                                        //isimsiz bir nesne oluşturuldu

System.gc();                                             //çöp toplama aracı tetiklendi

}

public void finalize() {                          //finalize metodu 

System.out.print(“Isimsiz nesne hafızadan siliniyor”);

}


Programda çöp toplama aracı çağrılıyor. Ancak çöp toplama aracı devreye girerse, sınıf içerisinde yazdığınız finalize metodu çalışacaktır. Özellikle System.gc komutu ile tetiklediğimiz halde, uygulamalarda finalize çıktısı oluşmayabilir. Biz çöp toplama aracını çağırmasak da, Personel sınıfına ait nesne silindiğinde finalize metodu çalışacaktır. Tüm anlatılan konuların içinde bulunduğu bir örnekle yazımızı sonlandırıyorum.

Örnek:

[crayon-5c69486a250fb974982964/]

Örneğin Ekran Çıktıları:

 

SUNUM

 

HAZIRLAYAN:

Beyza Nur Kılıç

Kaynakça: Kodlab – Java 8

  [contact-form][contact-field label=’İsim’ type=’name’ required=’1’/][contact-field label=’E-Posta’ type=’email’ required=’1’/][contact-field label=’Web Sitesi’ type=’url’/][contact-field label=’Yorum’ type=’textarea’ required=’1’/][/contact-form]

 

 




JAVA’DA ARAYÜZLER

ARAYÜZLER

Merhabalar, Burada sizlere Java’da Arayüzler konusunu özetleyecegim.

İlk önce arayüzleri neden kullanma geregi duyarız ve ne işe yarar bahsedelim..

Java’da bir sınıftan extends anahtar kelimesi ile kalıtım alınarak yeni bir sınıf oluşturulabildigini ögrenmiştik.Ancak çoklu kalıtımı saglamak bu yolla risk taşımaktadır.

Arayüzlerin özeliklerinden bahsedelim:

*Arayüzler interface anahtar sözcügü ile tanımlanır.

*Arayüzler sadece soyut metodlar içerir.

*Arayüzlerde degiskenler final tipinde tanımlanmalıdır.Bizler yazmasak da Java, degiskeni final tipinde varsayacaktır.

*Tanımlanan degiskene ilk deger verilmelidir.(Bu zaten final tipindeki degiskenin özelligidir,zorunluluktur).

*Arayüzlerde yapılandırıcı bulunmaz.

* Arayüz sınıflar sadece public veya friendly erişim belirleyicisine sahiptir.Public olarak varsayılır.

*Bir sınıf birden fazla arayüz kalıtım alabilir.

*Bir arayüz birden fazla sınıfa kalıtım verebilir.

Arayüz sınıf NetBeans ortamında nasıl oluşturulur?

 

ARAYÜZLERİN GENEL TANIMLAMA BİÇİMİ

erişim_belirleyicisi interface SınıfAdı{
final tip degişken_adı = 44;
tip metod_adı();
262 JAVA 8
tip metod_adı(parametre);
tip metod_adı(parametre,parametre,. . . );

 

 

[crayon-5c69486a25b76672497999/]
yukarıda da görüldügü üzere soyut metodlar tanımladık ve final tipinde ,ilk deger atanmış degiskenler tanımlayarak bir interface yani arayüz oluşturduk.Final tipinde tanımlanan degiskenlere ilk deger atanmak zorundadır.Final tipinde tanımlanan degiskenlerin degerleri erişilen diger sınıflardan degistirilemez.

Bu arayüzden kalıtım alarak normal bir sınıf oluşturabiliriz.Bunu yaparken IMPLEMENTS anahtar söcügünü kullanacagız.

yukarıdaki örnekte görüldügü gibi 3 adet soyut (gövdesiz)metod tanımlanmıştır.Arayüz içinde tanımlanan metodlar soyut olmalıdır.Parametre alan veya parametre almayan metodlar tanımlanabilir.

Neden normal sınıflardan kalıtım alırken kullandıgımız extends anahtar sözcügünü kullanmıyoruz?

Extends ile kalıtım alırız.

Implements ile çoklu kalıtımı gerçekleştiririz.

IMPLEMENTS ANAHTAR SÖZCÜGÜ

yukarıda da bahsedildigi gibi arayüzlerden kalıtım almak için kulanılan anahtar sözcüktür.
[crayon-5c69486a25b86431647034/]
Kalıtım aldıgımız arayüzde tanımlı tüm metodların iptal (@Override) edilmesi gereklidir.Aksi halde iptal edilmedigine dair hata ile karşılaşılır.

 

Arayüzlerin genel biçimini tanımlamaya örnek verirken soyut metodlar tanımlamıştık.Bu soyut metodları kalıtım alarak oluşturdugumuz sınıf altında @Override ediyoruz ve normal metod gibi tanımlayabiliyoruz.

Ana programda yukarıdaki metodları nasıl çagırırız inceleyelim..

Görüldügü gibi kalıtım alarak oluştrulan sınıftan referans alarak nesne oluşturduk.Ve bu nesneyi kullanarak metodları çagırdık.Parametreli olan soyisimGoster metodumuza parametre gönderdik.

ARAYÜZLER VE DEGİSKENLER

Arayüzlerde degiskenlerin final tipinde tanımlanması erektiginden bahsetmiştik aynı zamnda ilk degerleri atanmalıydı.Ayrıca tanımlanan degiskenler siz belirtmeseniz de static durumundadır.

Arayüzlerde  degiskenler 3 farklı kullanım tipinde tanımlanabilir.

Yukarıdaki örnege dikkat edelim.3 şekilde de normal sınıfta ,Arayuz sınıfındaki degiskenlere erişilebilinir.Bunlardan en kullanışlım olanı 3. kullanımdır.Dikkat ederseniz 3.kullanım static erişim şeklidir.Yani sınıf ismi belirtilerek erişilmiştir.Arayüzler nesneya sahip olmazlar.Yani new anahtar kelimesi ile türetilemezler.

ARAYÜZLER ORTAMINDA ÇAKIŞMA

Birden fazla arayüz aynı isimde metodlar barındırırsa ,bu arayüzlerden kalıtım alan sınıf içinde @Override etme anında hata meydana gelecektir.Çünkü IDE hangi arayuzdeki metodu override edecegini bilemez.Karışıklık meydana gelir.

ArayuzSinifi2 diye bir  arayuz sınıfı daha oluşturduk ve bu sınıfın içerisinde de aynı isimlerde metodlar tanımladık ve de aynı tipte aynı isimde degiskenler tanımladık.Şimdi bu iki sınıftan kalıtım alan normal sınıfımıza bakalım…

Evet yukarıda hata oluştugunu görmekteyiz.IDE burada hangi arayuzun metodunu override edecegini bilmez ve hata meydana gelir.

ARAYUZLER VE SOYUT SINIFLAR

Soyut sınıflar arayuzlerden kalıtım alabilir.Ancak arayuzlerin içindeki metodları Override etmesine gerek yoktur çünkü kısmen arayuz görevi görmektedir.Örnege bakalım..


[crayon-5c69486a25b91153650659/]
Soyut sınıfı tanımladık ve soyut sınıfın içinde de görüldügü gibi soyut metodlar tanımladık ve normal bir metod tanımladık.Şimdi bu soyut sınıftan kalıtım alan başka normal bir sınıf oluşturalım..


[crayon-5c69486a25ba0576129428/]
Soyut sınıftan kalıtım alarak oluşturdugumuz normal sınıf içerisinde soyut sınıf içindeki ve diger iki arayüzün içindeki tüm metodları override ettik.Etmeyi unutsanız da Java size uyarı verecektir.

DAHİLİ ARAYUZLER

Daha önceki konularda Sınıfların iç içe tanımlanabildiginden bahsetmiştik.Arayüzler de iç içe tanımlanabilir.


[crayon-5c69486a25baa191309124/]
Şimdi bu üç arayuzden de kalıtım alan normal sınıf tanımlayalım.


[crayon-5c69486a25bb7397832816/]
Dikkat ederseniz iç içe tanımlı üç arayuzden kalıtım alırken ilk önce Ana arayuz adını yazıp (.)operandı ile alt arayuzleri çagırdık.Biz eger sadece en sondaki yani en altta/en içte tanımlı arayuzden kalıtım alıyor olsaydık tanımlama biçimimiz şu olacaktı..
[crayon-5c69486a25bc1495251939/]
Ayrıca override işlemleri sadece en içteki arayuzun metodları için gerçekleşecekti.

Aynı kural diger arayuzlere erişimi için de geçerlidir.

ÖRNEKLER
1. Birden çok arayüze erişen bir sınıf geliştiriniz.
2. Arayüzlere erişen bir soyut sınıf geliştiriniz.
3. Dahili arayüzlere örnek bir uygulama geliştiriniz.

Yukarıdaki Örnekler kendinizi geliştirmeniz için ve konuyu anlayıp anlamadıgınızı test edebilmeniz için sizlere verilmiştir.Çözümlerini daha sonra ekleyecegim,siz de yorumdan çözümlerinizi atabilirsiniz..

Umarım anlaşılır olmuştur.Ekteki sunuyu da inceleyebilirsiniz. Şimdilik hoşçakalın..

Arayüzler

 

HAZIRLAYAN:  GÜLBEYAZ BAYRAM

E-posta: glbzbayram@gmail.com

KAYNAK:

JAVA KİTABI

 

 




This Anahtar Sözcüğü

Öncelikli olarak bu yazıda this anahtar sözcüğü ne işe yarar nerelerde kullanılır nasıl kulllanılır bu sorulara cevap vereceğim.

This Ne İşe Yarar ;  

Basit olarak söylemek gerekirse this anahtar kelimesi o anda hangi nesne üzerinde işlem yapılıyorsa o nesnenin referansını döndürür. Java’da bir metodun içinde o metodun ait olduğu sınıftan yaratılacak nesneyi veya o nesnenin bir alt değişkenini tanımlamamız gerektiğinde kullandığımız deyime this diyoruz.. Bulunduğumuz sınıfta nesne daha tanımlanmadığı için bu nesneyi direk olarak kullanamıyoruz. İşte this ile ait olduğu class içinde yaratılan methodlar o class’ın nesnesini kullanabilmektedir.

Unutmamamız gereken şey ise, this anahtar kelimesini static metodlar içerisinde kullanamayız. Çünkü this kelimesi sınıfa ait nesnelerin oluşturulmasıyla bellekte yer tutmaktadır.

This  Nerede ve Nasıl Kullanılır ;

This.değisken_ismi şeklinde this deyimini kullanabiliriz..

Aşağıdaki örnekten başlayalım. Burada this kullanmadık. Şimdi this’i nerede kullanıyoruz. Öncelikle bu projeyi geliştirme ortamına kopyalayın. 2. işlem olarak class Ornek içindeki urunadi marka ve model’i constructor method’umuz olan örnek içinde nasıl kullanabiliriz düşünün. İşte burada this anahtar kelimesi devreye giriyor..
[crayon-5c69486a264fe321038905/]
Ayrıca this anahtar kelimesini kullanarak aynı sınıf içerisindeki diğer yapıcı metotları da çağırabiliriz. Aşağıdaki kodu inceleyelim.
[crayon-5c69486a26509838294102/]
 




İSTİSNALAR (EXCEPTION)

İstisnalar Nedir?

  • İstisnalar; Java ile geliştirdiğimiz uygulamaların, istenmeyen durumlar nedeniyle oluşacak hatalar topluluğuna verilen isimdir.
  • Java’da uygulamanın çalışma akışı esnasında meydana gelebilecek olası hataları tahmin etmek ve yakalayarak işleme alınmasına, istisnai durumların işlenmesi denir. Bu yapının asıl avantajı ise; hatayı bir sınıf içerisinde kapsülleyip, hatalar arasında hiyerarşik guruplar tanımlamaktır.

 

  • Java kütüphanesinde tanımlı üç ana istisnai durum gurubu bulunur.
  • Kontrol (Checked) istisnai durumları: Uygulamamızın içerisinde yakalanması gereken hata türleridir. Bu hata türlerini uygulamamızdan uzak tutarak, uygulamamızın sağlıklı bir şekilde çalışmasını sürdürmesini sağlayabiliriz.
  • Hatalar (Errors) istisnai durumları: İşletim sisteminde meydana gelen olayların sonucunda oluşan hata türleridir. Genellikle bu hatalardan geri dönmek imkansızdır. İşletim sisteminin çökmesi, hafıza yetmezliği vb. örnek verilebilir.
  • ÇALIŞMA zamanı (run time) İstisnai durumları: Mesela program içerisinde “x/a” gibi bir ifade oldugunu varsayalım. Bu durumda program derlenirken bu ifade hatalı olarak algılanmaz. Ancak program çalışırken a değişkenine 0 değeri atanırsa bu ifade matematiksel olarak sonsuz anlamına gelir ve bu da başka bir hata üretilmesine neden olur. İşte bu tur hatalara error değil “exception” adı verilir.

Örnek :
[crayon-5c69486a26c7d395694197/]
Çıktı:

 

 

 

 

 

  • Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
  • Bunun sebebi sayilar[ ] adli dizimizden 5’inci, yani olmayan bir elemanı çağırıyor olmamızdır.

Try-Catch Bloğu

 try{ // Istisnaya sebebiyet verebilecek olan kod  }

catch(Exception1 e1) {

//Exception1  için yapılacak işler  }

catch(Exception2 e2) {

// Exception2  için yapılacak işler}

finally{

// blok bitmeden yapılması istenen işler

}

  • try blokunda atılan hatayı catch bloku yakalar ve onun hangi tip olduğunu belirlemeye çalışır. Önce, hatanın  Exception1 tipinden olup olmadığına bakar. O tipten ise, istenen önlemleri alacak kodları çalıştırır. Değilse, hatayı kendisinden sonra gelen catch blokuna yollar. Bu süreç hata tipi belirlenene kadar arka arkaya devam eder. Eğer, hiçbir catch bloku hata ile uyuşmazsa, finally bloku gerekeni yapar. catch{} bloku bir tek olabileceği gibi, programcının istediği sayıda olabilir.
  • catch blokunda alt-sınıflardaki hatalar daima üst-sınıftaki hatalardan önce yazılmalıdır. Çünkü, catch deyimi, üst-sınıftaki hatalardan başlayarak alt-sınıflara doğru iner. Eğer üstlerde bir hata yakalamışsa, o hatayı atar ve alttaki hatalara ulaşamaz. Java’da erişilemeyen kodlar da hata atımına neden olur.

Örnek :
[crayon-5c69486a26c8c629755790/]
Bazı İstisnalar ;

  • ArithmeticException; Sıfıra bölme gibi aritmetik hata.
  • ArrayIndexOutOfBoundsException; Dizi indeksi sınırların dışındadır.
  • ArrayStoreException; Bir dizi elemanına, uyumsuz bir tipin atanması.
  • NegativeArraySizeException: Bir diziye boyut değeri olarak negatif bir değer verildiğinde oluşacak istisna tipidir.
  • IndexOutOfBoundsException; Bazı indeks tipleri sınırın dışındadır.
  • NegativeArraySizeException; Negatif boyutta oluşturulan dizi.
  • TypeNotPresentException; Tip Bulunamadı.

İSTİSNA MESAJLARI

  • getMessage(): Oluşan istisnaya ait bilgileri döndürür.

[crayon-5c69486a26c95978640611/]
Çıktı:

 

 

 

 

  • getLocalizedMessage(): Bu metod Exception sınıfından türetilmiş alt sınıflar tarafından iptal (override) edilebilir. Java’da kendi istisna sınıfımızı yazabiliriz. Kendimize ait istisna sınıfı yazdığımızda, bu metodu iptal (override) ederek getMessage() metod çıktısını elde edebiliriz. Yani bu metodun çıktısı getMessage() metodu ile aynıdır.
  • toString(): Oluşan istisna hakkında açıklama döndürür. Bu açıklama istisna ifadesini belirtir.

Örnek: 
[crayon-5c69486a26c9e560605299/]
Çıktı:

 

 

 

  • printStackTrace(): Oluşan istisnayla ilgili sınıf bilgisi ve hatanın oluştuğu satır numarasını verir. Bu metod void tipindedir. Bu nedenle geri dönüş değeri yoktur.

Örnek: 
[crayon-5c69486a26ca6472005262/]
Çıktı:

 

 

 

 

  •  printStackTrace(PrintStream s), printStackTrace(PrintWriter s): Hata mesajları genellikle log dosyalarına yazdırılır. PrintStream ve PrintWriter sınıfına ait nesneleri kullanarak, hata mesajlarını dosyalara yazdırmamız mümkün.
  • getStackTrace(): Hatanın hangi sınıfta, hangi dosyada, hangi fonksiyonda ve hangi satırda oluştuğu hakkında bilgi verir.

THROWS NEDİR ?

  • Eğer bir metot yakalayamadığı bir istisnaya neden olursa, metodu çağıranların kendilerini istisnaya karşı koruyabilmeleri için çağıran metodun bu davranışı belirtmesi gerekir. Bunu metodun bildirimine bir throws ifadesi ekleyerek yapabilirsiniz. throws ifadesi bir metodun fırlatabileceği istisna tiplerini belirtir. Eğer belirtilmez ise derleme zamanı hatası alınır.
  • throws ifadesinin genel formu aşağıdaki gibidir.

tip metot_adi (parametreler) throws istisna_listesi {

//metot gövdesi  }

  • Burada istisna_listesi metodun fırlatabileceği istisna tiplerinin virgülle ayrılmış halidir.

THROW NEDİR ?

  • Yazdığımız Java programında açıkcathrow ifadesini kullanarak bir istisna fırlatmak mümkündür. throw ifadesinin genel formu aşağıdaki gibidir.

                                     throw FırlatılabilirNesne;

  • Burada FirlatilabilirNesne, Throwable veya onun herhangi bir alt sınıfı tipinde bir nesne olmak zorundadır. Throwable olmayan String, Object, Int, Char.. gibi tipler istisna olarak kullanılamaz. Throwable bir nesne elde etmenin iki yolu vardır. Birinci yolu catch cümleciği içinde parametre olarak kullanılabilir ya da new operatörü ile yeni bir nesne oluşturabilirsiniz.
  • Programın işleyişi throw ifadesinden hemen sonra durur ve sonra hiçbir ifade çalıştırılamaz. Kapsayan en yakın try bloğunda istisna tipiyle eşleşen bir catch cümleciği aranır. Bulunmaz ise sıradaki kapsayan try bloğu denetlenir. Denetleme try bloklarının sonuna kadar devam eder. Eğer istisna tipiyle eşleşen bir catch bulunamazsa program durur.

Örnek: 
[crayon-5c69486a26cb1106061995/]

  • Bu program aynı hatayı yakalamak için iki şansa sahiptir. Birincisi main() metodunun içinde çağırılan olustur_firlat metodunun try bloğunda hata oluşturulur ve catch bloğunda yakalanır. İkincisi main() metodunun içindeki catch bloğudur. Örnek kodumuzda kullanılan new kelimesini hata nesnesi oluşturmak için kullanırız.

Kendi istisnalarımızı nasıl oluşturabiliriz?

  • Java’nın yerleşik istisnaları pek çok yaygın hatayı yönetebilmesine rağmen, uygulamalarınıza özgü durumları yönetmek için kendi istisna tiplerinizi oluşturmak isteyebilirsiniz.Yalnızca Exception sınıfının (bu da Throwable’ın alt sınıfıdır) bir alt sınıfını tanımlamak yeterlidir. Alt sınıflarınız aslında herhangi bir şeyi uygulamak zorunda değildir(tip sisteminde bulunuyor olmaları, onları istisna olarak kullanmamızı sağlar).
  • Exception sınıfı kendisinin bir metodunu tanımlamaz. Throwable tarafından sağlanan metotları kalıtım yoluyla devralır. Bu sebeple, oluşturduğunuz istisnalar da dahil olmak üzere tüm istisnalar, Throwable tarafından kendileri için kullanılabilir olarak tanımlanan metotlara sahiptir.

 

 

 

  • İlk form herhangi bir açıklaması olmayan bir istisna oluşturur. İkinci form istisna için bir açıklama belirtebilmenizi sağlar.
  • Bir istisna oluştururken açıklama belirtmek genellikle yararlı olsa da, bazen toString()metodunu devre dışı bırakmak daha iyidir. Bunun nedeni şudur: toString() metodunun Throwable tarafından tanımlanan(ve Exception tarafından devralınan) versiyonu önce istisnanın adını, sonra bir tane iki nokta işareti ve sonra da açıklamanızı görüntüler. toString() metodunu devre dışı bırakarak istisna adının ve iki nokta işaretinin görüntülenmesini önleyebilirsiniz. Bu, daha temiz bir çıktı sağlar ve bazı durumlarda daha çok tercih edilir.

 

 

 

 

 

 

  • Sınıf içerisinde biri parametre almak suretiyle iki yapılandırıcı tanımlanmıştır. Dikkat ederseniz ikinci yapılandırıcı bir parametre alıyor ve kendisine gelen değeri super metodu ile üst sınıfı olan Exception sınıfı yapılandırıcısına gönderiyor. Kendi istisnamızı oluşturma amaçlı tasarladığımız bu sınıf içerisinde kapsamlı metodlar yazabiliriz. Ayrıca Exception sınıfına ait metodları da iptal (override) edebiliriz.

finally Bloğu 

  • Bir işlemin her koşulda – istisna olsun ya da olmasın – kesin olarak yapılmasını istiyorsak finally bloğu kullanmalıyız.

finally {

// ne olursa olsun calisacak kod buraya

}

finally Bloğu ve return Deyimi

  • finally bloğu her zaman çalıştırılır. Örneğin bir yordam hiçbir şey döndürmüyorsa (void) ama bu yordamın içerisinde yordamı sessizce terk etmek amacı ile return ifadesi kullanılmış ise, finally bloğu içerisindeki kodlar bu return ifadesi devreye girmeden hemen önce çalıştırılır.

Örnek:
[crayon-5c69486a26cbe553364950/]

  • calis() yordamına gönderilen parametre eğer sıfırsa, bu yordam çalışmasını sona erdiriyor fakat finally bloğu içerisindeki kodlar bu durumda bile çalıştırılmaktadır.  Dikkat edilmesi gereken bir başka nokta ise calis() yordamının bilerek birşey döndürmemesidir -void- olmasıdır. Çünkü eğer calis() yordamı birşey – ör: String tipi- döndüreceğini söyleseydi, geri döndürme (return) işlemini finally bloğunun içerisinde yapması gerekirdi, aksi takdirde derleme anında (compile-time) uyarı alınırdı. Yani bir yordamın içerisinde try – finally blok sistemi tanımlanmış ise try bloğunda return ile bir değer geri döndürülmesine izin verilmez. Uygulamanın çıktısı aşağıdaki gibidir.

 

 

 

 

 

 

System.exit() Komutu

  • Eğer System sınıfının statik bir yordamı olan exit()  çağrılırsa finally bloğuna hiç girilmez. System.exit() yordamı uygulamanın içerisinde çalıştığı JVM’i (Java virtual machine) kapatır. Anlatılanları bir uygulama üzerinde incelersek.

[crayon-5c69486a26cc8484048296/]

  • Bu örneğimizin bir öncekine göre tek farkı returnyerine System.exit() komutunun yazılmış olmasıdır. System.exit() komutu, uygulamanın içerisinde çalıştığı JVM’i kapattır. exit() yordamına gönderilen eksi bir değer JVM’in anormal bir sonlanmış yapacağını ifade eder. Bu çok ağır bir cezalandırmadır. Normalde uygulamanın bu şekilde sonlandırılması pek tercih edilmemektedir ancak tek başına çalışan uygulamalarda kullanıcının yanlış parametre girmesi sonucu kullanılabilir.

Aşağıdakilere dikkat ediniz:

  1. Bir catch koşulu, try ifadesi olmadan var olamaz.
  2. try/catch bloğu olsa bile, finally koşulu kullanmak zorunlu değildir.
  3. Catch koşulu veya finally koşulu olmazsa, try bloğu olmaz.

 

PowerPoint Sunusunu  linkten indirebilirsiniz.

 

 

İSTİSNALAR (EXCEPTION)

Kaynaklar:

Hazırlayan: Hilal TAŞKIRAN




Polimorfizm(Çok Biçimlilik)

Polimorfizm, nesneye yönelik programlamanın önemli kavramlarından biridir ve sözlük anlamı olarak “bir çok şekil” anlamına gelmektedir. Polimorfizm ile kalıtım konusu iç içedir.

 

Polimorfizm ile bir nesne farklı sınıflardan oluşturulan nesneler gibi davranabilir.

Basit bir örnekle anlatayım.

Polimorfizm sınıfında Goster(Kus k) yordamını oluşturalım. Kus sınıf tipindeki değişkene  Goster(p); ve Goster(k2);  ile Papagan ve Kugu tipindeki referanslar bağlandı. Papagan ve Kugu tipindeki nesnelerle çağrılması yukarı çevrim dir (upcasting). Upcasting ne olduğunu önceki yazılarımda anlatmıştım. Papagan ve Kugu tipindeki nesnelerin Kus tipinde davranması polimorfizmdir.

 
[crayon-5c69486a27779060588792/]
Polimorfizm’in oluşması için birkaç kurala uyulması gerekir

Bunlar;

• cokBicimlilik() metodu parametresi kesinlikle en üst sınıfın nesnesi olmalıdır.

• Polimorfizm aşamasında kullanılacak metodlar ana sınıf içerisinde tanımlanmış olmalıdırlar.

 

Geç Bağlama (Late Bındıng) ve Erken Bağlama (Early Binding) 

Çok biçimlilik kavramını oluşturan bir diğer kavram ise, geç bağlama (late binding) kavramıdır. Geç bağlama; bir nesnenin hangi nesneye ait olduğunu ve hangi nesneye bağlandığını, çalışma zamanında belli olmasına denir. Eğer herhangi bir referans oluşturur ve bu referansın herhangi bir öğesine ulaşmak istersek, bu derleme zamanında belli olan şeydir.

Ancak çok biçimlilik işleyişinde görülen şu ki; ulaşmak istenen öğenin hangi nesneye ait olduğu derleme zamanında belli değildir. Bu belirsizliğin derleme zamanında tespit edilmesi olanaksızdır. Çünkü kendisine gelecek referansın hangi nesneye ait olacağı bilinmemektedir. Ancak çalışma zamanında kendisine gönderilecek referansla belirlenecektir. Dolayısıyla bu belirsizlik, geç bağlamayı besleyen ana maddedir.
Daha açık şekilde ifade etmek gerekirse; çalışma sırasında nesne örneğinin bağlanacağı nesne türünün belirlenmesine, geç bağlama denir. Yani nesne örneği üzerinde bir inceleme başlatılacak ve hangi referansa ait olduğu tespit edilip bağlantı işlemi gerçekleştirilecek.
Tüm bu uğraşlar çalışma zamanında yapılacağı için dolayısıyla performans kaybı yaşanacaktır. Performans kaybı sonucunda oluşan gecikme, geç bağlantı sağladığından dolayı geç bağlama ismi verilmiştir.
[crayon-5c69486a27787043248726/]
Yukarıdaki metodun bize görünen kısmı bu şekildedir. Ancak geç bağlama kavramını detaylandırabilmemiz için, metodun arka planına birazcık değinmemiz gerekir. Az önceki metodu, geç bağlamayı yansıtacak şekilde aşağıda verilmiştir.
[crayon-5c69486a2778f921336921/]
Yukarıda verilen her iki metod arasındaki farklar rahatlıkla görülmekte. İkinci örnekteki metodu incelersek;parametre olarak tanımlanan değişken Object tipindedir. Ana program tarafından gönderilen BenimInteger sınıfı referansı, metod içerisine kadar Object tipinde gelmekte. Daha sonra bir dönüştürme işlemine tabii tutulup asıl referans elde ediliyor. Bu işlemler müteakiben ilgili metod erişimi sağlanıyor. Yani bağlanma gerçekleşiyor.

Fınal Deyimi ve Geç Bağlama 

Fınal anahtar kelimesini kullanmamızın asıl iki nedeni vardı. Birincisi performans, ikincisi ise tasarım idi. Geç bağlama kavramında bizi ilgilendiren şey tasarımdır. final anahtar kelimesinin bu konu üzerindeki etkisi, tersi bir etkidir.

Yani final olarak tanımlayacağımız bir sınıfın kalıtım alınamayacağı, ayrıca metod üzerinde kullanımında ise iptal (override) edilemeyeceğidir. Dolayısıyla kalıtımın engellenmesi, tüm metodlar üzerinde geç bağlama durumunun ortadan kalkacağı anlamına gelir. Ayrıca iptal (override)’in engellemesi, ilgili metod üzerinde geç bağlamanın yapılamayacağı anlamına gelir. Her iki durumda geç bağlama ortadan kalkar. Ancak metodlar üzerindeki etkisi; sadece ilgili metod iptal (override) edilemeyeceği için geç bağlama, sadece bu metod üzerinden gerçekleşmez.

Yukarı Çevirim (UpCastıng) 

Yukarı çevirim; gelişmiş özellikli bir tipten daha genel bir tipe doğru çevirim durumunda meydana gelir. Tüm sınıfların Object sınıfından kalıtım aldığını göz önünde bulundurursak, sınıfların Object tipine çevrilmesi yukarı çevirimdir. Bu durumu daha detaylı ifade edebilmek için iki sınıf geliştireceğiz. İlk sınıf genel bir tip konumunda olacak. İkinci sınıfımız ise ilk sınıftan kalıtım alacak ve daha gelişmiş özellikler eklenecektir.

Aşağı Çevirim (Down Castıng) 

Yukarı çevirimin tam tersi ise aşağı çevirimdir. Aşağı çevirim; genel bir tipten daha gelişmiş özellikli bir tipe çevirim durumuna denir.

Instanceof Anahtar Kelimesi 

Çok biçimlilik kullanımı zorunlu değildir. Çok biçimliliğin olmadığı yerde aşağı çevirim söz konusudur. Ancak aşağı çevirim durumunu kontrol etmemiz için esnek bir yapıya ihtiyacımız var. Aksi halde aynı metod içerisinde birden fazla tip kontrolü yapmamız pek de kolay olmayacaktı. Java’da bir nesnenin hangi sınıfa ait olduğunu sınamak için instanceof anahtar kelimesi kullanılır. Bir if bloğu ile bu anahtar kelimesini kullanarak tip kontrolleri yapabilirsiniz.
[crayon-5c69486a27799666402922/]
Yukarıdaki uygulamada üç adet sınıf tanımlanmıştır. Ana program içerisinde bu sınıflardan birer nesne üretilmiş ve instanceof anahtar kelimesiyle hangi sınıfa ait nesne olduğu kontrol edilmektedir.

Kaynakça:

Java Polimorfizm (Çok Biçimlilik)

http://www.cemkefeli.com/post/2009/09/16/JAVA-Polimorfizm(Cok-bicimlilik)-nedir.aspx

Java 8 Standart Edition

Hazırlayan:Yağız Can Dinç




Java’ da Çok Kanallı (Multithread) İşlemler

Java’ da Çok Kanallı (Multithread) İşlemler:

Çok Kanallı Programlama (Multi-Threaded Programming), bir programda aynı anda birden fazla işin yapılabilmesidir. Yani bir kod parçası bir işlemi gerçekleştirirken aynı anda ona paralel olarak bir başka kod parçasının çalışması demektir. Birbirine paralel çalışan çalışanlardan her birine kanal (thread)

Java çok kanallı porgramlamayı temelden desteklemektedir. Yani çok kanallılık dile bir takım kütüphanelerle eklenmemiştir. Aslında her Java programı bir kanalda (thread’te) çalışır. Örneğin application’ların main method’unun çalıştırılmasıyla adı ‘main’ olan bir ana thread çalıştırılır. Ancak tek bir kanal olunca programcı yazdığı kodun bir thread’in içerisinde çalıştığını farketmez. Thread bize eş zamanlı birden fazla işi yapma fırsatını yani multitasking sağlıyor.

Thread Nedir ?

  • Kelime anlamı olarak İş parçacığı gelmektedir.
  • Bir programın paralel olarak çalışan ve bir birine bağımlı ya da bağımsız işlemler yapan alt parçacıklarına verilen isimdir

Thread’in faydaları:

  • Kaynak paylaşımı
  • Daha az bekleme süresi
  • Daha verimli donanım kullanımı(Multiprocessor kullanımı)

Yeni bir thread yaratıldığında biz start komutu vermedikçe thread çalışmaya başlamıyor hazır durumda bekliyor. Biz start komutunu verdiğimizde çalışmaya başlıyor. Ayrıca thread’i sleep komutu ile belli süre bekletebiliyor, stop komutu ile öldürebiliyoruz.  Peki ama thread ile multithread arasında ne fark vardır?

Resimde gördüğümüz gibi threadler aynı kodu, veriyi ve dosyaları kullanmasına rağmen farklı register ve stack’leri vardır. Bu sayede aynı kod içinde farklı işler yapıp farklı şeyleri hafızada tutabiliyor. Java’da thread yaratmanın iki yolu var. Ben implement ederek kullandım. Ancak extend ederek de thread yaratılabilir. Thread pool diye bir kavram da var. Siz belirli bir thread sayısı veriyorsunuz. Thread pool boşta olan thread’i kullandırıyor. Multihreading yaşanabilecek en önemli sorunlardan biri, concurrent(eş zamanlılık) ve senkronizasyon sorunu. Siz aynı anda hem ekleme hem de silme yapmamınız gerekiyor. Aksi takdirde istediğinizi eklemeden hangi elemanı almaya çalışırsanız hangisini alacaksınız gibi bir soru karşımıza çıkıyor. Bunu çözmenin 3 yolu var:

  • Producer-consumer problemi: İşletim sistemleri dersinde öğrendiğimiz aynı mantık üretici-tüketici problemiyle çözebiliriz.
  • Circular buffer: Producer-consumer problemi benzer bir çözüm. Farkı kendiniz bir dizi oluşturuyorsunuz ve kilit kontrolü bu dizide oluyor.
  • Java collections: Kendimiz kilitlerle uğraşmadan bu işi java’ya bırakabiliriz. Java’nın bu konulara kendi çözüm getirdiği collections sınıfını kullanabiliriz.

Thread Oluşturma Şekilleri :

  1. Çekirdek Uzayında Gerçeklenen Threadler : Thread tablosu kernel’de (işletim sisteminde) yer alır. Hangi thread’in çalışacağına kernel (çekirdek) karar verir. Yeni thread oluşturmak için kernel’da sistem çağrısı yürütülür.
  2. Kullanıcı Uzayında Gerçeklenen Threadler : Kernel, threadlerden haberdar değildir, bu nedenle threadleri desteklemeyen işletim sistemlerinde bile kullanıabilir. Her process’in (programın) ayrı thread tabloları bulunmaktadır. Bu sayede her processte farklı iş sıralama algoritmaları kullanılabilmektedir.
  3. Hibrit Threadler : Çekirdek ve kullanıcı düzeyinde threadler vardır, ancak kernel sadece kernel düzeyindeki threadlerden haberdardır. Bir kernel düzeyi thread üzerinde birden fazla kullanıcı düzeyi thread sıra ile çalışır.

Java’da kanal (thread) oluşturmak için öncelikle paralel çalışacak olan program parçamızı ‘Thread’ türü bir sınıf olarak tanımlamamız gerekir. Bu sınıf içinde çağrılmadan çalışacak bir metod olması gerekir. Bu da ‘Thread’ sınıfında tanımlanmış olan ‘run’ metodudur. Yapmamız gereken sadece bu metodu değiştirerek (override) istediğimiz kodu bunu içine yerleştirmektir.

[crayon-5c69486a28123099921497/]

Daha sonra programın bu kanalı gören herhangi bir noktasından ‘Thread’ sınıfının ‘start’ metodu çalıştırılarak. Thread çalışmaya başlatılabilir. Bu metod kendi içinde (implicitly), ‘run’ metodunu çağıracak ve dolayısıyla kanala yaptırmak istediğimiz işler yapılmaya başlıyacaktır:

[crayon-5c69486a2813b096941674/]

Kanalın ‘run’ metodu içinde genellikle gecikmeler içeren döngüler kullanılır:

[crayon-5c69486a28144554847338/]

Burada ‘Thread’ sınıfının ‘sleep’ metodu ile kanal belli bir süre sonra çağrılmak üzere bekleme kuyruğuna alınır. Bu sayede diğer kanallar da çalışma fırsatı bulurlar. Aynı şekilde ‘sleep’ yerine aynı sınıfın ‘yield’ metodu kullanılarak işletimi diğer kanallara geçirmek de mümkündür. Aşağıdaki adreste çok kanallı bir ugulama paralel hareket eden butonlarla örneklenmiştir:

[crayon-5c69486a2814d212063261/]

Bazen kanalları yaratırken ‘Thread’ sınıfını devralmak (inheritance) uygun olmayabilir. Bu durumda ‘Runnable’ arabirimi (interface) kullanılarak da çalıştırılabilir (runnable) bir sınıf yaratılabilir:

[crayon-5c69486a28156930893189/]

Burada görüldüğü gibi ‘sleep’ gibi metodlar ‘Thread’ sınıfından devralınmadığı için ancak ‘Thread’ sınıfının statik metodları olarak çağrılabilmekte. Görüldüğü gibi bu durumda yarattığımız sınıf ‘Thread’ sınıfına ait özellik ve metodlara sahip değildir ve bunu kanal gibi belli aralıklarla paralel çalıştıramayız. Ancak ürettiğimiz çalıştırılabilir kesimi yaratacağımız bir kanal nesnesine gömerek tam bir kanal elde edebiliriz. Kanalı yaratıp çalıştırmak şu şekilde mümkün:

[crayon-5c69486a28164714990189/]

Aşağıda bu tür kanal yaratmaya örnek verilmiştir:

[crayon-5c69486a2816d875937501/]
 

Thread Türleri :

  1. Single Threading :Aynı anda tek thread çalıştırma işlemidir. Threading’i desteklemeyen işlemciler tarafından kullanılan yöntemdir. Uygulama multithread olarak hazırlansa dahi ana thread üzerinden işlemleri çalıştıracaktır. Günümüzde bu teknolojide işlemciler kalmamıştır. (MS-DOS)
  2. Multi Threading : Aynı anda birden fazla thread çalıştırma işlemidir. Az önce verdiğimiz örnekteki gibi ve çok daha gelişmiş yapılar bu işlem için örnek verilebilir. Günümüz işlemci ve yazılım mimarisi bu sistem üzerine kurulmuştur. (Solaris, UNIX, Windows)

 

Threadlerin Yaşam Döngüsü :

 

 

 

 

 

 

 

 

 

 

 

 

New; Yaratmis oldugumuz thread’in hazir beklemesi durumudur.

Runnable; Yaratmis oldugumuz thread’in artik calisir duruma gelmesidir.

Blocked; Thread bloklanarak, monitor lock durumu icin bekletilmektedir. Blok tekrar acildiginda yeniden runnable durumuna gececektir.

Waiting; Bir thread’in suresiz olarak diger thread’lerin yapmis oldugu isleri tamamlayabilmesi icin o thread’in bekledigi durumdur.

Timed Waiting; Bir thread’in diger thread’in isini tamamlayabilmesi icin sadece belirli bir sure bekledigi durumdur.

Terminated; Thread’lerin tum islerinin tamamlandigi ve islemlerin sonlandigi durumdur.

 

Java da Thread İşlemleri

2 şekilde thread’leri çağırabilir. Kalıtım ile (extends) thread kütüphanesini çağırarak . 2. şekil olarak’ta throws InterruptedException ile main class’ında çağırabiliriz.
[crayon-5c69486a28179558870042/]

Metodlar : Anlamları

  • isAlive() :  Bir kanalın ayakta olup olmadığını öğrenmek için kullanırız
  • sleep(long/bu kısma değer girilicek) : Kanal’ın uyumasını sağlayabilirz. Thread.sleep(long) ile de kanal içerisinde uyuma sağlarız.
  • synchronized: Kanala yapılan metod çağrılarında sıralı işlemler için kullanılır.
  • wait(): kanalı beklemeye alırız.
  • notify(): Kanalı uyandırırız.
  • setPriority(int): Kanalların çalışma anlarında öncelik için kullanılır.
  • yield(): Boşta duran kanalların işgalini önlemek için kullanırız. Bekleme sırasında yüksek veya eşit önceliğe sahip kanalların çalışmasına izin verir.
  • join(): kanalın belirli süre veya ölene kadar beklemesini sağlarız.
  • interrupt():  wait veya sleep halinde olabilen kanalın uyandırılmasını sağlamaktadır. Kanalın kesme durumunda olup olmadığına da isInterrupted() ile bakılır.
  • stop() ya da destroy(): Kanalı öldürmek için kullanırız.

 

Kanallar Arası Haberleşme

Kanallar aynı bağlamı paylaşan kod kesimleri olduğu için aynı görev içinde iseler gördükleri global bir bellek alanı mutlaka vardır. Kanallar arası iletişimde bu alanlar kullanılabilir. Aşağıda kanallar arası haberleşmede dört farklı global kullanımı örneklenmiştir:
[crayon-5c69486a2818a660822843/]
Global alan kullanımı bazı durumlarda kanallar arasında sorunlara sebep olmaktadır. Bu sorunlar kanallar arası zaman uyumlama kapsamında ele alındı.

 

Kanallar Arası Zaman Uyumlama (Synchronization)

Kanallar global bir sayaç kulanan aşağıdaki gibi bir kanal düşünelim:
[crayon-5c69486a2819a489040624/]
Burada tüm kanallardan toplam geçişin 10 olduktan sonra kanalların işletimini durdurmak istiyoruz. Ancak, birbirinden bağımsız çalıştıklarına göre sayaç 9 iken kanallardan biri 4. satırdaki koşulun sağlandığını görerek 5. satıra geçer. Aynı anda 4.satıra gelen başka bir kanal da aynı koşulun sağlandığını görerek 5. satıra geçer. Böylece sayacın değeri önce 10 sonra da 11 olarak programımız hatalı çalışmış olur. Bu tür durumları önlemek için kanallarda işletilecek kritik kesimler aynı anda tek bir kanalın erişebileceği yapıda oluşturulur. Aşağıdaki örnek bu sorunu çözer:
[crayon-5c69486a281a4152234321/]
Aynı yapı aşağıdaki gibi de kurulabilir:
[crayon-5c69486a281ab044448362/]
 

Kaynak:

https://burakisikli.wordpress.com/2009/06/16/multi-threadedcok-kanalli-programlama/

https://umiitkose.com/2015/04/java-thread-islemleri/

http://www.fibiler.com/Divisions/Ehil/Mecmua/Magazines/Articles/txt/html/article_MultiThreadingJava.html

Hazırlayan: Oğuzhan YILMAZ




Java’da İstisnalar

Java’da İstisnalar

Merhaba,

Bu bölümde Java’da İstisnalar (Exceptions) konusunu anlatacağım. İstisna, işlerin kontrolden çıkarak beklenmeyen durumlarda ortaya çıkamasıdır. Java’da istisna işleme konusunda 5 anahtar sözcük kullanılmaktadır. Bunlar; try-catch, throw, throws, finally ‘dir.

Try — Catch Blokları

İstisnaların oluşma aşamasını incelersek;
1- İstisna meydana geldiğinde ilk olarak bir nesne oluşturulur.
2- Bu istisnayı yakalamak için catch bloğu olup olmadığı kontrol edilir. Catch bloğu varsa uygulama sonlanmaz bu catch bloğundan devam eder.
3- Beklenen Catch bloğu yok ise istisna; istisnanın meydana geldiği komuta çağıran satıra istisna nesnesi fırlatılır.
4- Şayet söz konusu istisnanın old. komutu çağıran komut satırında ilgili istisnaya ait catch bloğu var ise uyg. bu catch bloğundan devam eder.
5- Burada da catch bloğu yoksa istisna oluşturulduğu metodu çağıran bir üst metoda fırlatılır. Catch olup olmadığı kontrol edilir varsa buradan yoksa bir üst metoda fırlatılır bu işlem uygulamadaki main metoduna kadar devam eder yoksa uygulama sonlanır.

İstisna Sınıfları

İstisnaların yakalanarak ele alındığı sınıflardır. Bu sınıflar en süper sınıf olan Object sınıfından türetilmiş THROWABLE sınıfından türetilmektedir. Throwable sınıfı 2 alt başlıkta toplanır. Error ve Exception sınıfları. Error sınıfı sistem kaynaklı sorunlar meydana geldiğinde çalıştırılmaktadır. Bu durumda yazılımcıların birşey yapması imkansızdır. Exception sınıfı ise çalışma sırasında oluşan hataları ele almaktadır. Bu hatalar çoğunlukla uygulama geliştirilirken yapılan hatalardan kaynaklanmaktadır.

Kontrollü İstisnalar: Derleyicinin try-catch bloklarını kullanmaya zorlandığı istisna şeklidir.

Kontrolsüz İstisnalar: Derleyicinin try-catch bloklarını kullanmaya zorlamadığı istisna şeklidir.

 

İstisna Hiyerarşisi

Bütün istisna sınıfları, java.lang.Exception sınıfının alt türleridir. Exception sınıfı, Throwable sınıfının alt sınıfıdır. Throwable sınıfından elde edilen diğer bir alt sınıfta Error sınıfıdır. Hatalar, normalde Java programları tarafından tutulmazlar. Bu koşullar normalde java programları tarafından işlenmeyen ciddi başarısızlık durumunda meydana gelirler. Hatalar, çalıştırma ortamı tarafından oluşturulan hataları belirtmek için oluşturulur.Örnek: JVM belleği tükenmiş. Normalde programlar hatalardan kurtulamaz.Exception sınıfı iki ana altsınıfa sahiptir:

  • IO Exception Sınıfı
  • RuntimeException Sınıfı

Java Dahili İstisnaları

En genel istisnalar, standart tip RuntimeException sınıfının alt sınıflarıdır. Java, çeşitli sınıf kütüphaneleri ile ilgili bir çok türde istisna tanımlar. Aşağıdaki liste, Unchecked RuntimeException’ları göstermektedir.

İstisna Açıklama
ArithmeticException Aritmetic hata, sıfıra bölünme gibi
ArrayIndexOutOfBoundsException Dizi index’i sınırların dışında.
ArrayStoreException Dizi elemanına uyumsuz türde atama.
ClassCastException Geçersiz cast.
IllegalArgumentException Metodu çalıştırmak için illegal argüman.
IllegalMonitorStateException Illegal monitor işlemi, unlocked bir thread üzerinde bekleme gibi .
IllegalStateException Ortam veya uygulama doğru olmayan durumda.
IllegalThreadStateException İstenen işlem anlık thread durumu ile uyumlu değil.
IndexOutOfBoundsException Bazı türde index sınır dışında.
NegativeArraySizeException Dizi negatif boyutta yaratılmış
NullPointerException Null referansının geçersiz kullanımı.
NumberFormatException Bir string’in sayısal formata geçersiz dönüşümü
SecurityException Güvenlik ihlali denemesi.
StringIndexOutOfBounds Bir stringe sınırları dışında index verme
UnsupportedOperationException Desteklenmeyen işlem karşılatırıldı.

Aşağıdaki liste, Javada ki CheckedException’ları göstermektedir:

İstisna Açıklama
ClassNotFoundException Sınıf bulunamadı.
CloneNotSupportedException Nesne kopyalama, Kopyalanabilir arayüzde uygulanamadı.
IllegalAccessException Sınıfa erişim engellendi.
InstantiationException Abstract bir sınıf veya arayüzde nesne oluşturma.
InterruptedException Bir thread, diğer bir thread tarafından kesildi.
NoSuchFieldException İstenen dosya yok.
NoSuchMethodException İstenen metot yok.

 

 

 

İstisna Sınıflarında Ortak Kullanılan Metotlar

getMessage() metodu: İstisna nesnesi içersindeki mesajı döner.
toString(): istisna mesajını istisna adını ili nokta ve arada bir boşluk ile döner.
printStackTrace(): oluşan istisnanın bilgilerini aşama aşama ekrana yazdırır.
getStackTrace(): oluşan istisnanın bilgilerini aşama aşama stacktrace tipinde bir dizi olarak döner.

 

İstisna Oluşturma  

Uygulamalarda sıkça karşılaşılan istisnalar, çalışma zamanı (run time) istisnalarıdır. Biraz sonra örnekleyeceğimiz gibi, mevcut olmayan dizi elemanlarına erişim bir çalışma zamanı istisnasıdır. Veya açmaya çalışılan dosyanın yerinde olmaması, ağ bağlantısının kopmuş olması vb. türü durumlar da çalışma zamanı istisnalarına örnek verilebilir. Aşağıda verilen örnekte, olmayan bir dizi elemanına erişilmeye çalışılmıştır.
[crayon-5c69486a290cf692208344/]
İstinaları Yakalamak

Bir metot, try ve catch anahtar kelimelerinin kombinasyonunu kullanarak bir istisnayı yakalayabilir. Try/catch bloğu, istisna oluşması muhtemel kodun etrafına yerleştirilir.
Try/catch bloğu içindeki kod, korumalı kod(protected code) olarak adlandırılır ve
try/catch kullanımı aşağıdaki gibidir:
[crayon-5c69486a290de410975298/]

Bir catch ifadesi, yakalamak istediğiniz istisnanın deklare edilmiş türünü içerir. İstisna korumalı kod içinde oluşuyorsa, catch bloğu(veya blokları), try bloğunu kontrol eder. Eğer istisna türü catch bloğu içinde listelenmiş istisnalardan biriyse, istisna catch bloğuna geçirilir.

Throw Exceptions

Throw ifadesini kullanarak açıkça bir hata fırlatılabilir.
[crayon-5c69486a290e6706988729/]
Throws Exceptions

Eğer bir metot istisnaya sebep olabilirse, metot çağırıcılarına karşı kendini koruyabilmesi adına, metodun bu davranışı belirtmesi gerekir. Bunu aşağıdaki biçimde yapabiliriz
[crayon-5c69486a290ed435081254/]
finally Anahtar Kelimesi

İstisnaları yönetirken tanımladığı- mız try-catch bloğu, istisna oluş- ması durumunda catch bloğunun çalışması sağlanıyordu. Ancak istisna oluşsun veya oluşmasın, her koşulda çalışmasını istediğimiz kodları finally bloğuna tanımlamalıyız. finally bloğuyla ilgili aşağıdaki grafiği inceleyelim. Yandaki verilen grafiği inceledi- ğimizde try-catch tanımlaması ile bitişik yer alan finally bloğu yer alıyor. Uygulamanın akışı try bloğuna girdiğinde, bu blok içerisinde istisna oluşmadığı takdirde uygulamanın akışı try bloğunu bitirir bitirmez finally bloğuna dallanacak ve bu bloktaki kodlar çalışacaktır. Farz edelim ki; try bloğu içerisinde bir istisna oluştu ve uygulamanın akışı catch bloğuna dallandı. catch bloğu sonuna gelindiğinde uygulama akışı finally bloğuna dallanacak ve buradaki kodları çalıştıracaktır. Akabinde uygulama akışı try-catch-finally bloğu dışında kaldığı yerden devam edecektir. Gördüğünüz gibi her iki durumda da finally bloğu çalıştı.

 
[crayon-5c69486a290f5084634345/]
ÖRNEKLER

Try – Catch

Bu örnekte iki tane catch(istisna) tanımladık, döngüde sadece tanımladığımız kadar istisna olur.
[crayon-5c69486a290fd799458639/]
Try – Catch – Finally

Bu örnekte ise finally,tanımladığımız hatalar olmasa bile programın sonunda sanki bir hata varmış gibi ya da hata olsa bile sanki tanımlanmamış farklı bir hata varmış gibi davranır.
[crayon-5c69486a29105305975813/]
Throw

Programımızın açıkça throw ifadesini kullanarak bir istisnayı fırlatmasıda mümkündür.
[crayon-5c69486a2910d492247017/]
Throws

Eğer bir metot yönetemediği bir istisnaya neden olursa, metot çağırıcılarının kendilerini bu istisnaya karşı koruyabilmeleri için, metodun bu davranışı belirtmesi gerekir. Bunu, metodun deklarasyonuna bir throws cümleciği ekleyerek yapabilirsiniz.
[crayon-5c69486a29116458563020/]

Kaynakça :

http://javayaz.com/?page_id=100

https://medium.com/gokhanyavas/javada-i%CC%87stisnalar-f7ec3838a623

https://www.dijitalders.com/icerik/44/3690/javada_try_catch_finally_ve_throw_throws_kullanimi.html

Java 8 : standard edition ders kitabı

 

Hazırlayan : Alpay Aygün