Sponsor Reklam 


15.09.2008 (23:46)

 Nesneye Yönelik Programlama ve Java 
Nesneye yönelik programlama (Object Oriented Programming - OOP), Java'nın temelini oluşturmaktadır.

Giderek artan kod ve veri karmaşıklığının üstesinden gelmek için nesne yönelimli programlama modeli tasarlandı. Programın belirli bir organizasyon çerçevesinde geliştirilmesi, kontrol altına alınması, bir sorun çıktığında hemen müdahale edilebilmesi açısından bu model büyük bir önem taşımaktadır.

Geliştirilen bu modelde, her şeyin anlaşılabilmesi, hiyerarşik özetleme söz konusudur. Bu özetleme sayesinde onun ne işe yaradığını anlayabiliriz. Örnek olarak bir arabada fren sisteminin ne işe yaradığının özetini okuyarak onun işlevini kolay bir şekilde anlayabiliriz. Bunun için freni baştan icat etmeye veya arabayı ve arabanın diğer sistemlerini araştırmaya gerek yoktur.

Modelin temel prensipleri şunlardır:

* Kalıtım (Inheritance)
* Sarmalama (Encapsulation)
* Çok Biçimlilik (Polymorphism)

Kalıtım: Bir sınıfın hiyerarşik olarak üstünde bulunan sınıfı genişletmesi, yani onun özelliklerini devralması ve kendi özelliklerini de eklemesidir. Hayvanları bir sınıf olarak düşünürsek, Sürüngenler bu sınıfın bir alt sınıfıdır. Burada sürüngenlerin hepsinin hayvan olduğunu söyleyebiliriz. Ama her hayvan sürüngen değildir. Sürüngenler sınıfı Hayvanlar sınıfının özelliklerini miras yoluyla (kalıtımla) devralmıştır, o sınıfı genişletmiştir.

Kalıtımın Java'da kullanımı şu şekildedir:

İnsan sınıfını genişleten Futbolcu sınıfını inceleyelim:

Human.java:
package kodcu.net;

public class Human {

  protected String name;
  protected String surname;
  protected int age;

  /**
  * Constructor
  */

  public Human() {
    name = "";
    surname = "";
    age = 0;
  }

  /**
  * Constructor
  * @param name String
  * @param surname String
  * @param age int
  */

  public Human(String name, String surname, int age) {
    this.name = name;
    this.surname = surname;
    this.age = age;   
  } 

  /**
  * Kisinin adini verir
  * @return String
  */

  public String getName() {
    return name;
  }
 
  /**
  * Kisinin soyadini verir
  * @return String
  */

  public String getSurname() {
    return surname;
  }
 
  /**
  * Kisinin yasini verir
  * @return int
  */

  public int getAge() {
    return age;
  }
 
}

Footballer.java:
package kodcu.net;

public class Footballer extends Human {
 
  private String team; // Takimin adi
  private int number;  // Oyuncunun numarasi

  /**
  * Constructor
  * @param name String
  * @param surname String
  * @param age int
  * @param team String
  * @param number int
  */

  public Footballer(String name, String surname, int age, String team, int number) {
    super(name, surname, age);
    this.team = team;
    this.number = number;
  }
 
  /**
  * Takim adini verir
  * @return String
  */

  public String getTeam() {
    return team;
  }

  /**
  * Futbolcunun numarasini verir
  * @return int
  */

  public int getNumber() {
    return number;
  }
 
}

Görüldüğü gibi Futbolcu bir İnsan'dır. Onun adı, soyadı, yaşı genel insan özellikleridir ve İnsan sınıfından miras almıştır. Oysa takımı olması ve oyuncu numarası olması sadece ona hastır. Bu nedenle extends anahtar kelimesi kullanılarak Footballer sınıfı Human sınıfını genişletmiştir (extend etmiştir). Üst sınıf da yer alan bir metot alt sınıfta da tanımlanabilir, onu özelleştirebilir böylece kullanımını kendi amacına yönelik hale getirebilir. Daha açık bir şekilde, üst sınıfta yer alan public ya da protected değişkenler ya da metotlar alt sınıflarca tekrar tanımlanabilir böylece üst sınıflardakiler gizlenmiş olur. Buna geçersiz kılma (overriding) denmektedir.

Örnek verecek olursak, Footballer sınıfında çağrılan getName() metodu normalde Human'da yer alan ve public olan getName()'i çağırmış olur. Oysa aynı metot public özelliğiyle bir de Footballer sınıfında tanımlanmış olsaydı, bu sınıftan yapılan getName() metoduna çağrılar Human sınıfına değil Footballer sınıfdaki getName()'e olacaktı.

Sarmalama: Kodu, veriyi veya nesneyi dış müdahalelerden koruyabilmek için, amacı dahilinde kullanabilmek için, kullanılmayacağı yerlerde gösterimini engellemek için sarmalamaya ihtiyaç duyulmuştur. Gerçekten de temel unsurumuz olan özetleme konusunda sarmalamanın önemi bulunmaktadır. Bu amaçla public, protected ve private anahtar kelimeleri kullanılmaktadır. Yukarıda yer alan Human.java'da name, surname, age bilgileri protected olarak belirtilmiştir. Bu tanımlama bu değişkenlere alt sınıfların da erişebilmesi içindir. public anahtar kelimesi her yerden erişime imkan sağlar. private ise sadece aynı sınıf içinde erişime izin verir.

Çok Biçimlilik: Bir sayının karesini alan bir metot düşünelim. Parametre olarak int, float, double, long gibi farklı tiplerde değer alması gerektiği düşünülürse her biri için bir metot yazılması gerekmektedir. Fakat farklı dillerde her biri için farklı isimde bir fonksion tanımı yapılması gerekmektedir. 

Örnek olarak C'de:
int int_karesini_al(int a) {
  return (a*a);
}

float float_karesini_al(float a) {
  return (a*a);
}

Oysa Java'da aynı isim kullanılarak tek isim çok biçimli olarak kullanılabilmekte bu da programı yazmayı kolaylaştırmaktadır.
public int karesiniAl(int a){
  return (a*a);
}

public float karesiniAl(float a){
  return (a*a);
}

Görüldüğü gibi aynı isimde metoda aşırı yükleme (overloading) yapılmıştır. Metotların yanı sıra yapılandırıcılara da (constructors) aşırı yükleme yapılabilir. Bu, çok biçimliliktir ve Java'nın diğer bir önemli avantajıdır.
Imza: admin








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter