Previous
Next

JAVA - Inheritance(Kalıtım) nedir?

by Cem Kefeli 28. Kasım 2010 03:44

JavaDaha önce nesneye yönelik bir dilin olmazsa olmazlarından birisi olan kalıtım(Inheritance) konusundan "Polymorphism nedir?" başlıklı yazım içerisinde bahsetmiştim. Çünkü çok biçimlilik(Polymorphism) kalıtım ile oldukça iç içe geçmiş ve kalıtımın yok açtığı doğal sonuçların bir uygulaması olarak göze çarpmaktadır. Dolayısı ile kalıtımın olmadığı bir ortamda çok biçimlilikten söz etmek olanaksızdır.

OOP(Object Oriented Programming) diyorsak nesnelerden bahsediyoruz demektir. Herşey nesne olarak düşünülebilir. Nesneler ise birbirlerinden türeyebilmektedir. Örneğin bir ana sınıf düşünün aklınızda, bir de bu ana sınıfın yavrucuklarını düşünün. Yavrucukları diyorum ama, bunu yavru sınıflar daha küçüktür, daha az öğe içerir gibi düşünmeyin sakın. Tam tersine bu yavrucuklar daha gelişkin olabilirler. Annelerinin tüm özelliklerine sahip olurlar da, hatta bir de annelerinden farklı başka özellikler de içerebilirler. Bu yavrucukların da yavrucukları olabilir. Bu böyle devam eder gider. Hemen aşağıda kalıtımın olduğu bir ortamdan ve bunun uygulamalarından bahsetmeye çalışacağım.

Sağ tarftaki UML diagramında bir kalıtım yapısı bulunmakta. TASIT ana sınıfı(Base class) BenNeyim isminde bir fonksiyon ve integer türünde Deger1, Deger2, Deger3 isimli üç farklı değişken bulundurmaktadır. TASIT sınıfına ait BenNeyim isimli fonksiyon kendisinin bir taşıt olduğunu belirten log yazdırmaktadır. MOTORLUTASIT ve MOTORSUZTASIT sınıfları ise TASIT ana sınıfından türemekte ve Deger4 isimli integer türünden bir değişken bulundurmaktadır. Java dilinde türetme işlemleri extends anahtar sözcüğü ile yapılmaktadır. Deger4 ise ana sınıfta bulunmayan ve türeyen sınıflar(Derived class) ile birlikte gelen bir değişkendir. Peki ya ana sınıftaki Deger1, Deger2, Deger3 isimli değişkenlere ne oldu? Acaba yeni türeyen MOTORLUTASIT ve MOTORSUZTASIT sınıfları içerisinden bu değişkenlere erişip kontrol edebilir miyim ki? Bu sorularımıza ve merakımıza biraz daha gem vuruyor ve şimdilik aklımızın bir köşesine yazarak az sonra öğrenmek için bir kenera bırakıyoruz. Dikkat edilirse yeni türettiğimiz Inheritance UML sınıflar ile birlikte güzel bir ayrıntı gözümüze çarpar oldu. Artık " Türeyen her sınıf, ana sınıfı içerir" diyebiliriz kolay bir şekilde. Yani bir bakıma her MOTORLUTASIT ve MOTORSUZTASIT aslında birer TASIT'tır demek oluyor bu. İşte aralarında bu şekilde ilişki kurulabilen her ortamda kalıtımdan söz etmek mümkündür. Bu bahsettiğimiz 'IS A' ilişkisi olarak bilinmektedir. ("MOTORLUTASIT IS A TASIT" == MOTORLUTASIT bir TASIT'tır.) Yine bu türemiş sınıflara ait BenNeyim fonksiyonu da sınıfın ne olduğunu yazdırmaktadır. TAKSI ve OTOBUS, MOTORLUTASIT sınıfından türeyen sınıflardır. Fakat bu sınıfların kendisine özgü başka değişkenleri oluşturulmamıştır. Oluşturulma zorunluluğu da yoktur zaten. Ana sınıf içerisinde soyut(Abstract) olarak belirtilmedikçe override edilmesine gerek yoktur. Fakat ana sınıf içerisinde soyut olarak tanımlanmış bir öğenin alt sınıf içerisinde mutlaka override edilme zorunluluğu bulunmaktadır. Yazının ilerleyen bölümlerinde bu konuları daha detaylı inceleyeceğiz. Yalnızca MOTORLUTASIT sınıfına da kalıtım yolu ile geçen BenNeyim fonksiyonu iptal edilmiş(Override) ve kendisine özgü bir içerik oluşturulmuştur. Aynı şeyleri OTOBUS sınıfı için de söylemek mümkündür. BISIKLET sınıfı ise MOTORSUZTASIT sınıfından türemektedir ve tıpkı TAKSI ve OTOBUS gibi kendisine özgü yeni değişkenleri bulunmamaktadır. TAKSI, OTOBUS ve BISIKLET sınıflarının üçüde kalıtım ile kendilerine geçen BenNeyim fonksiyonu içerisine kendisinin ne olduğunu yazdıran yeni kod blokları eklemişlerdir. Yukarıda sorduğumuz sorunun bi benzeri de burda söz konusudur. MOTORLUTASIT ve MOTORSUZTASIT türemiş sınıfları içerisinde yeni oluşturulan Deger4 isimli değişkeni acaba TAKSI, OTOBUS ve BISIKLET sınıfları içerisinde kullanabilir miyim? En alt sınıf olan TASIT sınıfı içerisinde bu değişkenin olamamasına rağmen. İşte şimdi yavaş yavaş bu UML diagramına göre hazırlanmış ve bazı eklentiler yapılmış aşağıdaki kod bloğuna bakma ve sorularımızın cevabını alma vakti geldi. Fazlası...

