/OOP-Rehber

Üniversite öğrencileri için OOP sınavları için internette kaliteli "Türkçe Kaynak" oluşturma amacıyla hazırlanmaya başlamıştır. Hataları af buyrunuz.

OOP-Rehber

Üniversite öğrencileri için OOP sınavları için internette kaliteli "Türkçe Kaynak" oluşturma amacıyla hazırlanmaya başlamıştır. Hataları af buyrunuz. Öncelikle yararlı linkleri bırakmakla başlayalım:

OOP ve Java için daha önceden yazdığım kısım için buraya tıklayabilirsiniz

20bin satırlık Java Öğretici İçerik için: buradan asıl repoya ulaşabilirsiniz

Extends nedir? buradan ulaşabilirsiniz

20bin satır gözünüzü korkutuyorsa seçtiğim yerlere bakabilirsiniz:

  • Sorular

    • OOP Programlama Egzersizleri (Kolay)
    • Nesne kompozisyonu
    • Nesne Sınıfı ve Kalıtım, Çıktısını Tahmin edin
    • Kalıtım ve Metot Üstelemesi(Overriding), Çıktısını Tahmin edin
      • Kalıtımlı Kod yazalım
  • Neden

    • Neden Kalıtım?
    • Super cidden super mi?
    • Soyut Sınıflar
      • Soyut Sınıflar Neden var?

Bunlardan sonra zaman buldukça güncelleyeceğim kısımlara geçelim.

Polymorphism ve Trace (Çok Biçimlilik ve Çıktı Tahmin)

class insan {
	public String isim;
	public int no;

	public insan() {
		this(1907, "fener");
	}

	public insan(int no, String isim) {
		this.isim = isim;
		this.no = no;
	}

	public void yaz() {
		System.out.println(this.isim + " " + this.no);
	}
}

Yukarıdaki kod örneğinde basit ve get&set metodları olmayan bir insan sınıfı oluşturduk. şimdi insan sınıfının daha özelleşmiş bir biçimi olan calisan sınıfını oluşturalım.

class calisan extends insan {
	public int isno;
	public String isim_is;

	public calisan() {
		super();
	}

	public calisan(int a, String b) {
		super(a, b);
	}

	public calisan(int a, String b, int c, String d) {
		super(a, b);
		this.isno = c;
		this.isim_is = d;
	}

	public String yazdir() {
		return "calisan [isno=" + isno + ", isim_is=" + isim_is + ", isim=" + isim + ", no=" + no + "]";
	}
}

Dikkat ettiğiniz gibi bu sınıflar toString() adında olmayan ama aynı işleve sahip yaz() ve yazdir() fonksiyonlarına sahiptir. Bu fonksiyonlardan birisi void olarak diğeri String tanımlanmış. Çıktı Tahmin sorularında bunlar gibi nüanslara dikkat buyurunuz.

Yukarıdaki kodu özetlememiz gerekirse öncelikle bir insan sınıfı oluşturduk sonrasında buradan calisan sınıfını genişlettik. Kalıtımın neden gerekli olduğunu anlatmak bu örnekten pek mümkün gözükmüyor o yüzden hayal etmenizi isteyeceğim: eğer insan özelliklerini ve metotlarını taşıyan başka bir sınıf yazmamız gerekseydi ve ortada bir insan sınıfı olmasaydı nolurdu? Cevap basit sadece biraz daha kod yazardık, e neden yazmıyoruz? Çünkü mühendis insan bir miktar tembeldir.

Konudan bir miktar saptıktan sonra gene çok biçimliliğe dönelim. Burdaki kod parçacıkları birbiriyle ilişkilidir ve aralarında hiyerarşi vardır.

  • Minik görev: Buradaki kod parçacığının UML diyagramını çiziniz.

Trace Sorumuza gelelim:

	public static void main(String[] args) {
		insan Alperen = new calisan(51, "Mühendislik", 1634, "ALPEREN");
		System.out.println(Alperen.yazdir()); 
	}
Cevap İçin Tıklayınız

Hata verir çünkü Alperen insandan halt oldu, typecast yapmadan göremez. Typecast yani "(calisan) Alperen"; typecast'in Türkçe'si tür dönüşümüdür. Polymorhpism'in doğası budur.
Doğrusu:

	public static void main(String[] args) {
		insan Alperen = new calisan(51, "Mühendislik", 1634, "ALPEREN");
		System.out.println(((calisan) Alperen).yazdir()); 
	}

Çıktı: calisan [isno=1634, isim_is=ALPEREN, isim=Mühendislik, no=51]

Bu basit soruyu şöyle genişletelim:

	public static void main(String[] args) {
    insan adana = new insan();
		adana.yaz();
		calisan gariban = new calisan();
		insan Alperen = new calisan(51, "Mühendislik", 1634, "ALPEREN");
		System.out.println(((calisan) Alperen).yazdir()); 
		gariban.yaz();
		System.out.println(gariban.yazdir());
	}
Cevap İçin Tıklayınız

fener 1907
calisan [isno=1634, isim_is=ALPEREN, isim=Mühendislik, no=51]
fener 1907
calisan [isno=0, isim_is=null, isim=fener, no=1907]

Çok önemli bilgi-1: interface görürseniz, interface'den kalıtılmış sınıflarda interface içinde soyutlanmış tüm fonksiyonları boş olsa bile yazmayı unutmayınız yoksa derleyici hatası alırsınız.

Hata İdaresi (Exception Handling)

Genellikle hataların derlenme zamanında(compile time) görülmesi istenir çünkü düzgün derlendiği için çalıştığı zannedilen bir ürün(yazılım) iş üstündeyken hata vermesi feci sonuçlar doğurabilir. Gerçi bu istek sınav zamanlarında geçerli değildir :). Her türlü hata için kullanabileceğiniz örnek bir kod kırpıntısını(code snippet) aşağıda görebilirsiniz. Bu kırpıntıda yalnızca 0'a bölüm hatası(divide by zero error) örnek gösterilmiştir ama herhangi bir hata için de bu kırpıntıyı kullanabilirsiniz

import java.lang.Throwable; //tüm hataların en üst kümesi(super class)*1
public class Main
{
  public static void main (String[]args)
  {

    try//hata olursa bunun içinde olsun dediğimiz blok
    {
        System.out.println ("Hello World");
        int a = 666;
        int b = 0;
        System.out.println (a / b);//0'a bolme hatası
    } catch (Throwable e)//ne hatası olursa olsun throw edebilmek için, çünkü Throwable tüm hataların en üst kümesidir
    {
      System.out.println ("Dostum burada bir sikinti var!\n" + e);//hata olduğunda ne olduğunu(neyin throw edildiğini) e ile çıktı veririz.
    }
  }
}

*1