Property Intialization



Benzer belgeler
Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 7

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 9

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Java'nın Özellikleri

olarak çalýºmasýdýr. AC sinyal altýnda transistörler özellikle çalýºacaklarý frekansa göre de farklýlýklar göstermektedir.

FLASH ile Kayan Menüler

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Adres Satýrýndan Bilgi Almak

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

düºünülerek geliºtirilmiºtir. Bu nedenle, diðer dillerden farklý olarak, ayný zamanda kendisi de bir platformdur.

Erişim konusunda iki taraf vardır:

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

MOBIL UYGULAMA GELIŞTIRME

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

BİL-141 Bilgisayar Programlama I (Java)

BMH-303 Nesneye Yönelik Programlama

Java Programlamada Paket Yapısı Ve Import

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Ders 8 Konu Özeti ve Problemler

Bölüm 11. Soyut veri tipleri ve kapsülleme kavramları ISBN

Programlama Dillerinde Kullanılan Veri Tipleri

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

3. FASÝKÜL 1. FASÝKÜL 4. FASÝKÜL 2. FASÝKÜL 5. FASÝKÜL. 3. ÜNÝTE: ÇIKARMA ÝÞLEMÝ, AÇILAR VE ÞEKÝLLER Çýkarma Ýþlemi Zihinden Çýkarma

public static int Toplam int x, int y

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

GEOMETRÝK ÞEKÝLLER. üçgen. bilgi

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 18: Formatlı Grafik Kullanıcı Arayüzü Oluşturma


ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Android Ders Notları

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Kanguru Matematik Türkiye 2017

7. HAFTA. Erişim Belirleyiciler

Nesneye Dayalı Programlama

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

Kanguru Matematik Türkiye 2017

Arayüz (Interface) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ISBN :

BMM3101 PROGRAMLAMA DİLLERİ

Yazılım Kodlama ve İ simlendirme Standartları v1.0

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Firmamýz mühendisliðinde imalatýný yaptýðýmýz endüstriyel tip mikro dozaj sistemleri ile Kimya,Maden,Gýda... gibi sektörlerde kullanýlan hafif, orta

Java Class Yapısında Finalize Metotunun Kullanımı

Şablon Türler (Generics)

Nesne Yönelimli Programlama

BMH-303 Nesneye Yönelik Programlama

Dizi ( Array ) ve Dizgi ( String )

KÖÞE TEMÝZLEME MAKÝNASI ELEKTRONÝK KONTROL ÜNÝTESÝ KULLANIM KILAVUZU GENEL GÖRÜNÜM: ISLEM SECIMI FULL

Ders 8: Metotlar. barisgokce.com

Inheritance. Inheritance (turetim)

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

11- FONKSİYONLAR (FUNCTIONS)

Kanguru Matematik Türkiye 2015

3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Sunum İçeriği. Programlamaya Giriş

NpN ve PnP Tipi Transistörler

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

HSancak Nesne Tabanlı Programlama I Ders Notları

Mantýk Kümeler I. MANTIK. rnek rnek rnek rnek rnek... 5 A. TANIM B. ÖNERME. 9. Sýnýf / Sayý.. 01

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR


Aile Hekimliðinde Genogram

NESNEYE YÖNELİK PROGRAMLAMA

YZM 2108 Yazılım Mimarisi ve Tasarımı

BTEP243 Ders 3. class Yazım Kuralı:

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Burak Kıymaz JAVA FX

Nesneye yönelik: Javada herşey bir nesnedir. Java nesne yönelimli olduğu için kolayca geliştirilebilir.

Geometriye Y olculuk. E Kare, Dikdörtgen ve Üçgen E Açýlar E Açýlarý Ölçme E E E E E. Çevremizdeki Geometri. Geometrik Þekilleri Ýnceleyelim

Nesne Yönelimli Programlama

JAVA PROGRAMLAMAYA GİRİŞ

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

