Java Programlama Dilinde Sınıf Yapıları

Java Programlama Dilinde Sınıf Yapıları

JAVA PROGRAMLAMA DİLİNDE SINIF (CLASS) YAPILARINA GİRİŞ

Java Programlama Dilinde Sınıf Yapıları önemli bir konu olup, önce terimsel karşılıklarını vererek başlayalım.

Class : sınıf ana nesne kökenli programlama elemanı.

Object : nesne sınıf (Class) yapıları bilgisayar belleğinde bir işlem için kullanıldığında aldıkları (özel) isim.

new       : sınıfların kurucu metotunu çağırıp nesne tanımını ve bilgisayar adreslerini oluşturan deyim

Method: metot sınıfların içindeki işlevsel program parçacıkları

Constructor : Kurucu metot nesne ilk defa oluşturulurken hangi sınıf değişkenlerinin hangi değerleri alacağını belirleyen metot

SINIF YAPISININ GENEL TANIMI

Şu na kadarki bütün Java programlarımızda sınıf (class) yapısını kullandık. Fakat tam olarak sınıfların ne olduğunu ve neler yapabileceklerini anlatmadık. Sınıf yapısının en önemli özelliği yeni bir değişken türü tanımlıyor olmasıdır. Şu ana kadar bilgisayar programlarımızı tanımlamak amacıyla çeşitli sınıflar tanımladık. Bu bölümde sınıfların değişken türü olarak tanımlamasını ve kullanmasını göreceğiz. Sınıf (Class) deyince herhangi bir nesnenin genel tanımlanmasını anlıyoruz. Bu sınıflardan değişkenler tanımlandıklarında nesneleri oluştururlar. Örneğin kalem dediğimizde genel bir sınıfı anlatıyoruz. Alinin cebindeki kırmızı kalem ise belirli bir nesnedir. Sınıfın genel tanımı şu şekilde yapılabilir :