JAVA - Abstract(Soyut) sınıflar ve metodlar

by Cem Kefeli 27. Mayıs 2010 04:00

JavaJava programlama dili için soyutlama demek; birilerini soyut tanımlanan her şeyi override etmeye mecbur kılmak demektir dersem sanırım çok da mantıksız olmaz. Biraz karışık mı oldu? O halde devam edelim.... Java'da soyutlama sınıflara ve metodlara uygulanabilmektedir. Aslında buraya kadar söylediğim herşey C# için de aynı. Soyutlama bir konsepttir aslında, dilden dile pek bir farklılık içermez. Soyut tanımlanan hiçbirşey kendi başlarına işe yaramazlar, iş görmezler. Yalnızca bir yol gösterici bir kılavuzdurlar aslında. İçerikleri de yoktur soyut metodların. Soyutlama, kalıtım ile tamamen ilgilidir. Zira az önce bahsettiğim bu yol gösterme ve kılavuzluk türeyen yeni nesnelere yapılmaktadır.

Şimdi biraz daha derinlere dalalım. Kalıtım ve overriding ile ilgili detaylı bir inceleme "Inheritance(Kalıtım) nedir?" başlıklı yazım içerisinde yapmıştım. Soyutlama da kalıtım ve overriding ile çok iç içe olduğu için eksiği olduğunu düşünenler ilk önce burayı tıklayarak gerekli alt yapıyı kurabilirler. Abstract Classes UML Şimdi asıl konumuza geri dönecek olursak, biliyoruz ki ana sınıftan türeyen yavru sınıflar içerisinde ana sınıflara ait metodları override edebiliyorduk. Fakat bu tamamen bizim isteğimize kalmış bir durumdur. Yani siz eğer override etmek isterseniz edersiniz, eğer override etmek istemezseniz ya da buna gerek duymuyorsanız kimse size neden override etmedin diye sormaz. Override etmemeniz derleme zamanında(compile time) ya da çalışma zamanında(run time) herhangi bir hataya da sebebiyet vermez. Pekiala biz eğer bir metodun, metodun içinde bulunduğu sınıftan türeyen tüm alt sınıflarda override edilmesini istiyorsak ne yapmalıyız? İşte soyutlama tam olarak burada karşımıza çıkmaktadır. Yani yazdığımız sınıftan türeyen tüm yavrucularda belirttiğimiz sınıfltarın override edilmesini ve yeniden bir içerik oluşturulmasını zorunlu kılabiliyoruz bir metodu abstract(soyut) tanımlayarak. Bir metodun soyut olarak tanımlanması o metodun bulunduğu sınıftan türeyen tüm sınıflarda override edileceğini garanti altına alır. Peki bu bizim için neden gereklidir? bırakalım da ona yeni sınıfı türeten adam karar versin diyemez miyiz? Diyemeyiz... Şöyle ki; tanımladığımız soyut metod alt üyelerde de mutlaka bulunması gereken fakat ana sınıf için birşey ifade etmeyen bir yapıya sahip olabilir. Yani bu cümleden sonra şu kanıya varabiliriz. Soyut metodlar ana sınıflar için anlamsızdır ve birşey ifade etmezler, asıl anlamlarını ise yavru sınıflar içerisinde kazanırlar. Şimdi bir örnek yaparak bu dediklerimizi biraz daha somutlaştıralım. Sağ taraftaki şekilde örneğe ait UML diagramını bulabilirsiniz.Fazlası...