E-Ticarette Güvenlik. Elektronik Ticaret`de Güvenlik...

1. Böleni 13 olan bir bölme iþleminde kalanlarýn

Silindir kapaklarý çatlak olup olmadýðý çeºitli yöntemlerle belirlenir. Bunun

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Java Dersi. Altuğ Bilgin Altıntaş

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 8: Sınıf (Class) Yapılarına Giriş

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Nesneye Dayalı Programlama

Facade (Cephe) Tasarım Şablonu KurumsalJava.com


Görsel Programlama. Temel Veri Tipleri, Değişkenler, Operatörler, Akış Kontrolü, Sınıflar, Metotlar, Paketler ve JavaDoc

Ön Hazýrlýk Geometrik Þekiller

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

COPYRIGHT EBD YAYINCILIK LTD. ŞTİ.

TEST. 8 Ünite Sonu Testi m/s kaç km/h'tir? A) 72 B) 144 C) 216 D) 288 K 25 6 L 30 5 M 20 7

Transkript:

Nesneye Yönelik Programlama Class Kavramý Package'ler ve Derleme Birimleri Encapsulation (Kapsülleme) Inheritance (Kalýtým) Interface'ler ve Abstract Class'lar Çok Biçimlilik (Polymorphism) Class'lar (Sýnýflar) Class,Property ve Method Kavramlarý Yazýlým geliºtirmenin iki temel bileºeni vardýr : veri ve iºlev. Her tür program belli veriler üzerinde belli iºlever gerçekleºtirir. Nesne, belli bir anlam bütünlüðü içeren veriler ve gerektiðinde o verilerle çalýºan iºlemlerden oluºan yapýdýr. Dikdörgenler prizmasý diye bir nesne olduðunu düºünelim. Bununla ilgili en, boy ve yükseklik gibi veriler vardýr. Ayrýca alanýný ve hacmini hesaplama gibi iºlemler bulunmaktadýr. Java'da veri ve iºlem içeren her birime "class" (sýnýf) denir. Class'larýn içerdiði veriye "property" (özellik), iºlemlere de "method" (yöntem) denir. Dikdörtgenler prizmasý'ný belirten bir nesne yapalým. public class RectangularPrism{ float width; float height; float depth; float getvolume(){ return width*height*depth; float getarea(){ return 2*(width*height+width*depth+height*depth); Burada yaptýðýmýz, dikdörtgenler prizmasý diye bir nesne olduðunu, bu nesnenin width, height, depth gibi özellikleri olduðunu, bu nesneyle alan ve hacim hesaplamasý yapabileceðimizi söylemekten ibarettir. Ayrýca her property'nin veri tipini de belirttik. Dikdörgenler prizmasýnýn kenarlarýn kesirli sayýlarla belirtilebilir. Instance Yukarýda bir class'ý tanýmladýk ('definition' yaptýk). Bu class bütün dikdörtgenler prizmalarýnda olabilecek özellikler ('property'ler) ve yöntemler ('method'lar) içeriyor. Henüz ortada belli bir prizma yok. Belli bir pizmanýn "yaratýlmasý" gerekli ki biz hacmini ve alanýný bulalým. Class tanýmýna uygun olarak yaratýlan nesnelere instance (örnek) denir. Dikdörtgenler prizmasýna bir örnek verilmesi, baºka bir deyiºle bir dikdörtgenler prizmasý yaratýlmasý lazým. Buna nesneye yönelik programlamadaki terminolojiyi kullanýrsak, RectangularPrism class'ýndan bir instance yaratýlmasý gerekiyor. Bir prizma yaratalým, boyutlarýný 10,20 ve 30 olarak verelim. Alanýný ve hacmini hesaplayýp ekrana yazalým. public class RectangularPrismTest{ public static void main(string[] args){ RectangularPrism prism=new RectangularPrism(); 1 / 19

prism.width=10.0f; prism.height=20.0f; prism.depth=30.0f; float volume=prism.getvolume(); System.out.println("Volume : "+volume); float area=prism.getarea(); System.out.println("Area : "+area); Burada RectangularPrism class'ýndan bir instance yarattýk. Ýsmi de 'prism'. Bu isim rastgele seçilmiº bir isimdir, kýsaca 'p' de diyebilirdik. Ancak bir kez prism dedikten sonra aºaðýda ayný ismi kullanmak zorundayýz. Property Intialization Bir nesne yaratýlýrken 'property'lerinin deðerleri default (varsayýlan) deðerlerine atanýr. Property'ler de birer nesneyse (primitive type deðilse) 'null' deðerini alýr. Bir deðer olarak 'null' hiç bir deðeri yok demektir. Bir nesneyi yaratýp kullanan kiºi bir method'u çaðýrmak için gerekli olan property'lerin deðerlerini önceden vermezse hata durumu oluºur. Örneðin, prism deðerinin 'height' property'si verilmezse hacim hesaplanmaya çalýºýlýrsa ne olacak? Nasýl bir hacim deðeri üretilecek? Böyle sorunlarla karºýlaºmamak için property'lerin 'initialize' edilmesi gerekebilir. Property'ler belirlenirken float width=1.0f; float height=1.0f; float depth=1.0f; ºeklinde bir initialization yapýlabilir. Böylelikle bir deðerin verilmesi unutulsa bile belli bir deðer default alýnacaðýndan sorun çýkmaz. Height deðeri verilmezse hacim 1 çýkar. Alan da 2*(1*1+1*1+1*1)=6 çýkar. Constructor Bir nesnenin yaratýlma aºamasýnda bazý iºlemlerin yapýlmasý, bazý deðerlerin atanmasý gerekebilir. Bir nesne yaratýlýrken çaðrýlan method benzeri yapýya 'constructor' denir. Constructor aslýnda bir method deðildir. Ama class'la ayný ismi taºýyan, dönüº deðeri olmayan bir method olarak da düºünülebilir. Prizmanýn boyutlarýnýn daha instance yaratýlýrken verilmesi bu ºekilde saðlanabilir. public class PrismWithConstructor{ float width; float height; float depth; public PrismWithConstructor(float w,float h,float d){ width=w; height=h; depth=d; float getvolume(){ return width*height*depth; float getarea(){ return 2*(width*height+width*depth+height*depth); 2 / 19

Bu class'ý kullanan bir application yapalým. public class PrismWithConstructorTest{ public static void main(string[] args){ PrismWithConstructor prism=new PrismWithConstructor(10.0f,20.0f,30.0f); float volume=prism.getvolume(); System.out.println("Volume : "+volume); Method Signature Bir method'un ismiyle birlikte sýrasýyla aldýðý parametre tipleri, o method'un 'signature'unu oluºturur. Siz bir method çaðýrdýðýnýzda, öncelikle o nesnede o isimde bir method olup olmadýðýna bakýlýr. Eðer varsa, çaðýrdýðýnýz parametreler'in tipleriyle birlikte eºleºtirme yapýlýr ve uygun bir method varsa derleme iºlemi baºarýlý olur. Aksi takdirde kod derlenemez. Bir nesnenin bir methodunu çaðýrdýðýnýzda compiler kýzýyorsa ve siz method ismini doðru yazdýðýnýza eminseniz, bilinki verdiðiniz paramtereler ya eksiktir, ya fazladýr, ya sýrasý yanlýºtýr ya da parametre tipleri yanlýºtýr. Overloading (Çeºitleme) Bir method'la ayný isimde baºka bir method yazýlabilir. Buna overloading (çeºitleme) denir. Bu iºlem, benzer iºlemleri farklý parameteler'le yapan iki method için yapýlýr. Bu ºekilde, bir çok method ismini öðrenmekten kurtulmuº oluruz. Ancak, overloading iºleminde yeni method'un signature'u mutlaka farklý olmalýdýr ki bir method çaðýrdýðýnýza hangisini çaðýrdýðýnýz anlaºýlabilsin. Zaten ayný isimde ayný parametreleri ayný sýrada alan bir ikinci method yazmanýn hiç bir anlamý yoktur. Ayný iºi yapýyorlarsa, bir tanesine hiç gerek yok. Farklý iºler yapýyorlarsa farklý bir isimde olmalýdýr. Bir method'un return type'ý signature'a dahil deðildir. Yani ayný isimde ayný parametre tiplerini ayný sýrada belirten fakat iki ayrý return type olan iki ayrý method olamaz. Java'da bir method'un döndürdüðü deðerin fazla bir önemi yoktur. Sadece o method'u çaðýran için gerekliyse bir anlamý vardýr. Hatta bir deðer döndüren method, döndürdüðü deðer kullanýlmadan da çaðrýabilir. Bazý method'lar belki lazým olur diye belli bir deðeri döndürmektedirler. Birden Fazla Constructor Bir class'ýn farklý parametreler alan birden fazla constructor'u olabilir. Yani constrcutor'lar da method'lar gibi 'overload' edilebilirler. public class PrismWithMultipleConstructor{ float width; float height; float depth; public PrismWithMultipleConstructor(float w,float h){ width=w; height=h; depth=1.0f; public PrismWithMultipleConstructor(float w,float h,float d){ width=w; height=h; depth=d; 3 / 19

float getvolume(){ return width*height*depth; Bir constructor baºka bir constructor'u çaðýrabilir. Bunun için 'this' operatörü kullanýlmalýdýr. public PrismWithMultipleConstructor(float w,float h){ this(w,h,1.0f); public PrismWithMultipleConstructor(float w,float h,float d){ width=w; height=h; depth=d; Burada iki constrcutor'dan biri diðerini çaðýrýyor. Kendisine gelen deðerleri aynen öbürüne devrederken bir deðeri kendisi belirliyor. Bu yöntemin yararý, bir deðiºiklik yapýldýðýnda sadece tek bir constructor'un deðiºtirilmesinin yeterli olmasýdýr. Default & Parameter'siz Constructor'lar Aslýnda, programcý hiç bir tane yazmasa dahi, her class'ýn bir constructor'u vardýr. Sanki public class MyClass{ public MyClass(){ ºeklinde bir constructor verilmiº gibi kabul edilir. Programcý hiç bir ºey yapmadýðýnda saðlanan default constructor hiç parametre almaz ve hiç bir iºlem yapmaz. Hiç parametre almayan ama bazý initilization iºlemleri yapan contructor'lar da yazýlabilir. O zaman parameterless constructor (parametresiz kurucu) olur. Birim küpü 2, 2, 2 boyutlarýnda kabul ettiðimizi varsayalým. public class PrismWithParameterlesConstructor{ float width; float height; float depth; public PrismWithParameterlesConstructor(){ width=2.0f; height=2.0f; depth=2.0f; public PrismWithParameterlesConstructor(float w,float h,float d){ width=w; height=h; depth=d; float getvolume(){ return width*height*depth; 4 / 19

float getarea(){ return 2*(width*height+width*depth+height*depth); Görüldüðü gibi class'ýn iki constructor'u var. Birisi parametreleri dýºardan alýyor, diðeri içerde belirliyor. Ýki constructor'u da test edelim. Birisi default contructor'la birim küp yaratsýn, diðeri boyutlarý vererek. public class PrismWithParameterlesConstructorTest{ public static void main(string[] args){ PrismWithParameterlesConstructor prism1= new PrismWithParameterlesConstructor(); PrismWithParameterlesConstructor prism2= new PrismWithParameterlesConstructor(10.0f,20.0f,30.0f); float volume1=prism1.getvolume(); float volume2=prism2.getvolume(); System.out.println("Volume 1: "+volume1); System.out.println("Volume 2: "+volume2);, Package Package'ler ve Derleme Birimleri Birbiriyle iºlev veya kullaným açýsýndan iliºkili class'lar 'package' adý verilen bir birim altýnda birleºtirilir. Bir class'ýn ait olduðu package'i belirtmek için 'package' keyword'ü kullanýlýr. package mypackage; public class MyClass //.. Bir class'ýn diðer bir class'la ayný package'te olmasý, ona bazý avantajlar saðlar. Aslýnda bütün class'lar bir package'e ait olmak zorundadýr. Hiç bir isim verilmediðinde o class isimsiz default package'de kabul edilir. Package'i belirtilmemiº bütün classlar ayný package'in class'larý sayýlýr. Bazý durumlarda sadece örnek olsun diye yapýlýp hatalý (derlenemez durumda) býrakýlan class, yine package'siz olan baºka bir class'ýn derlenmesini engelleyebilir. Import Bir class'ýn kendisiyle ayný package'de olmayan class'ý kullanabilmesi için, class tanýmýndan önce import etmesi gerekir. Bu sadece kullanýlacan class'larýn tam olarak hangi pakette olduðunu söylemek anlamýna gelir. Bunun için 'import' keyword'ü kullanýlýr. package myanotherpackage; 5 / 19

import mypackage.myclass; public class MyAnotherClass //.. Burada sadece kullanýlacaðý belirtilmektedir. Yoksa, import edilen class'ýn import eden class'ýn üzerine 'include' edilmesi (eklenmesi) sözkonusu deðildir. 'java.lang' package'indeki class'larý kullanmak için import ifadesine gerek yoktur. Bu package olmadan hiç bir Java programý yapýlamayacaðý için, default olarak import edilmiº sayýlýr. '*' Operatörüyle Import Bir package'deki bütün class'larý import etmek için '*' operatörü kullanýlabilir. package myanotherpackage; import mypackage.*; public class MyAnotherClass //.. Bu iºlem, altalta çok sayýda import ifadesi yazmaktan daha kolaydýr. '*' operatörü kullanýlýdýðýnda bir çok class'ýn gereksiz yere import edildiði gibi bir izlenim doðmakla birlikte, import iºlemi aslýnda bir belirtmeden öteye gerçek bir 'içine alma' iºlemi anlamýna gelmediði için önemli bir performans kaybýna yol açmaz. Sadece bazý programcýlar okunurluðu arttýrmak için böyle bir yola gitmektedirler. Fully-Qualified Name (Tam Nitelendirilmiº Ýsim) Aslýnda her class package ismiyle birlikte adlandýrýlýr. Örneðin, 'mypackage' isimli bir package'de 'MyClass' isimli bir class'ýn tam nitelendirilmiº ismi 'mypackge.myclass' dýr. Import ifadesi, sadece programcýyý her class ismini böyle uzun yazmaktan kurtarmaktadýr. 'java.awt' package'inde olan Button adlý class'ýn bir instance'ýný 'import java.awt.*' diyerek kullanýrsak Button b=new Button(); ºeklinde yaratabiliriz. Hiç 'import' kullanmayarak ayný ifadeyi java.awt.button b=new java.awt.button(); ºeklinde de yazabiliriz. Bu ºekilde paket ismiyle birlikte verilen class isimlerine fullyqualified name denir. Alt Package'ler 6 / 19

Bazý durumlarda çok fazla class içermemesi için bir package alt birimlere bölünebilir. Örneðin, görsel bileºenler içeren 'java.awt' package'ýn image'larla ilºkili olan 'java.awt.image' ºeklinde bir alt package'i bulunmaktadýr. Aslýnda alt package'in teknik anlamda üst package'in 'içinde' olmasý sözkonusu deðildir. Alt package isimlendirmesi iki 'ayrý' package'i sadece anlamca iliºkilendirmektedir. Bir class'ta üst package'i import etmek, otomatikman alt package'lerin de import edileceði anlamýna gelmez. Örneðin, 'java.awt.*' ifadesi 'java.awt.event.*' ifadesini içermez. Bu alt package'den herhangi bir class kullanýlacaksa ayrýca import edilmesi gerekir. Standart Package'ler Java'nýn kendi API'ý (Application Programming Interface - Uygulama Programlama Arayüzü'ü) bir çok class'dan oluºtuðu için bir çok package altýnda gruplandýrýlmýºtýr. Bunlarýn çoðu 'java.' ve 'javax.' la baºlar. 'javax' öneki daha çok, sonradan extension (ekleme) package'ler için kullanýlýr. Önceden 'extension' olan package'ler daha sonra standart API'a dahil olabilmektedir. Java'nýn standart package'leri benzer ve iliºkili class'lardan oluºur. Her package'de bulunan class'larýn ezberlenmesine gerek yoktur. Sadece her package'de ne tür class'larýn bulunduðu öðrenilmesi yeterlidir. Örneðin, arayüzle ilgili class'lar 'java.awt'dedir. Görsel bir bileºen olarak Button bu package'tedir. Yine görsel bir bileºen olan text alaný'nýn (TextArea'nýn) da bu package'de olmasý gayet doðaldýr. Naming Convention (Ýsimlendirme Geleneði) Package isimlerinin rastgele verilmesi, bir sistemde farklý kurumlara ait package'leri bulunmasý durumunda 'name collision' (isim çarpýºmasý) adý verilen bir sorun yaratabilmektedir. Ayný package ismini baºka bir kurum da kullandýysa ne olacak? Örneðin siz package'in adýný 'myapplets' koydunuz. Sistemde ayný isimde baºka bir kuruma ait bir package daha var tesadüfen. Java önce hanginizinkini bulursa onu yükler. Sizinki önce bulunuyorsa onlarýn package'i doðru çalýºmaz, onlarýnki önceyse sizinki. Bu sorunlarla karºýlaºmamak için package isimlerinde standart bir yöntem uygulanýr. Bir kurum, sahip olduðu Ýnternet domain ismini tersten yazarak package isimlerinin önüne ekler. Örneðin 'godoro.com'a sahip olan kurum veya kiºiler, chat appletlerini 'com.godoro.chat' diye bir package'e koyabilirler. ChatApplet isimli biri class için fullyqualified class name 'com.godoro.chat.chatapplet' ºeklinde olur. Java'yý ortaya çýkaran 'Sun' firmasý da kendi package'lerini 'com.sun.' ºeklinde baºlatmaktadýr. ÖZel kuruluºlar com., ticari olmaytan kurumlar da org. ile baºlarlar. Ayný Package'teki Class'lar Ayný package'deki class'lar birbirlerinin private olmayan property ve methodlarýna, onlar public olmasala bile ulaºýrlar. Ayrýca, ayný package'deki class'larýn birbirlerini 'import' etmeleri gerekmez. Derleme Birimi Class'lar '.java' uzantýlý dosyalarda bulunabilirler. Bu dosya aslýnda bir compilation unit (derleme birimi)dir (). Bir dosyada birden fazla class alt alta tanýmlanabilir. Ancak en fazla bir tanesi 'public' olabilir. Ve dosyanýn (derleme biriminin) adý bu public class'ýn adýyla ayný olmalýdýr. Bu class derleme biriminin asýl class'ýdýr ve adý deðiºtirildiðinde dosyanýn da adý deðiºtirilmelidir. Tek dosyada bulunan class'lar derlendiðinde her biri için ayrý 7 / 19

.class üretilir. Yani derlendikten sonra class'lar birbirinden ayrýlýrlar. Bir derleme biriminde sadece bir tane class bulundurmak, zorunlu olmasa da bir gelenek halini almýºtýr. Encapsulation Kavramý Encapsulation Her class çeºitli üyelerden (property ve method'lardan) oluºur. Hemen hemen bütün class'lar baºka bir class tarafýndan kullanýlmak amacýyla üretildiðinden, bazý üyeler sadece dýºarýdan kullanýlmak üzere hazýrlanmýºtýr. Buna karºý bazý property ve method'lar, diðerlerine yardýmcý olmak, sadece onlar tarafýndan class'ýn iç iºlerinde kullanýlmak için yazýlýrlar. Belli bir class'ý kullanan class'ýn bunlarý görmesi veya bilmesi gerekmez. Hatta bazý durumlarda property ve method'larýn sadece ufak bir kýsmý dýºarýsý tarafýndan kullanýlýr. Bir insanýn belli bir class'a baktýðýnda üyelerden hangisi kendisinin iºine yarar, hangisi sadece baºka methodlarda kullanýlmak için yapýlmýºtýr ve class'a özel'dir anlamasý çok zor olabilir. Bazý durumlarda da güvenlik ve saðlamlýk saðlamak amacýyla bir class'ý kullanan class'ýn bazý property'leri deðiºtirmesi ve bazý methodlara eriºmesi engellenmek istenebilir. Bazý property ve methodlarýn ait olduðu class'ýn dýºýnda eriºimini sýnýrlama özelliðine 'encapsulation' (kapsülleme) denir. Encapsulation saðlamak için private, public ve proteced sözcükleri kullanýlýr. Bunlara access modifier (eriºim deðiºtirici) denir. Hiç birini kullanmak da bu baðlamda belli bir tercih anlamýna gelir. Default Access Hiç bir access modifier kullanýlazsa, yani bir property ve methodun baºýnda private, protected ve public keyword'lerinden hiç biri kullanýlmazsa bu üye 'package private' olur. Yani ona sadece ayný package'deki diðer class'lar eriºebilir, diðer package'lerdekiler eriºemez. Public Access Sistemdeki bütün class'larýn eriºebilmesini saðlamak için 'public' eriºim deðiºtiricisi kullanýlýr. Herkesin eriºmesinde sakýnca bulunmayan üyeleri için kullanýlýr. Genellikle bu deðiºtirici özellikle baºkalarý eriºsin diye yazýlan property ve method'lar için kullanýlýr. Bir nesnede ne kadar az public deðiºken varsa dýºarýya o kadar sade görünür ve o kadar kolay kullanýlýr. O nesneyi kullananlar gereksiz bir çok üye arasýnda dolaºmak zorunda kalmazlar. Private Access Bir property veya method'un sadece tanýmlandýðý class'dan eriºilebilmesini, baºka bir deyiºle, o class dýºýndaki bütün class'lardan (ayný package'de olsalar bile) eriºiminin yasaklanmasýný saðlamak için 'private' keyword'ü kullanýlýr. Bir deðiºkenin dýºardan görülebilmesini ancak deðiºtirilemesini veya deðiºtirme iºleminin class'ýn kontrolünde yapýlmasýný saðlamak için standart bir yöntem izlenir. Bir property'yi read-only (salt okunur) yapmak için, o property private yapýlýr. Ona eriºmek için bir tane public method yazýlýr. Bu ºekilde dýºarýndan property'nin value'si dolaylý olarak öðrenilmiº olur. public class MyDiscreetClass{ private int value=3; public int getvalue(){ return value; 8 / 19

Bu class'tan yaratýlmýº bir nesne'yi kullanan örnek yapalým. public class MyDiscreteUserClass{ public static void main(){ MyDiscreetClass d=new MyDiscreetClass(); int v=d.getvalue(); System.out.println("Value : "+v); Buradaki value private olduðu için int v=d.value; yazarsak derleyici hata verir. Property orada olduðu halde artýk eriºilmez hale gelmiºtir. Ama deðeri öðrenmek için getvalue() methodu kullanýlabildiði için bir programýn iºleyiºini bozmaz. Biz bu deðeri deðiºtirmek istersek : d.value=5; derleyici yine hata verecektir. Bu ºekilde class kendi property'sini korumuº oluyor. Bir deðiºkenin hem okunmasý hem de deðiºtirilmesi istenip sadece bunun kontrollü bir ºekilde yapýlmasýný istersek yine property'yi private tutarýz ve hem eriºebilmek için hem de deðiºtirebilmek için iki ayrý method yazarýz. Bir deðerin eksi olmamasýný saðlayan bir class yapalým : public class MyControlledClass{ private int value=3; public int getvalue(){ return value; public void setvalue(int v){ if(v>0){ value=v; else{ value=-v; Bu deðeri deðiºtirip sonrsa yeni deðeri alan bir program yazalým. public class MyControlledUserClass{ public static void main(){ MyControlledClass d=new MyControlledClass(); d.setvalue(-7); int v=d.getvalue(); System.out.println("Value : "+v); Bu program, kendisinin deðiºtirmeye (kullanýlan class açýsýndan bakarsak, 'bozmaya') çalýºtýðý deðerin hala saðlam olduðunu ortaya koymaktadýr. Protected Access Bazý durumlarda bir property veya method'un dýºarýya kapalý olmasýný ancak o class'ý extend edenlere açýk olmasý istenebilir. Bu durumda 'protected' eriºim deðiºtiricisi kullanýlýr. Bir class diðerini extend ederse, onun bütün public property'lerin eriºebilir hale gelir. Zaten 9 / 19

bunlara her class'ýn eriºebilmektedir. Hiç bir private property extend eden class'a geçmez. Bunlar diðer bütün class'lara da kapalýdýr. Ancak protected property ve methodlar dýºarýya kapalý olduklarý halde, extend edilen class bunlara eriºim hakkýna sahiptir. Bu keyword, belli bir property veya method'un sadece onu extend eden class'larý ilgilendirmesi durumunda kullanýlýr. Eriºim deðiºtirici olarak protected verilmiº property veya method'lara o class'la ayný package içerisindeki bütün class'lar tarafýndan da eriºilebilir. Eriºim Düzeyleri Sýralamasý Encapsulation düzeyleri için public > protected > 'default' > private ºeklinde bir sýralama yapýlýr. Büyük olan düzey küçük olanlarýn haklarýný da kapsar. Bir property'nin public olup private özelliði içermemesi, yani tanýmlandýðý class'tan eriºilemez ama onun dýºýndaki bütün class'lardan eriºilmesi gibi bir durum söz konusu olamaz. Inheritance Kavramý Inheritance (Kalýtým) Bir class'ýn baºka bir class'daki property ve method'lara sahip olmasýna inheritance denir.. Belli bir class, daha genel bir kavramý ifade eden class'ýn üyelerine sahip olarak, onlarý tekrar tanýmlamak zorunda kalmaz. Bir class'ýn diðerindeki özellikleri miras olarak almasý için kullanýlan keyword 'extends' dir. Anlam olarak "Bu class ºu class'ý 'geniºletir' yani ondaki property ve methodlarý alýr ve yenilerini ekler" demektir. Inheritance, bazý durumlarda baºka birinin yazdýðý class'a bazý eklemeler yaparak belli bir iºlem için kullanýlýr hale getirmek için kullanýlabilir. Böylelikle sadece o class'ta olmayan property ve methodlarý eklemek suretiyle çok kýsa sürede geliºmiº bir class sahibi olabilir. Bazen de ortak bir çok özellik içeren iki nesnede de aynen bulunan property ve methodlarý tanýmlamaktan kurtulmak için kullanýlabilir. 'Extends' Kullanýmý Diyelim ki bize bir küp ve küre'yle hacim, yüzey alaný, kütle ve aðýrlýk gibi hesaplamalar yapmamýz gerekiyor. Bir çok özellik bu iki nesnede ortaktýr. Ýkisinde de bir özkütle vardýr. Hacim hesaplama teknikleri deðiºebilir ama kütle hesap teknikleri deðiºmez. Her iki cisim için de kütle, özkütle ile hacmin çarpýmýdýr. Bu iki cisim için SimpleSphere ve SimpleCube gibi iki class yapacaksak, ortak özellikleri içeren SimpleBody diye bir class yapmak akýllýca olur. ªimdilik sadece SimpleSphere'e ihtiyacýmýz varsa dahi, sonradan SimpleCube veya baºka bir cismin gerekebileceðini düºünerek bir base class yapmak da faydalý olabilir. public class SimpleBody{ private double density=1.0; public SimpleBody(){ public SimpleBody(double d){ setdensity(d); public void setdensity(double d){ density=d; public double getdensity(){ 10 / 19

return density; Görüldüðü gibi, cismin yoðunluðunu belirten bir property ve bunula ilgili iki method var. Bu class'ý 'extend' eden SimpleSphere adlý bir class yapalým. public class SimpleSphere extends Body{ public double radius=1.0; public SimpleSphere(double d,double r){ super(d); radius=r; public double getvolume(){ return (3.14 * radius * radius * radius )/3; Yazdýðýmýz SimpleSphere class'ýn radius property'si dýºýnda, density property'si de vardýr. ªöyle bir kod parçasý geçerlidir : SimpleSphere s=new SimpleSphere(); s.setradius(3.6); s.setdensity(1.2); Extend eden class'a subclass, extend edilen class'a da super class (veya base class) denir. Super Class'ýn Constructor'unun Kullanýmý Bir class'ý extend eden class'ýn constructor'u extend ettiði class'ýn constructor'unu 'super()' ºeklinde çaðýrabilir. Bu ºekilde super class'a veri aktarýlmýº olur. SimpleSphere class'ýna bir constructor ekleyelim : public SimpleSphere(double d,double r){ super(d); setradius(r); Bu ºekildeki constructor'u kullanmak istersek SimpleSphere sphere=new SimpleSphere(3.6,1.2); biçiminde bir kod yazmak yeterli olacaktýr. Bir constructor'ýn diðerini çaðýrmasý durumunda super ifadesi kesinlikle ilk satýrda belirtilmelidir. Herhangi bir kod parçasý yazýldýktan sonra super class'ýn bir constructor'u çaðrýlamaz. Super class'ýn constructor'u açýk olarak çaðrýlmadýkça, parametresiz olan super() constructor'un çaðrýldýðý varsayýlýr. Super constructor'un böyle bir constructor'u yoksa mutlaka parametreli bir constructor çaðrýlmalýdýr. Aksi takdirde derleyici hata verir. Super Class'larda Protected Property'ler Base class'da 'private' olan property'lere subclass'tan eriºilemez. Eriºilmesi için 'public' yapýlmasý durumunda da ilgili üye herkese açýk hale gelecektir. Sadece extend eden class'ýn 11 / 19

eriºimini saðlamak için 'protected' eriºim deðiºtiricisi kullanýlýr. SimpleBody class'ýnda 'density' property'si protected olmalýdýr. Overriding (Ezme) Bir subclass super class'ýnýn bir methodunun davranýºýný yeniden yazabilir, yani super'dekini ezebilir. Buna overriding denir. Bunun için ayný üst class'ýn method'unun signature'uyla ayný olmalýdýr. Bu iºlem bazen methodun tamamen deðiºtirme, bazen de sadece bir ekleme yapma ºeklinde yapýlýr. SimpleSphere class'ýnda, SimpleBody class'ýnda density property'sini belirleyen setdensity() method'u, negatif deðer kontrolü yapacak ºekilde deðiºtirmek için public void setdensity(double d){ if(d>=0){ else{ density=d; density=0.0; biçimde bir kod yeterlidir. SimpleSphere class'ýnda setdensity() methodu çaðrýldýðýnda bu yeni method geçerli olacaktýr. Elbette bu deðiºiklik SimpleBody class'ý ve bu class'ý extend eder diðer class'larý baðlamaz. Onlar hala üsteki methodu çaðýrýrlar. Override eden method, override edilen methodu çaðýrabilir. Ancak ikisinin de adý da parametreleri de ayný olduðu için super anahtar sözcüðü kullanýlýr. public void setdensity(double d){ if(d>=0){ else{ super.setdensity(d); super.setdensity(0.0); Super class'da olan bir method'un ismiyle ayný farklý parametreler alan bir method yazlýabilir. Ama bu durumda overriding deðil overloading yapýlmýº olur. Yani var olan bir method'u deðiºtirmek yerine yeni bir method eklenmiº olur. Ýlk method çaðrýldýðýnda yine eskisi gibi çalýºýr. Multiple Inheritance (Çoklu Kalýtým) Java'da 'multiple inheritance', yani bir class'ýn iki veya daha çok class'ý extend etmesi, onlarýn property ve method'larýný miras almasý mümkün deðildir. C++ gibi diðer nesneye yönelik dillerde bu mümkündür ama Java'da kafa karýºýklýðýna, çalýºma zorluðuna, birbirine girmiº yapýlar yaratmaya neden olduðu için izin verilmemiºtir. Java'daki single inheritance (tekli inheritance)da hangi class'ýn hangisini extend ettiði bir aðaç yapýsý ºeklinde net bir ºeklide görülmektedir. Aslýnda bu yazýlým tasarýmý açýsýndan da gereklidir. Örneðin bir 12 / 19

hayvan hem memeli hem de kuº olmaz. Hem balýk hem memeli olmaz. Hatta yarasa uçsa bile, balina yüzse bile onlar birer memelidir. Yarasanýn kuºlar gibi uçtuðunu görüp onu hem memeli hem kuº saymak ne kadar yanlýºsa, bir class'ý iki ayrý class'ýn özelliklerine birden sahip olmasý gerektiðini düºünmek o derece yanlýºtýr. Eðer tasarýmýnýz bunu zorunlu kýlýyorsa ya yanlýº tasarým yapmýºsýnýzdýr ya yanlýº çözümleme yapmýºsýnýzdýr. Çoklu kalýtýmýn gerekli gibi göründüðü durumlarda baºka çözüm yollarý devreye girer. Bunlarý programcý ve sistem tasarýmcýlarý Java'da bilgi ve deneyimlerini arttýrdýkça öðrenebilirler. Örneðin iki class'ý extend etmek yerine birini extend etmek, diðerini bir property olarak tanýmlamak ve kullanmak mantýklý bir çözüm olabilir.. Interface Kavramý Interface'ler ve Abstract Class'lar Java'da interface, bir class'ta olmasý gereken method ve property'leri tanýmlayan yapýdýr. Kendisi normal bir class deðildir, sadece neyin yapýlacaðýný göstermekte, ancak nasýl yapýlacaðýný göstermemektedir. Örnek olarak, bir madde'de ne gibi iºlevler ve özellikler olmasý gerektiðini belirten bir interface yazalým. public interface Matter{ public double getvolume(); public double getmass(); Bu ifade, 'bir maddenin yoðunluðu, hacmi ve kütlesi olur' demenin Java'daki yoludur. Ancak görüldüðü gibi maddenin yoðunluðu nasýl hesaplanýr, kütlesi nasýl verilir, hiç bir ºekilde belirtmemektedir. Sadece ne olmasý gerktiðini söylemektedir. Interface'in Implementation'u Bir class'ýn interface'deki bütün method'larý içerdiðini, gerçekleºtirdiðini belirtmesine implementation denir ve 'implements' keyword'üyle kullanýlýr. public class CubeMatter implements Matter{ public double density=1.0; public double edge=1.0; public double getdensity(){ return density; public double getvolume(){ return edge*edge*edge; return density*edge*edge*edge; Burada "Küp diye bir nesnemiz var ve o bir maddedir, yani bir maddede olabilecek bütün nitelikler onda da bulunur." demiº olduk ve bunlarýn nasýl hesaplandýðýný gösterdik. Ayný interface'i implement eden baºka bir class'da yapýlabilir. public class SphereMatter implements Matter{ public double density=1.0; public double radius=1.0; public double getdensity(){ return density; public double getvolume(){ 13 / 19

return (3.14 * radius * radius * radius )/3; return density*(3.14 * radius * radius * radius )/3; Görüldüðü gib bu class'da ayný interface implement ediyor. Ancak hacim ve kütle hesaplamasý çok deðiºik. Absract Class'lar Bazý methodlarýný implement etmiº, bazýlarýnýn imlementation'unun kendisini extend eden class'a býrakmýº olan class'a abstract class denir. Bu tip class'lar en çok, iki class'ýn ortak methodlarýndan bazýlarýnýn implementation'u da ayný olmasý durumunda kullanýlýr. Örneðin bir küp için de kütle, hacim ve yoðunluðun çarpýmýna eºittir, bir küre için de. Ancak yaptýðýmýz iki nesnede de bu ortak özelliði kullanamýyor. Her birisi kütle hesaplamasýný kendisi yapýlýyor. Matter interface'ini implement eden ne kadar class varsa bu iºlem o kadar tekrarlanacak demektir. Bu 'ortak' iºlemi bir kere yapýp, hep onun kullanýlmasýný saðlamak mümkündür. Ancak çözülmesi gereken bir sorun var : Her class'ýn kütlesi ayný ºekilde hesaplanýyor bunu hesaplamak için gerekli hacim deðerini bilmiyoruz ve her class kendisine göre deðiºik bir ºeklide hesaplýyor. Bu sorun abstract method kullanarak çözülebilir. abstract public class Body{ public double density=1.0; public Body(double d){ density=d; public double getdensity(){ return density; return density*getvolume(); abstract public double getvolume(); Burada abstract bir Body class'ý yarattýk. Bu class, hem Cube'ün hem de Sphere'in ortak özelliklerini içermektedir. Zaten density property'si ikisinde de ortaktýr. Bu ºekilde inherintace yoluyla Cube ve Sphere'a geçebilir. Burada getvolume() method'u abstract býrakýlmýºtýr. Yani implement edilmemiºtir. Çünkü volume hesaplamak için her nesne farklý bir method kullanmaktadýr. Ancak getmass() implement edilmiºtir. Çünkü kütle yoðunlukla hacmin çarpýmýdýr. Burada object-oriented porgramlama dýºýndaki bir teknikle asla yapýlamayacak bir iºlem bulunmaktadýr. Bir method (getmass()) henüz yazýlmamýº bir mehodu (getvolume()'u) kullanarak bir iºlem yapabilmektedir. Bu ºekilde her cisim için ayrý ayrý hesap yapmaktan kurtulmuº olduk. ªimdi küp ve küre için yeni class'lar yapalým : public class CubeBody extends Body{ public double edge=1.0; public CubeBody(double d,double e){ super(d); edge=e; public double getvolume(){ return edge*edge*edge; 14 / 19

Görüldüðü gibi bu class kütle hesabýný yapan getmass() diye bir method'u yazmak zorunda kalmadý. Çünkü ona miras yoluyla sahip olmuºtur. Aºaðýdaki gibi kod yazýlabilir : CubeBody cube=new CubeBody(2.5,10.2); double mass=cube.getmass(); System.out.println("Mass : "+mass); Ayný ºekilde yeni bir küre class'ý yazalým. public class SphereBody extends Body{ public double radius=1.0; public SphereBody(double d,double r){ super(d); radius=r; public double getvolume(){ return (3.14 * radius * radius * radius )/3; Týpký küp gibi küre de artýk kütle hesabýný, hiç bir ek kodlama yapmadan yapabilmektedir. Hem Extend Hem Implement Etmek Bir class sadece bir class'ý extend edebilir. Ancak ayný anda bir class'ý extend edip bir veya daha fazla interface'i implement edebilir. Çünkü 'extends' keywordünün aksine, 'implements' demek yoluyla bir class'ýn aldýðý hiç bir ºey yoktur. Sadece bazý method'larý implement etmeyi taahüt etmektedir. Bir Cube class'ý hem Body classýný extend edebilir hem de Matter inetrface'ni implement edebilir. public class Cube extends Body implements Matter{ Base class'ýn bir interface'i imlement etmesi durumda subclass'da etmiº sayýlýr. Yani public class Body implements Matter{ dersek public class Cube extends Body{ dememiz yeterlidir. Cube class'ý Matter'i implement etmiº sayýlýr. Yani implementation'u da miras yoluyla almýº demektir. Interface'in Kullaným Özellikleri Interface'ler bütün methodlarý absract olan bir absract class gibi düºünülebilirler. Ancak class'lardan ayrýlan baºka özellikleri vardýr. Ayrýca söylensin veya söylenmesin bütün 15 / 19

method ve property'ler public sayýlýr ve baºlarýn proteced veya private gibi anahtar sözcükler alamazlar. Interface'lerde bütün propertyler public, final ve static'tir. O yüzden interface'lerde tanýmlanan property'ler bir veya daha fazla class'da kullanýlan sabitler için kullanýlýr. public interface MathConstants{ double PI=3.14; public class Circle implements MathConstants{ private double radius=1.0; public getcircumference(){ return 2*PI*radius; görüldüðü Circle classýnda tanýmlanmadýðý halde PI deðiºkeni, sadece MathConstants interface'ini implement ettiði için eriºilebilir durumdadýr. Bu interface'i implement eden Cylinder adlý bir class'da ayný ºekilde PI'a eriºebilir. Bu anlamda PI bir sabittir. Ama PI property'si sadece implement edilen class'lar tarafýndan görülmekte olduðundan global deðildir. Zaten Java'da global deðiºken ve sabit yoktur. Onlara ihtiyaç duyulan yerlerde interface kullanýlýr. Ancak yine de deðiºken (dah doðrusu sabit) bir yere (interface) ait olduðundan global olmasýndan doðacak sakýncalardan kurtulunabilir. Örneðin Math.PI ve GreekLetters.PI yazýlabilir, ikisi farklý deðerler taºýyabilir. Polymorphism (Çok Biçimlilik) Polymorphism (Çok Biçimlilik) Nesneye yönelik programlamada polymorphism, nesnelerin içeride farklý çalýºmalarýna raðmen dýºarýdan ayný biçimde görünmelerine denir. Bu ºekilde, bir grup nesneyi kullanan class'lar implementation'la ilgili detaylarý bilmek zorunda kalmazlar, içerideki deðiºikliklerden etkilenmeden çalýºmaya devam ederler. Ayný class'ý extend eden veya ayný interface implement eden class'lar standart bir ºekilde eriºilebilme özelliklerine sahip olurlar. Polymorphism Olmadan Kodlama Bir miktar kübün toplam kütlesini hesaplamak istediðimizi düºünelim. Küp class'ýnýn ana hatlarý ºöyle olsun : public class Cube{ Bu class'tan yaratýlmýº instance'larýn kütlelerini toplayan bir method ve program yazalým. public class CubesMassCalculator{ public static double calculatetotalmass(cube[] cubes){ double total=0.0; for(int i=0;i<cubes.length;i++){ total+=cubes[i].getmass(); 16 / 19

return total; public static void main(string[] args){ Cube[] cubes=new Cube[3]; cubes[0]=new Cube(2.2,10.5); cubes[1]=new Cube(3.1,6.1); cubes[2]=new Cube(5.6,1.2); cubes[3]=new Cube(9.3,6.1); cubes[4]=new Cube(4.0,3.7); double total=calculatetotalmass(cubes); System.out.println("Total Mass : "+total); Ayný programý küreler içinde yazabiliriz. Sphere class'ýmýz da ayný biçimde tanýmlanmýº olsun : public class Sphere{ Ancak calculatetotalmass() method'unu ºu biçimin de tanýmlamalýyýz : public static double calculatetotalmass(sphere[] spheres){ //.. Peki ya bir nesne dizimiz deðiºik cisimlerden oluºuyorsa? Örneðin üç tane kübümüz iki tane küremiz varsa ne olacak? Onun için ºöyle bir method daha yazmalýyýz. public static double calculatetotalmass(cube[] cubes,sphere[] spheres){ //.. Ya dikdörgenler prizmasý ve piramit gibi cisimlerimiz de varsa ne yapacaðýz? Her biri için ayrý toplamlar alan bir sürü method yazmaktan baºka çaremiz kalmayacak. ݺte polymorphism burada devreye giriyor. Ploymophism'den Yararlanma Eðer iki class'da ortak bir method varsa, bu ikisinin de temel alacaðý Body ºeklinde bir class yapmak gereklidir : class Body{ 17 / 19

class Cube extends Body{ class Sphere extends Body{ Çeºitli tipte cisimlerden oliºan bir dizinin toplam kütlesini hesaplayan bir class yapalým. public class BodiesMassCalculator{ public static double calculatetotalmass(body[] bodies){ double total=0.0; for(int i=0;i&bodies.length;i++){ total+=bodies[i].getmass(); return total;<noframes></noframes> public static void main(string[] args){ Body[] bodies=new Body[3]; bodies[0]=new Cube(2.2,10.5); bodies[1]=new Sphere(3.1,6.1); bodies[2]=new Cube(5.6,1.2); bodies[3]=new Cube(9.3,6.1); bodies[4]=new Sphere(4.0,3.7); double total=calculatetotalmass(bodies); System.out.println("Total Mass : "+total); Görüldüðü gibi tek method çeºitli cisimlerin kütlelerini toplayabiliyor. Her cismin farklý bir hacim ve kütle hesaplama ºekli olduðu halde. Bunun için tek gerekli ºart Cube ve Sphere class'larýnýn Body class'ýný extend etmeleri ve Body class'ýnda getmass() ºeklinde bir method olmasýdýr. Pyramid diye Body'yi extend eden bir class yapýp, dizinin dördüncü elamaný olarak verirseniz calculatetotalmass() methodu yine toplam kütleyi doðru olarak hesaplayacaktýr. Çünkü o zaten Sphere'ý da Cube'ü de tanýmamaktadýr. Sadece Body class'ýný tanýmaktadýr ki, bir cismin kütlesi olmasý, onun kütlesini toplama dahil etmesi için yeterlidir. Interface ve Abstract Class'larla Polymorphism Polymorphism özelliðini kullanmak için, class'larýn belli bir concrete base class'a sahip olmalarý gerekmez. Base class'larý abstract olabilir. Hatta ortak kullanýlan method'un kendisi bizzat abstract olabilir. Bu biçimde interface'lerin de kullanýlmasý mümkündür. Ayný interface'i implement eden her class ayný type'da kabul edilir. Yukarýdaki örnekteki class'lar abstract class Body{ abstract public double getmass(); class Cube extends Body{ 18 / 19

class Sphere extends Body{ ºeklinde de tanýmlanmýº olsalar ayný ºekilde kullanýlabilirdi. Body'nin bir class deðil de bir interface olarak tasarlanmasý durumunda da ayný ºey geçerlidir. interface class Body{ public double getmass(); class Cube implements Body{ class Sphere implements Body{ 19 / 19