Java’da Kalıtım, Kapsülleme ve JavaDoc

17. Kalıtım

Kalıtım; bir nesnenin, başka bir nesnenin özelliklerinin edinmesi işlemi olarak tanımlanabilir. Kalıtımın kullanımı ile, bilgi hiyerarşik sırayla yönetilebilir.

Kalıtımdan bahsettiğimiz zaman, genelde en çok kullanılan anahtar kelimeler extends ve implements olmaktadır. Bu kelimeler, bir nesnenin, diğer bir nesnenin IS-A türünde olup olmadığını belirleyecektir. Bu anahtar kelimeleri kullanarak, bir nesnenin başka bir nesnenin özelliklerini edinmesini sağlayabiliriz.

17.1 IS-A İlişkisi

IS-A, bu nesne o nesnenin bir türüdür, demenin bir yoludur. O zaman extends anahtar kelimesinin, kalıtımı gerçekleştirmek için nasıl kullanıldığına bir bakalım.

Yukardaki örneğe dayanarak, aşağıdakiler tanımlar Object Oriented açısından doğrudur:

  • Animal, Mammal sınıfının üstsınıfıdır.
  • Animal, Reptile sınıfının üstsınıfıdır.
  • Mammal ve Reptile, Animal sınıfının altsınıflarıdır.
  • Dog, hem Mammal hemde Animal sınıfının altsınıfıdır.

Eğer IS-A ilişkisini dikkate alırsa, bunları söyleyebiliriz:

  • Mammal IS-A Animal (Mammal bir Animal’dır)
  • Reptile IS-A Animal(Reptile bir Animal’dır)
  • Dog IS-A Mammal(Dog bir Mammal’dır)
  • Bu yüzden : Dog IS-A Animal(Dog da bir Animal’dır)

Extends anahtar kelimesinin kullanımı ile; altsınıflar, üstsınıfların private özellikleri hariç bütün özelliklerini kalıt alabilecektir.

Instance operatör kullanarak, Mammal sınıfının aslında bir Animal sınıfı olduğuna emin olabiliriz.

17.2 HAS-A İlişkisi

Bu ilişkiler başlıca kullanıma dayanırlar. Bir sınıfın bir şeyle HAS-A(sahip) ilişkisi olduğunu belirler. Bu ilişki, kod tekrarının azaltılmasına yardım etmekle birlikte bug’ların da azaltılmasına yardımcı olur.

Örnek içinde bir bakalım:

Bu diyagram, Van sınıfının Speed sınıfına sahip olduğunu göstermektedir.(HAS-A) Speed için ayrı bir sınıfa sahip olursak, Van sınıfı içinde Speed’e ait bütün bir kodu koymak zorunda değiliz, bu da Speed sınıfını birden çok uygulama içinde tekrar kullanılmasını mümkün kılar.

17.3 Tekil/Çoğul Kalıtım

Bir önemli konuda, Java’nın sadece tekil kalıtımı desteklediğidir. Bu da , bir sınıfın birden çok sınıfa genişletilemeyeceği anlamına gelmektedir. Sonuç olarak, aşağıdaki kural dışıdır:

Bununla birlikte, C++ çoklu kalıtım yeteneği sağlar. Çoklu kalıtım, türetilmiş sınıfın birden çok parent sınıfının üyelerini kalıt almasına olanak sağlar.


Java, Çoklu Kalıtım fonksiyonelliğini sağlamak için Interface’leri kullanır. Bir sınıf , bir veya birden çok interface uygulayabilir. Bu özellik, Java’nın çoklu kalıtım imkansızlığından kurtulmasını sağlar.
implements anahtar kelimesi, sınıfların interface’lerden kalıtılması için kullanılır.
Interface’ler sınıflar tarafından asla genişletilemezler.

18.Kapsülleme

18. 1 Kapsülleme(Encapsulation)

Kapsülleme, temel bir nesne yönelimi programlama konseptidir.  Kapsülleme, bir sınıf içindekileri alanları(field) private yapıp , bu alanlara public metotlarla erişebilme tekniğidir. Eğer alan private olarak deklare edilmişse, ona sınıf  dışından erişilemez, böylece sınıf içindeki alanları gizlemiş oluruz. Bu sebepten ötürü, kapsülleme veri gizleme olarak da adlandırılır.

resim1

Kapsülleme, sınıfın dışında tanımlanmış bir kodun, sınıfın içindeki veri ve koda rastgele erişimini engelleyen bir koruyucu bariyer olarak tanımlanabilir. Veri ve koda erişim, getter ve setter’lar aracılığıyla sıkı bir şekilde kontrol edilir.

Örnek:

Kapsüllemeyi anlatan örneğe bir bakalım:
resim2

resim3

Public metotlar, bu sınıfın alanlarına java dünyası dışından erişim noktalarıdır. Bu nedene, değişkenlere erişmek isteyen herhangi bir sınıf, onlara getter ve setter’lar üzerinden erişmelidir.
EncapTest sınıfının değişkenlerine aşağıdaki gibi erişilebilir:

resim4

Bu aşağıdaki sonucu üretecektir:

resim5

Kapsüllemenin faydaları:

  • Sınıfın alanları, salt okunur veya salt yazılır yapılabilir.
  • Sınıfın kullanıcıları, verinin nasıl tutulduğu hakkında bir bilgisi yoktur. Bir sınıf, bir alanın veri türünü değiştirebilir ve sınıfın kullanıcılarının kodlarını değiştirmeleri gerekmez.

19. Javadoc

Java, üç tür comment(yorum) desteklemektedir. İlk ikisi // ve /* */ dır. Üçüncü tür ise dökümantasyon yorumu olarak adlandırılır. /** karakter dizi ile başlayıp, */ ile biter.

Dökümantasyon yorumları, programın kendisi hakkında program bilgi gömmenize yarar. Sonra javadoc hizmetini kullanarak, program hakkında bilgi çıkartıp bu bilgiyi bir HTML dosyasına koyabilirsiniz.

Dökümantasyon yorumları, programınızın dökümanını elverişli kılar.

19.1 Dökümantasyon Yorumları

/** ile başladıktan sonra, ilk satır veya satırlar sınıfınızın, değişkeninizin veya metodunuzun ana açıklaması olur. Ondan sonra, bir veya birden fazla @ etiketi ekleyebilirsiniz. Her @ etiketi, yeni satırın başlangıcında veya satırların başında (*) asterisk sembolünden sonra gelebilir.

Bir sınıfın dökümantasyon yorumu örneği:

19.2 javadoc Etiketleri

Bazı javadoc etiketleri:

Tag Description Example
@author Sınıfın yazarını tanımlar @author tanımlama
@exception Metot tarafından atılmış istisnayı tanımlar. @exception istisna-ismi açıklam
@param Metot paramentleri gösterir. @param parametre-ismi açıklama
@return Metodun return değerini gösterir. @return açıklama
@since Belirli bir değişiklik yapıldıysa release’i vurgular. @since release
@throws @exception ile benzer. @throws etiketi @exception etiketi ile aynı anlama gelmektedir.
@version Sınıfın versiyonunu belirtir. @version info

javadoc programı, girdi olarak Java programınızın kaynak dosyasını alır ve çıktı olarak programın dökümantasyonunu içeren bir çok HTML dosyası alır.

Her sınıf için bilgi, kendisinin HTML dosyasında olacaktır. Java hizmeti olan javadoc ayrıca, bir index ve hiyerarşi ağacını da çıktı alır. Diğer HTML dosyaları üretilebilir.

Örnek:

Aşağıdaki, dökümantasyon yorumlarını kullanan örnek bir programdır. Her yorum, tanımladığı maddeden önce gelmektedir.

javadoc çalıştırıldıktan sonra, SquareNum sınıfı ile ilgili dökümantasyon SqureNum.html dosyasında bulunacaktır.

    import java.io.*;
    import java.util.Scanner;
    /**
    * This class demonstrates documentation comments.
    * @author Ayan Amhed
    * @version 1.2
    */
    public class SquareNum {
    /**
    * This method returns the square of num.
    * This is a multiline description. You can use
    * as many lines as you like.
    * @param num The value to be squared.
    * @return num squared.
    */
    public double square(double num) {
    return num * num;
    }
    /**
    * This method inputs a number from the user.
    * @return The value input as a double.
    * @see IOException
    */
    public double getNumber() {
    Scanner inData = new Scanner(System.in);
    String str = inData.nextLine();
    return Double.parseDouble(str);
    }
    /**
    * This method demonstrates square().
    * @param args Unused.
    * @return Nothing.
    */
    public static void main(String args[]) throws IOException
    {
    SquareNum ob = new SquareNum();
    double val;
    System.out.println("Enter value to be squared: ");
    val = ob.getNumber();
    val = ob.square(val);
    System.out.println("Squared value is " + val);
    }
    }

Yukarıdaki SquareNum.java dosyasını javadoc hizmeti ile birlikte çalıştıralım:

19.4 Eclipse’te JavaDoc Üretme

  1. Eclipse Projesi açalım
  2. Project –> Generate JavaDoc kısmını seçelim
  3. Sihirbazın ilk adımında, ayarları şu şekilde tanımlayalım:
    1.   javadoc.exe aracı için JDK’dan yol
    2.  JavaDoc üreten proje kaynakları;
    3. Görünülebilirliğine dayanarak JavaDoc üreten sınıflar ve metotlar;
    4. JavaDoc konumu (by default it will be placed in the doc folder in the project location)

4. İkinci adımda:

  1. dökümantasyon yapısı;
  2. İşlenecek JavaDoc etiketleri;
  3. diğer kaynaklar(archives, projects);
  4. Dökümantasyon için, CSS style sheet;

5. Son adımda finish butonuna tıklayın.