JAVA - Interfaces(Arayüzler)

by Cem Kefeli 18. Ekim 2009 10:52

JavaJava'da kalıtımın nasıl gerçekleştirildiğini "Inheritance(Kalıtım) nedir?" başlıklı yazım içerisinde görmüştük. Kalıtım, OOP(Object Oriented Programming) bir dilde olmazsa olmazlardandır ki, uygulama geliştiricilere çok büyük güzellikler sunar. Tüm canlılarda olduğu bigi nesneler arasında da kalıtım ilişkisi kurulur ve yeni yeni türler tanımlanmasını mümkün kılar. Bir nesne tanımlarsınız, sonra bu nesneden başka bir nesne daha türetebilirsiniz. Fakat ya iki ya da daha çok nesnenin bir araya gelip bir nesne oluşturmasını isterseniz ne olacaktır? İşte burada durum karışıktır! Çünkü java çoklu kalıtmı desteklemez. Bir nesneyi yalnızca bir tane nesneden türetebilirsiniz. Bu aşamada imdadımıza Interfaces(Arayüzler) yetişir ve her ne kadar tam anlamıyla çoklu kalıtım olmasa da buna benzer bir davranışı bizlere sunar.

  • Arayüzler içerisinde yalnızca Abstract(Soyut) metodlar ve sabitler(constants) bulundurabilirler, gövdeli metodlar barındıramazlar. Soyut metodları ve sınıfları incelerken de soyut sınıfların bir birleştirici rol oynadıklarını, soyut sınıflardan türeyen sınıflara adete bir kılavuz gibi yol gösterdiğinden bahsetmiştik. Fakat soyut sınıflar gövdeli metodlar yani iş yapabilen metodlar da barındırabiliyorlardı.
  • Ayrıca bir sınıfın birden fazla soyut sınıftan türemesi de söz konusu değildi.
  • Hem soyut sınıflarda hem de arayüzlerde ortak olan bir nokta ise, soyut sınıflarda abstract olarak tanımlanan ve arayüzlerde tanımlanan her metodun bu soyut sınıf ve arayüzlerden türeyen tüm sınıflarca override edilmesi gerekliliğidir. Bu arada şunu söylemek gerekir ki arayüzler içerisindeki metod tanımlamalarında soyut sınıflarda kullandığımız gibi abstract anahtar sözcüğünü kullanamıyoruz. Nedeni ise arayüzlerin içerisindeki tüm metodların zaten abstract olarak değerlendirilmesidir. Dilin mimarisini oluşturanlar ayrıca bir daha abstract tanımlama yapılmasını gerekli görmemişler. Eğer yazarsanız hata mesajı ile karşılaşırsınız.
  • Bir diğer nokta ise arayüz içerisinde yapılan tüm metod tanımlamaları için bir erişim belirleyicisinin kullanılamayacağıdır. Varsayılan erişim belirteci olarak public seçilmiştir ve sizin bunu değiştirme şansınız da yoktur. Eğer bir metodun erişim belirleyicisini değiştirip örneğin private gibi bir erişim belirteci verebilseydiniz türeyen sınıflarda bu metodları override edebilmek imkansız olacaktır. Bu da arayüzler içerisindeki tüm metod tanımlamaları türeyen sınıflarda override edilmelidir ilkesi ile çelişecektir. Tabi ki metodların dönüş bildirim değerlerinin olmayacağı anlamına gelmemektedir ve bu ikisi birbirinden ayrı şeylerdir.Arayüzler içerisinde metodlar haricinde global alanlar da tanımlayabildiğimizi söylemiştik. Erişim belirleyicisi olarak bu alanlarlar da yine public olarak değerlendirmektedir. Bunu da sizin değiştirme şansınız yoktur. Ayrıca alanlara static ve final erişim belirteci de eklenmiştir, metodlardan farklı olarak. Tabiki bunlar arayüzler içerisinde birebir olrak yazan şeyler değildir. Yazılmasa dahi varsayılan olarak kabul görmektedirler.
  • Soyut sınıflardan başka soyut sınıflar türetebiliyorduk. Bu böyle arda arda devam edip gitmekteydi. Yine hatırlarsanız türeyen soyut sınıflarda, türedikleri soyut sınıf içerisinde yer alan soyut metodları override etme gibi bir zorunluluk da yoktu. Aynısı arayüzler için de geçerlidir. Arayüzler de başka arayüzlerden türeyebilmektedir ve bu özellik de arayüzler arasında da kalıtım ilişkisinin kurulabilmesini sağlamaktadır.

