PART 17 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ılar 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. public class Animal{ } public class Mammal extends Animal{ } public class Reptile extends Animal{ } public class Dog extends Mammal{ } 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: public class Vehicle{} public class Speed{} public class Van extends Vehicle{ private Speed vanSpeed; } 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: public class Dog extends Animal, Mammal{} 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. #include <string> class Person { }; class Employee { }; // Teacher publicly inherits Person and Employee class Teacher: public Person, public Employee { }; 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 alması için kullanılır. Interface’ler sınıflar tarafından asla genişletilemezler. PART 18 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. 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: /* File name : EncapTest.java */ public class EncapTest{ private String name; private String idNum; private int age; public int getAge(){ return age; } public String getName(){ return name; } public String getIdNum(){ return idNum; } public void setAge( int newAge){ age = newAge; } public void setName(String newName){ name = newName; } public void setIdNum( String newId){ idNum = newId; } } 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: /* File name : RunEncap.java */ public class RunEncap{ public static void main(String args[]){ EncapTest encap = new EncapTest(); encap.setName("James"); encap.setAge(20); encap.setIdNum("12343ms"); System.out.print("Name : " + encap.getName()+ " Age : "+ encap.getAge()); } } Bu aşağıdaki sonucu üretecektir: Name : James Age : 20 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. PART 19 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: /** * This class draws a bar chart. * @author Zara Ali * @version 1.2 */ 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çıklama @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 19.3 javadoc Çıktıları 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 SqureNum.html dosyasında bulunacaktır. import java.io.*; import java.util.Scanner; sınıfı ile ilgili dökümantasyon /** * 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: $ javadoc SquareNum.java Loading source file SquareNum.java... Constructing Javadoc information... Standard Doclet version 1.5.0_13 Building tree for all the packages and classes... Generating SquareNum.html... Generating package-frame.html... Generating package-summary.html... Generating package-tree.html... Generating constant-values.html... Building index for all the packages and classes... Generating overview-tree.html... Generating index-all.html... Generating deprecated-list.html... Building index for all classes... Generating allclasses-frame.html... Generating allclasses-noframe.html... Generating index.html... Generating help-doc.html... Generating stylesheet.css... 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.