class sınıfın_ismi { //sınıfa ait değişken listesi değişken_türü değişken_ismi; değişken_türü değişken_ismi; ……… //sınıfa ait metot listesi degişken türü metotadı(metot girdi değişken listesi) { //metotun içindeki hesaplanan işlemler return çıktı_değişkeni; } ………….. }

Sınıf (class) tanımında metotların (veya değişkenlerin) bulunması şart değildir. Bulundukları takdirde bunlar o sınıfa ait veya sinifin üyesi metotlar olarak düşünülür. İlk sınıf örneği olarak içinde hiçbir metotun yer almadığı bir kutu sınıfı tanımlıyalım. Bir kutuyu üç geometrik boyutu (eni,boyu,yüksekliği) cinsinden tanımlayabiliriz.

class Kutu { double en; double boy; double yukseklik; }

Üstte bahsettiğimiz gibi sınıf yeni bir değişken türü yaratır. Yukardaki sınıfın yarattığı değişken türünün adı Kutu’dur. Kutu değişkenini başka bir proğramda tanımlarken bu değişken türünden bir nesne yaratılır. Örneğin

Kutu kutu1= new Kutu();

kutu1, kutu türünde tanılanmış bir nesnedir. Bu nesnenin kendisinin de en boy ve yükseklik olmak üzere üç alt değişkeni mevcuttur. Eğer bir programda kutu1 değişkeni tanımlanmışsa, bu değişkenin alt degişkenlerine şu şekilde ulaşılabilir :

kutu1.en=1.0;

Şimdi Kutu sınıfından nesneyi kullanacak ufak bir kututestı sınıfı oluşturalım ve Kutu sınıfını bu sınıfta kullanalım.

Program 3.1 : sınıf örneği, Kutu sınıfı tanımlayan kututesti.java programı

JAVA PROGRAMLAMA DİLİNDE SINIF YAPILARI

Bu programın adının kututesti.java olması zorunludur. Çünkü ana metot(main) kututesti sınıfında tanımlanmıştır. Fakat programı javac terimiyle bilgisayar diline çevirdiğimizde iki tane sınıf(class) dosyasının oluştuğunu görürüz. Birisi Kutu.class diğeride kututesti.class. Ana program kututesti olduğu için bu programın işletimi java kututesti deyimini kullanarak yapılır. Program işletildiğinde sonucunu verir. kutu1 nesnesi yaratıldığında bilgisayar belleğinde kutu1 için bir adres tanımlanır. New Kutu() deyimi verildiğinde ise bilgisayarın belleginde en,boy ve yükseklik değişkenleri için yer ayrılır ve bu yerlerin adresleriyle kutu1 nesnesinin adresi arasında bağlantı sağlanır. Bunu grafik olarak anlatalım :

Tablo 3.1 Nesne adreslerinin bilgisayar belleğindeki yerleri ve yerleşmesi
Deyim Bilgisayar ana nesne belleği Nesne alt hafıza belleği
Kutu kutu1; null Mevcut değil
  kutu1=new Kutu();   Kutu1   kutu1 adresi (örneğin: 23436A3F) en Boy Yükseklik

Not: null terimi bilgisayar belleğinin boş olduğunu gösterir. Yukarıdaki grafikte ilk olarak

tanımı yapıldığında bilgisayar belleğinde 1 byte boyutunda bir yer tanımlar. Ve bu yere boş anlamına gelen null degerini yükler. İkinci durumda ise (kutu1=new Kutu() tanımında) kutu1 nesne adresindeki kutuda en,boy,yükseklik değişkenlerinin adresleri kaydedilmiştir. Bu adres aracılığıyla en boy ve yükseklik değişkenlerine kutu1 degişkeni üzerinden ulaşılabilir. Diğer deyimle en,boy,yükseklik kutu1 nesnesinin alt değişkenleridir.

KURUCU ( CONSTRUCTOR ) METOT

İkinci bir programda Kutu sınıfı iki nesne tanımlama gereği duyduğumuzu varsayalım. Buna örnek olarak Program 3.2 de kututesti1.java programı tanımlanmıştır.

Bu programda Kutu sınıfından kutu1 ve kutu2 değişkenleri tanımlanmıştır. Bu basit programda bile en,boy ve yükseklik değikenlerini iki defa çağırmak program listesinin uzamasına sebep olmuştur. Gerçek uygulamalarda ise çok daha yüksek sayıda değişken içeren sınıflar oluşturulabilir ve bu sınıflarda oluşturulan toplam nesne sayısı da çok fazla olabilir. Bu yüzden nesneyi ilk tanımlarken aynı zamanda değişkenlerinin değerlerini de tanımlayabilirsek, çok daha okunaklı ve kısa bir bilgisayar listesiyle aynı işi yapabiliriz. Bu iş için kurucu (constructor) adı verilen metotlar kullanılır. Kurucu metotları diğer metotlardan biraz farklıdır. Önce metot önüne metot değişken türü gelmez ve metot dışına hiçbir değişken göndermezler. İsimleri de herzaman sınıf(class) ismiyle aynı olur.

Tanımına bırakmış ve kututesti2 sınıfı yazılırken en, boy yükseklik değişkenlerinin yeniden tanımlanması ihtiyacını ortadan kaldırmıştır.

Java Programlama Dilinde Sınıf Yapıları Diğer Metotlar

JAVA PROGRAMLAMA DİLİNDE SINIF YAPILARI Tekrar yukarıda incelediğimiz kutu sınıfını göz önüne alalım. Hacim bir kutunun özellikleri arasında yer alır, ve her zaman kutunun hacminin hesaplanması gerekebilir. Bu yüzden hacim işlemini Kutu sınıfının içinde tanımlamak daha ideal olacaktır. Program 3.4 deki kutuornegi3.java programında hacim hesaplarını yapan hacim metotu Kutu sınıfının içinde tanımlanmıştır.

Bir önceki bölümde metot yazımı konusunda anlattıklarımızın hepsini buraya ilave edebiliriz. Sınıfın içinde her türlü metodu yazarak çalıştırma hakkına sahibiz. Ek olarak sınıf tanımı tam olarak yapıldığı içim artık sınıf değişkenleri ile interaktif olarak çalışan dinamik metodları da daha iyi anlama olasılığı oluştu.

Java Programlama Dilinde Sınıf Yapıları This Deyimi

Java Programlama Dilinde Sınıf Yapıları, bazen bir metotun içinde o metotun ait olduğu sınıftan yaratılacak nesneyi veya o nesnenin bir alt değişkenini tanımlamak gerekir. Nesne daha tanımlanmadığından direk olarak nesne ismini kullanamayız. Bunun yerine java this deyimini kullanır. This deyimi bilhassa sınıfa ait değişken isimlerinin aynısı metotda kullanılmışsa da işe yarar. Bu durumda tüm sınıfa ait değişkenler this.değişken_ismi komutuyla çağıralabilir.

Sınıfa ait her değişkeni başına this. getirerek kullanabiliriz. Fakat this kullanımı mutlaka gerekli değilse kullanılmaması tavsiye edilir.

Örneğin yukarıdaki kurucu metot kutu şeklinde this değişkenini kullanarak da yazılabilirdi. Burada girdi değişkeni ile sınıf değişkeninin adı aynı verilmiştir. This sol taraftaki değişkenin sınıf değişkeni olduğunu bilgisayara bildirmektedir.

Bir sonraki örnekte bir robot sınıfı tanımlanmıştır. Çeşitli kurucu metodlarla robotun ilk pozisyonu ve adı tanımlanmıştır. Robotu belli yönlere döndüren ve ilerleten ek metodlar mevcuttur. Dördüncü kurucu metodda girdi değişkeni olarak robot sınıfından r1 değişkenini kullandığımızı not edelim.

Bir sonraki sınıf örneğimizde kompeks sayılar tanımlanmaktadır. Kompleks sayılar iki alt bileşeni olan sayılardır

Sınıf Değişkenlerinin Gizlenmesi

Yukarda incelediğimiz kutu metodu. Program 3.5 de daha detaylı yazılmıştır. Burada en boy ve yükseklik değişkenleri private olarak tanımlanmıştır. Private olarak tanımlanan değişkenlere dışarıdan direk olarak

Kutu x=new Kutu(3.0,5.0,7.0); x.en=8.0;

gibi direk ulaşım mevcut değildir. Bu değişkenlere ulaşım (değerlerini değiştirme veya çağırma) ancak ulaşım metodları adını verdiğimiz metodlar aracılığıyla yapılabilir.

İkinci bir örnek olarak dört işlem hesap makinasi sınıfına bakalım. Burada da sınıf değişkenleri protected olarak tanımlanmıştır. Aşağıda dort işlem (toplama cıkarma carpma bolme yapan dort islem hesap makinasi sınıfını görüyorsunuz.

Bu sınıfta (class) sınıf değişkeni sonuc değerlerinin değiştirilmesi için gir metotu yazılmıştır. Bunun sebebi programlarda sınıfa ait değişkenlere dışarıdan direk ulaşımın önlenmesini sağlamaktır. İyi programlama şartlarından birisi sınıfın değişkenlerine sadece o sınıfın metotları üzerinden ulaşmaktır. Herkese serbest ulaşım verilmez. Hatta bunu saglamak için değişkenlerin başına sadece bu sınıfa aittir dışarıdan kullanılamaz anlamındaki private sözcügü getirilebilir. private sözcüğü yerine ancak dışarda bu sınıftan yaratılana yeni sınıflar (akraba sınıflar) kullanabilir, yabancı sınıflar kullanamaz anlamındaki protected sözcüğü de sık olarak kullanılır. Protected sözcügü aynı directorydeki diğer dosyaları da (public) gibi kabula eder, fakat başka direktorylerdeki dosyalar için private olarak davranır.

JAVA PROGRAMLAMA DİLİNDE SINIF YAPILARI SINIFLARI BİR ARADA KULLANMA, SINIF NESNELERİNİN DİĞER SINIFLARDA SINIF DEĞİŞKENİ OLARAK KULLANILMASI, KALITIM

SINIF NESNELERİNİN DİĞER BİR SINIFTA KULLANILMASI (COMPOSITION)

Java Programlama Dilinde Sınıf Yapıları, bir önceki bölümümüzde sınıf nesnelerinin diğer sınıflarda sınıf değişkeni olarak kullanılmasını görmüştük. Örneğin nokta sınıfını üçgen sınıfının sınıf değişkeni olarak kullanarak üçgen sınıfını yaratmıştık. Bu örnekte üçgen sınıfı 3 tane nokta sınıfı değişkenini köşe noktaları olarak tanımlamış ve üçgeni yaratmıştık. Yeni bir örnek problem olarak yine aynı nokta temel programını kullanarak bir daire ve sonra bir silindir tanımlayacağız. Daire merkez noktası ve çapı ile, silindir bir daire (merkez noktası, çapı) ve yüksekliği ile tanımlanacaktır.

Burada noktayla ilgili matematiksel tanımlar yapmadığımız için tanımı biraz daha basit tuttuk, ama daha önceki nokta sınıfını hiç değiştirmeden kullanabilirdik.

Burada üç sınıfımız nokta1, daire ve silindir iç içe birbirinden türetilerek tanımlanmıştır. Bunu oluşturmak için her sınıfı diğer sınıfın içinde sınıf değişkeni olarak tanımladık.

Sınıfların birlikte kullanılmasına bir örnek daha verelim. İlk sınıfımız olarak bir araç tanımlama sınıfı yaratalım.

JAVA PROGRAMLAMA DİLİNDE SINIF YAPILARI SINIF NESNELERİNİN BİRBİRİNDEN KALITIM YOLUYLA TÜRETİLMESİ (INHERITANCE)

Java Programlama Dilinde Sınıf Yapıları, mevcut sınıflardan yeni sınıflar türetmenin tek yolu sınıf değişkeni olarak ekleyeceğimiz sınıftan nesne kullanmak değildir. Diğer önemli bir metod da sınıfları birbirinden türetmektir. Bir sınıfı diğer sınıftan türetmek için extends kelimesini kullanıyoruz. Örneğin

public class nokta2 extends nokta1 gibi extends sözcüğü sınıf içindeki tüm metod ve sınıf değişkenlerini yeni metoda kopyalar.

Programdan da görüldüğü gibi nokta2 de direk olarak yazılmamış cikti() metodu nokta1 sınıfından geldiği için direk olarak kullanılabilmiştir. Kurucu metodlar tekrar yazılmış, ancak tam tanım yerine sadece süper metodunun kullanımıyla yetinilmiştir. Süper metodu extends yoluyla türetilen metoddur (burada nokta1 metodu)

Şimdi de daha önce sınıf değişkenleri (nesne) yoluyla aktarım yaparak oluşturduğumuz daire ve silindir sınıflarının extends ile oluşturulmaş benzerleri daire1 ve silindir1 sınıflarını inceleyelim.

Temel sonuç bir önceki nokta1-daire-silindir sınıfları uygulaması ile aynıdır. Extends yoluyla elde edilen sınıflarda nesne yoluyla elde edilen metodlara göre bir yeni özellik daha mevcuttur, bu da indirek referans kullanabilme özelliğidir. Extends yoluyla baplanan sınıflardaki değişkenler birbirine eşitlenerek indirek referans üzerinden kullanılabilirler.

Sonuç bir önceki programla aynıdır. Bu programda daire1 ve silindir1 sınıfı nesneleri nokta1 sınıfına yüklenerek (indirek referans üzerinden) kullanılmıştır. Bu özellik bize daha yazılmamış sınıflar üzerinden programlama olasılığı sağlar.

Bir önceki bölümdeki ikinci örneğimizde araç sınıfından kamyon, kamyonet ve minibüs sınıflarını türetmiştik. Şimdi benzer sınıfları extends yoluyla türetelim.

Buradan da görülebileceği gibi genel kitap türünü veya ondan türetilmiş sınıfları kitap bilgisine erişmek için kullanabiliyoruz. Bura da da indirek referanslama yapılabilir.