Bu birkaç önemli noktanın üzerinde durduktan sonra şimdi biraz daha uygulamaya dönük birşeyler yapabiliriz artık. Uygulama demişken Java'da arayüzler interface anahtar sözcüğü ile tanımlanmakta ve implements anahtar sözcüğü ile de uygulanmaktadır. Aşağıdaki örnekte yukarıda bahsettiğimiz bu birkaç özellik ile ilgili bir uygulama vermekteyim.Fazlası...

JAVA - Packages(Paketler) kavramı nedir?

by Cem Kefeli 15. Ekim 2009 00:22

JavaDiyelim ki bir başka eve taşınacaksınız. Yani kolileri hazırlama vakti geldi çattı... İlk iş gidip koli bulmak olur heralde, sonra da eşyaları bu kollerin içine düzgün ve anlamlı bir şekilde yerleştirmek. Nasıl yerleştiririz ki acaba? Kırılabilecek mutfak eşyalarını bir koliye, giyecekleri bir koliye, temizlik malzemelerini bir ya da birden çok koliye koyarsak hem daha düzenli olurlar hem de aradığımızı daha kolay bulabiliriz heralde.

Buraya kadar olan kısım, olaya bir girişti aslında. Wink Fakat bu koli paketlerinin mantığının java'da kullanılan paket kavramından hiç bir farklılığı yok. Temel olarak özetlemek gerekirse; Java'da paketler, aynı amaç üzerinde çalışan kod bloklarını bir araya toparlayabilmemiz için kullanılmaktadır. Java'da oluşturulan paketler 'package paket_ismi;' notasyonu ile belirtilmektedir. Bununla ilgili örnek vereceğim ilerleyen satırlarda. Aslında C# kullananların yakından tanıdığı namespace kavramından hiçbir farkı yoktur Java'daki paket kavramının. Oluşan paketlerin kullanılabilmesi için ise import anahtar sözcüğü kullanılmaktadır. Bu da C#'daki using anahtar sözcüğüne karşılık düşmektedir.
Az önce aynı amaç için kullanılan kod parçacıklarının bir araya toparlanmasından bahsetmiştik. Örneğin IO ve math birer paket örneğidirler. IO paketi java'da kullanılan dosya girdi/çıktı işlemleri için yapılabilecek gerekli sınıfları bulundurmaktadır. Yani temel işlevi dosya girdi/çıktı işlemlerin yapılabilmesidir. Math paketi ise matematik işlemlerinin yapılabilmesinden sorumludur ve kullanılabilecek neredeyse tüm matematik işlemlerini bulundurmaktadır. Bu örnekler paketlerinin içeriğinin ne kadar güzel hazırlandığı ve tüm bu aynı amaca hizmet eden kodların nasıl bir araya toplandığına güzel bir örnektir. Paketlerin isimlerinin de güzelce seçilmesi çok önemlidir. Çünkü isimleri içeriklerinin ne olduğunu ve hangi özelleşmiş yapıları barındırdığını güzel bir şekilde anımsatmalıdır.

Aşağda verdiğim örnekte bir paketin uygulamamız tarafından nasıl kullanılabileceğini göstermekteyim.

Main.java  |  Netbeans Projesini indir Packages1.rar (12,43 kb)  |  Gizle  |  Göster
import java.io.*;
import java.math.*;

/**
 *
 * @author Cem KEFELİ
 * http://www.cemkefeli.com
 */
public class Main
{
    public static void main(String[] args)
    {
        // Matematik işlemleri
        double Sayi1 = 5.0;
        double Sayi2 = 3.0;
        double Sayi3;
        Sayi3 = Math.pow(Sayi1, Sayi2);
        System.out.println("Sayi1= "+Sayi1+", Sayi2= "+Sayi2+", Sayi1^Sayi2= "+Sayi3+"");
        //
        // Dosya İşlemleri
        try
        {
            // Dosyayı oluştur
            FileWriter fstream = new FileWriter("out.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("Merhaba dosya");
            //Output stream'i kapat
            out.close();
        }
        catch (Exception e) //Catch exception if any
        {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

Fazlası...

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General