PART 17

advertisement
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.
Download