際際滷

際際滷Share a Scribd company logo
NESNE TABANLI
PROGRAMLAMA
(JAVA)
Bilgisayar Sistemleri retmeni
Bahad脹r GNAYDIN
Email: gunaydinbahadir@hotmail.com
Ula脹m S脹n脹f脹
 ncelikle 旦rnek olmas脹 a巽脹s脹ndan bir class
olutural脹m. S脹n脹f脹m脹z脹n ad脹 ulasim.java olsun. S脹n脹f脹m脹z脹n
amac脹 g旦nderilen parametrelere g旦re ulasim
maliyetini hesaplamakt脹r. Burada yuz_km_litre
旦zellii arac脹n y端z kilometrede ka巽 litre yakt脹脹
bilgisini, gidilecek_km 旦zellii mesafeyi, mazot_端cret
ise o g端nk端 mazot litre fiyat脹n脹 temsil etmektedir.
ulasim.java











package com.atml;
class ulasim {
float yuz_km_litre;
float gidilecek_km;
float mazot_ucret;
public float maliyet_hesapla(){
yuz_km_litre*(gidilecek_km/100)*mazot_ucret;
return
}
}
INSTANCE
 Class tan脹m脹na uygun olarak yarat脹lan nesnelere
instance (旦rnek) denir. S脹n脹f脹m脹z脹n 旦zellikler(property)
ve y旦ntemlerden (method) olutuunu biliyoruz.
imdi baka bir 旦rnek i巽inde bir instance
oluturaca脹z. Yeni oluturaca脹m脹z nesnenin ad脹 u
olsun
ntptest.java
 package com.atml;

 public class ntptest {











public static void main(String[] args)
{
ulasim u=new ulasim();
u.yuz_km_litre=5.2f;
u.mazot_ucret=4.5f;
u.gidilecek_km=750.5f;
float ucret=u.maliyet_hesapla();
System.out.println("Toplam Maliyet...:"+ucret);
}
}
Property Initialization
zelliklerin deerleri belirtilmeden maliyet_hesapla metodunun 巽al脹mas脹
olas脹l脹脹nda derleyici hata 端retecektir. 端nk端 旦zelliklerin deerleri null dur.
Bu gibi s脹k脹nt脹lara engel olmak i巽in 旦zellikler aa脹daki ekilde
initialise(balatma) edilmedir.











package com.atml;
class ulasim {
float yuz_km_litre=8.0f;
float gidilecek_km=100f;
float mazot_ucret=4.6f;
public float maliyet_hesapla(){
return yuz_km_litre*(gidilecek_km/100)*mazot_ucret;
}
}
Constructor
 Bir nesnenin yarat脹lma aamas脹nda baz脹 ilemlerin
yap脹lmas脹, baz脹 deerlerin atanmas脹
 gerekebilir. Bir nesne yarat脹l脹rken 巽ar脹lan method
benzeri yap脹ya constructor' denir.
 Constructor asl脹nda bir method deildir. Ama
classla ayn脹 ismi ta脹yan, d旦n端 deeri
 olmayan bir method olarak da d端端n端lebilir.
Prizman脹n boyutlar脹n脹n daha instance
 yarat脹l脹rken verilmesi bu ekilde salanabilir. Bir
sonraki 旦rnekte initialise ilemini constructor
yard脹m脹yla yapal脹m.






package com.atml;
class ulasim_constructor {
float yuz_km_litre;
float gidilecek_km;
float mazot_ucret;











public ulasim_constructor(float ykl,float gk,float mu){
yuz_km_litre=ykl;
gidilecek_km=gk;
mazot_ucret=mu;
}
public float maliyet_hesapla(){
return yuz_km_litre*(gidilecek_km/100)*mazot_ucret;
}
}
Ulasim.java
 package com.atml;





class ulasim_constructor {
float yuz_km_litre;
float gidilecek_km;
float mazot_ucret;











public ulasim_constructor(float ykl,float gk,float mu){
yuz_km_litre=ykl;
gidilecek_km=gk;
mazot_ucret=mu;
}
public float maliyet_hesapla(){
return yuz_km_litre*(gidilecek_km/100)*mazot_ucret;
}
}
rnek
 imdi bir 旦rnek ile instance olutural脹m.
Ornek.java










package com.atml;
public class ulas脹m_c_test {
public static void main(String[] args){
ulasim_constructor uc=new
ulasim_constructor(6.7f,896f,4.5f);
float masraf = uc.maliyet_hesapla();
System.out.println("Toplam masraf脹n脹z...:"+masraf+"
TL");
}
}
Method Signature

 Bir method'un ismiyle birlikte s脹ras脹yla ald脹脹
parametre tipleri, o methodun
 'signature'unu oluturur. Siz bir method
巽a脹rd脹脹n脹zda, 旦ncelikle o nesnede o isimde bir
 method olup olmad脹脹na bak脹l脹r. Eer varsa,
巽a脹rd脹脹n脹z parametrelerin tipleriyle birlikte
 eletirme yap脹l脹r ve uygun bir method varsa
derleme ilemi baar脹l脹 olur. Aksi takdirde kod
 derlenemez.
 Bir nesnenin bir methodunu 巽a脹rd脹脹n脹zda compiler
k脹z脹yorsa ve siz method ismini
 doru yazd脹脹n脹za eminseniz, bilinki verdiiniz
paramtereler ya eksiktir, ya fazlad脹r, ya s脹ras脹
 yanl脹t脹r ya da parametre tipleri yanl箪t脹r.
Overloading (eitleme)
 Overloading (eitleme)
 Bir metotla ayn脹 isimde baka bir method yaz脹labilir. Buna
overloading (巽eitleme)
 denir. Bu ilem, benzer ilemleri farkl脹 parametelerle
yapan iki method i巽in yap脹l脹r. Bu
 ekilde, bir 巽ok method ismini 旦renmekten kurtulmu
oluruz. Ancak, overloading ileminde
 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脹 ii
yap脹yorlarsa, bir tanesine hi巽 gerek yok.
 Farkl脹 iler yap脹yorlarsa farkl脹 bir isimde olmal脹d脹r.
Birden Fazla Constructor
 Bir class'脹n farkl脹 parametreler alan birden fazla
constructor'u olabilir.
 Yani constrcutor'lar da method'lar gibi 'overload'
edilebilirler. Bir 旦rnek verelim.






















package com.atml;
class ulasim_constructor {
float yuz_km_litre;
float gidilecek_km;
float mazot_ucret;
public ulasim_constructor(float ykl,float gk,float mu){
yuz_km_litre=ykl;
gidilecek_km=gk;
mazot_ucret=mu;
}
// G旦r端ld端端 gibi overload ederek oluturduumuz ikinci
constructor iki parametreye sahip ve mazot 端cretini kendisi
belirliyor
public ulasim_constructor(float ykl,float gk){
yuz_km_litre=ykl;
gidilecek_km=gk;
mazot_ucret=(float) 5.0;
}
public float maliyet_hesapla(){
return yuz_km_litre*(gidilecek_km/100)*mazot_ucret;
}
}
rnek











package com.atml;
public class ulas脹m_c_test {
public static void main(String[] args){
ulasim_constructor uc=new
ulasim_constructor(6.7f,896f,4.5f);
float masraf = uc.maliyet_hesapla();
System.out.println("Toplam masraf脹n脹z...:"+masraf+" TL");
ulasim_constructor ucon2=new
ulasim_constructor(6.7f,896f);
float masraf1 = ucon2.maliyet_hesapla();
System.out.println("Toplam masraf脹n脹z...:"+masraf1+" TL");
} }
G旦r端ld端端 gibi iki ayr脹 nesne (uc,ucon2) iki ayr脹 constructor kullan脹yor.
Package
 Birbiriyle ilev veya kullan脹m a巽脹s脹ndan ilikili classlar
package' ad脹 verilen bir birim
 alt脹nda birletirilir. Bir class脹n ait olduu packagei
belirtmek i巽in package' keyword'端
 kullan脹l脹r.
 package mypackage;
 public class MyClass
 // ..
 }
 Bir class'脹n dier bir classla ayn脹 packagete olmas脹,
ona baz脹 avantajlar salar.
 Asl脹nda b端t端n classlar bir packagee ait olmak
zorundad脹r. Hi巽 bir isim verilmediinde 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
packagesiz olan baka bir class脹n derlenmesini
 engelleyebilir.
 Import
 Bir class'脹n kendisiyle ayn脹 packagede olmayan class脹
kullanabilmesi i巽in, class tan脹m脹ndan 旦nce import etmesi
gerekir. Bu sadece kullan脹lacan classlar脹n tam olarak
hangi pakette olduunu s旦ylemek anlam脹na gelir. Bunun
i巽in import' keyword'端 kullan脹l脹r.
 package myanotherpackage;
 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
deildir.
 '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 classlar脹 import etmek i巽in *'
operat旦r端 kullan脹labilir.
 package myanotherpackage;
 import mypackage.*;
 public class MyAnotherClass
 // ..
 }
 Bu ilem, altalta 巽ok say脹da import ifadesi yazmaktan
daha kolayd脹r.
 '*' operat旦r端 kullan脹ld脹脹nda bir 巽ok class脹n gereksiz yere
import edildii gibi bir izlenim domakla birlikte, import
ilemi asl脹nda bir belirtmeden 旦teye ger巽ek bir i巽ine
alma ilemi
 anlam脹na gelmedii i巽in 旦nemli bir performans kayb脹na
yol a巽maz. Sadece baz脹 programc脹lar okunurluu
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.
rnein, 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.
 Bir class'ta 端st packagei import etmek, otomatikman alt
packagelerin de import edilecei anlam脹na gelmez. rnein,
java.awt.* ifadesi java.awt.event.* ifadesini i巽ermez. Bu alt
 package'den herhangi bir class kullan脹lacaksa ayr脹ca import
edilmesi gerekir.
 Standart Packageler
 Java'n脹n kendi API脹 (Application Programming Interface Uygulama Programlama Aray端z端端) bir 巽ok classdan olutuu
i巽in bir 巽ok package alt脹nda grupland脹r脹lm脹t脹r.
 Bunlar脹n 巽ou java. ve javax. la balar. javax 旦neki daha
巽ok, sonradan extension (ekleme) package'ler i巽in kullan脹l脹r.
nceden extension olan packageler daha sonra
 standart API'a dahil olabilmektedir.
 Java'n脹n standart packageleri benzer ve ilikili class'lardan
oluur. Her packagede bulunan class'lar脹n ezberlenmesine
gerek yoktur. Sadece her packagede ne t端r classlar脹n
 bulunduu 旦renilmesi yeterlidir. rnein, aray端zle ilgili
classlar java.awtdedir. G旦rsel bir bileen olarak Button bu
packagetedir. Yine g旦rsel bir bileen olan text alan脹n脹n
 (TextArea'n脹n) da bu packagede olmas脹 gayet doald脹r.
 Naming Convention (脹simlendirme Gelenei)
 Package isimlerinin rastgele verilmesi, bir sistemde farkl脹
kurumlara ait packageleri bulunmas脹 durumunda name
collision' (isim 巽arp脹mas脹) ad脹 verilen bir sorun
yaratabilmektedir. Ayn脹 package ismini baka bir kurum da
kulland脹ysa ne olacak?
 rnein siz packagein ad脹n脹 myapplets koydunuz. Sistemde
ayn脹 isimde baka bir kuruma ait bir package daha var
tesad端fen. Java 旦nce hanginizinkini bulursa onu y端kler. Sizinki
 旦nce bulunuyorsa onlar脹n packagei doru 巽al脹maz, onlar脹nki
旦nceyse sizinki.
 Bu sorunlarla kar脹lamamak i巽in package isimlerinde standart
bir y旦ntem uygulan脹r. Bir kurum, sahip olduu 脹nternet domain
ismini tersten yazarak package isimlerinin 旦n端ne
 ekler. rnein godoro.coma sahip olan kurum veya kiiler,
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.
Javay脹 ortaya 巽脹karan
 'Sun' firmas脹 da kendi packagelerini com.sun. eklinde
balatmaktad脹r. zel kurulular com., ticari olmaytan kurumlar
da org. ile balarlar.
 Ayn脹 Packageteki Classlar
 Ayn脹 packagedeki classlar birbirlerinin private
olmayan property ve methodlar脹na, onlar public
olmasala bile ula脹rlar. Ayr脹ca, ayn脹 packagedeki
classlar脹n birbirlerini import etmeleri gerekmez.
 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脹 eitirildiinde
dosyan脹nda ad脹 deitirilmelidir. Tek dosyada
bulunan classlar derlendiinde her biri i巽in ayr脹
.class 端retilir. Yani derlendikten sonra classlar
birbirinden ayr脹l脹rlar. Bir derleme
 biriminde sadece bir tane class bulundurmak,
zorunlu olmasa da bir gelenek halini alm脹t脹r.











Encapsulation
Encapsulation Kavram脹
Her class 巽eitli 端yelerden (property ve methodlardan) oluur. Hemen hemen
b端t端n
class'lar baka bir class taraf脹ndan kullan脹lmak amac脹yla 端retildiinden, baz脹
端yeler sadece d脹ar脹dan kullan脹lmak 端zere haz脹rlanm脹t脹r. Buna kar脹 baz脹 property
ve methodlar, dierlerine yard脹mc脹 olmak, sadece onlar taraf脹ndan class脹n i巽
ilerinde kullan脹lmak i巽in yaz脹l脹rlar. Belli bir class脹 kullanan class脹n bunlar脹 g旦rmesi
veya bilmesi gerekmez. Hatta baz脹 durumlarda property ve methodlar脹n sadece
ufak bir k脹sm脹 d脹ar脹s脹 taraf脹ndan kullan脹l脹r. Bir insan脹n belli bir classa bakt脹脹nda
端yelerden hangisi kendisinin iine yarar, hangisi sadece baka methodlarda
kullan脹lmak i巽in yap脹lm脹t脹r ve classa 旦zeldir anlamas脹 巽ok zor olabilir. Baz脹
durumlarda da g端venlik ve salaml脹k salamak amac脹yla bir class脹 kullanan
class'脹n baz脹 propertyleri deitirmesi ve baz脹 methodlara erimesi engellenmek
istenebilir. Baz脹 property ve methodlar脹n ait olduu class脹n d脹脹nda eriimini
s脹n脹rlama 旦zelliine 'encapsulation' (kaps端lleme) denir. Encapsulation salamak
i巽in private, public ve proteced s旦zc端kleri kullan脹l脹r. Bunlara access modifier
(eriim deitirici) denir. Hi巽 birini kullanmak da bu balamda 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脹 packagedeki dier classlar eriebilir, dier
packagelerdekiler eriemez.
Read Only Property







public class sinifim{
private int value=3;
public int getValue(){
return value;
}
}
Applicationda instance
olutural脹m











public class app{
public static void main(){
sinifim d=new sinifim();
int v=d.getValue();
System.out.println("Value : "+v);
}
}
Buradaki value private olduu i巽in
int v=d.value;
Derleyicinin hata vermesine yol a巽acakt脹r.
Read/Write Only Property













public class sinifim{
private int value=3;
public int getValue(){
return value;
}
public void setValue(int v){
if(v>0){
value=v;
}else{
value=-v;
} } }
聴stenirse sinifim class脹nda getValue() metodu 巽脹kar脹larak
sadece Write only property yap脹lm脹 olur.
Applicationda instance
olutural脹m










public class app{
public static void main(){
sinifim d=new sinifim();
d.setValue(-7);
int v=d.getValue();
System.out.println("Value : "+v);
}
}
聴stenirse sinifim class脹nda getvalue() metodu
巽脹kar脹larak sadece Write only property yap脹lm脹 olur.















Protected Access
Baz脹 durumlarda bir property veya methodun d脹ar脹ya kapal脹
olmas脹n脹 ancak o class脹 extend edenlere a巽脹k olmas脹 istenebilir. Bu
durumda 'protected' eriim deitiricisi kullan脹l脹r.
Bir class dierini extend ederse, onun b端t端n public propertylerin
eriebilir hale gelir. Zatenbunlara her class'脹n eriebilmektedir. Hi巽
bir private property extend eden classa ge巽mez.
Bunlar dier b端t端n classlara da kapal脹d脹r. Ancak protected
property ve methodlar d脹ar脹ya kapal脹 olduklar脹 halde, extend
edilen class bunlara eriim hakk脹na sahiptir. Bu keyword, belli bir
property veya method'un sadece onu extend eden class'lar脹
ilgilendirmesi durumunda
kullan脹l脹r.
Eriim deitirici olarak protected verilmi property veya
methodlara o classla ayn脹 package i巽erisindeki b端t端n class'lar
taraf脹ndan da eriilebilir.
Eriim 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 旦zellii i巽ermemesi, yani
tan脹mland脹脹 classtan eriilemez
ama onun d脹脹ndaki b端t端n classlardan eriilmesi gibi bir durum s旦z
konusu olamaz.
 Inheritance (Kal脹t脹m)
 Inheritance Kavram脹
 Bir class'脹n baka bir classdaki property ve methodlara
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
dierindeki 旦zellikleri miras olarak almas脹
 i巽in kullan脹lan keyword extends' dir. Anlam olarak "Bu
class u class脹 geniletir yani
 ondaki property ve methodlar脹 al脹r ve yenilerini ekler"
demektir.
 Inheritance, baz脹 durumlarda baka birinin yazd脹脹
classa baz脹 eklemeler yaparak belli bir
 ilem i巽in kullan脹l脹r hale getirmek i巽in kullan脹labilir.
B旦ylelikle sadece o classta olmayan
 property ve methodlar脹 eklemek suretiyle 巽ok k脹sa s端rede
gelimi 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脹

























Kullan脹ma 旦rnek verebilmek ad脹na daha 旦nceden kulland脹脹m脹z
ulasim_constructor.java s脹n脹f脹n脹n propertilerini aa脹daki ekilde protected olarak
d端zenledik.
package com.atml;
class ulasim_constructor {
Protected float yuz_km_litre;
Protected float gidilecek_km;
Protected float mazot_ucret;
public ulasim_constructor()
{
yuz_km_litre=8.8f;
gidilecek_km=900f;
mazot_ucret=5.0f;
}
public ulasim_constructor(float ykl,float gk,float mu){
yuz_km_litre=ykl;
gidilecek_km=gk;
mazot_ucret=mu;
}
public ulasim_constructor(float ykl,float gk){
yuz_km_litre=ykl;
gidilecek_km=gk;
}
public float maliyet_hesapla(){
return yuz_km_litre*(gidilecek_km/100)*mazot_ucret;
}}
Ulasim_ver2.java


















package com.atml;
public class ulasim_ver2 extends ulasim_constructor
{
//yeni property ile yol zorluunu da maliyete ekleyeceiz
public float yol_zorluk_oran=1.0f;
public ulasim_ver2(float a,float b,float c,float d)
{
//super s脹nf脹n constructorunu 巽a脹rarak deerleri super s脹n脹ftaki
//deikenlere aktard脹k
super(a,b,c);
yol_zorluk_oran=d;
}
//yol_durum hesaba kat脹larak yap脹lan yeni maliyet_hesaplav2
//metodu
public float maliyet_hesaplav2()
{
return
yuz_km_litre*(gidilecek_km/100)*mazot_ucret*yol_zorluk_oran;
}}
App_ulasim_ver2.java
application ile 旦rnek
















package com.atml;
public class app_ulasim_ver2 {
public static void main(String[] args)
{
//uv2 ad脹nda nesne oluturduk ve deerleri aa脹daki //gibi verdik
ulasim_ver2 uv2=new ulasim_ver2(5f,1000f,5.0f,1.5f);
float ucret= uv2.maliyet_hesaplav2();
System.out.println("Yol Durumuna Bal脹 Toplam Maliyet...:"+ucret);
//Alt sat脹rda miras ald脹脹m脹z metodunu kullanm脹 olduk.
float ucret2= uv2.maliyet_hesapla();
System.out.println("Yol Durumuna Bak脹lmaks脹z脹n Toplam
Maliyet...:"+ucret2);
}}
脹kt脹:
Yol Durumuna Bal脹 Toplam Maliyet...:375.0
Yol Durumuna Bak脹lmaks脹z脹n Toplam Maliyet...:250.0
Extends
 G旦r端ld端端 gibi yeni bir s脹n脹f oluturarak yol_durum
ad脹nda bir dier property ve maliyet_hesaplav2
metoduyla yeni bir s脹n脹f yaratm脹 ve eski s脹n脹f脹n hem
constructor脹n脹 巽a脹rm脹, hem de property ve metodlar脹n脹
kullanm脹 olduk.
 Bir constructor'脹n dierini 巽a脹rmas脹 durumunda super
ifadesi kesinlikle ilk sat脹rda belirtilmelidir. Herhangi bir kod
par巽as脹 yaz脹ld脹ktan sonra super class'脹n bir constructoru
 巽ar脹lamaz.
 Super class'脹n constructoru a巽脹k olarak 巽ar脹lmad脹k巽a,
parametresiz olan super()
 constructor'un 巽ar脹ld脹脹 varsay脹l脹r. Super constructorun
b旦yle bir constructoru yoksa
 mutlaka parametreli bir constructor 巽ar脹lmal脹d脹r. Aksi
takdirde derleyici hata verir.
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 methodunun
 signature'uyla ayn脹 olmal脹d脹r. Bu ilem bazen
methodun tamamen deitirme, bazen de
 sadece bir ekleme yapma eklinde yap脹l脹r.
 @Override
 public float maliyet_hesapla()
 {
 return
yuz_km_litre*(gidilecek_km/100)*mazot_ucret*yol_z
orluk_oran;
 }
 Maliyet_hesaplav2 metodu yerine Override ettik.
Overriding (Ezme)
 Override eden method, override edilen methodu
巽a脹rabilir. Ancak ikisinin de ad脹 da
 parametreleri de ayn脹 olduu i巽in super anahtar
s旦zc端丹端 kullan脹l脹r.







@Override
public float maliyet_hesapla()
{
float sonuc=super.maliyet_hesapla();
return sonuc*yol_zorluk_oran;
}
Overload
 Super class'da olan bir method'un ismiyle ayn脹 farkl脹
parametreler alan bir method
 yazl脹abilir. Ama bu durumda overriding deil
overloading yap脹lm脹 olur. Yani var olan bir
 method'u deitirmek yerine yeni bir method
eklenmi olur. 脹lk method 巽ar脹ld脹脹nda yine
 eskisi gibi 巽al脹脹r.
 -----Ulasim_ver2.java-- public float maliyet_hesapla(float a)
 {
 float sonuc=super.maliyet_hesapla();
 return sonuc*a;
 }
Multiple Inheritance
 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 methodlar脹n脹 miras almas脹
m端mk端n deildir. C++ gibi dier nesneye
 y旦nelik dillerde bu m端mk端nd端r ama Javada kafa
kar脹脹kl脹脹na, 巽al脹ma zorluuna, birbirine
 girmi yap脹lar yaratmaya neden olduu i巽in izin
verilmemitir. Javadaki single inheritance
 (tekli inheritance)da hangi class'脹n hangisini extend
ettii bir aa巽 yap脹s脹 eklinde net bir
 eklide g旦r端lmektedir. Asl脹nda bu yaz脹l脹m tasar脹m脹
a巽脹s脹ndan da gereklidir. rnein bir
Multiple Inheritance
 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
kular gibi u巽tuunu g旦r端p onu hem
 memeli hem ku saymak ne kadar yanl脹sa, bir class脹 iki
ayr脹 class脹n 旦zelliklerine birden
 sahip olmas脹 gerektiini d端端nmek o derece yanl脹t脹r.
Eer 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 baka 巽旦z端m yollar脹
devreye girer. Bunlar脹 programc脹 ve
 sistem tasar脹mc脹lar脹 Javada bilgi ve deneyimlerini
artt脹rd脹k巽a 旦renebilirler. rnein iki
 class'脹 extend etmek yerine birini extend etmek, dierini
bir property olarak tan脹mlamak ve
 kullanmak mant脹kl脹 bir 巽旦z端m olabilir..
Aray端z
















Java dilinde interface ad脹n脹 ta脹yan, tasar脹m ablonlar脹nda ve
modellemede kullan脹lan s脹n脹flar
tan脹mlamak m端mk端nd端r. Bir interface normal bir Java s脹n脹f脹ndan farks脹z bir
ekilde
tan脹mlan脹r. S脹n脹f tan脹mlan脹rken class yerine interface terimi kullan脹l脹r.
Nesneye y旦nelik programlama dillerinde (旦rnein C++) tamamen soyut
(abstract) s脹n脹flar
tan脹mlanarak oluturulabilecek interface benzeri s脹n脹flar i巽in Java dilinde
interface ve
implements gibi 旦zel kelimeler (keywords) mevcuttur. Bu Java diline esnek
yaz脹l脹mlar
yap脹labilmesi ad脹na b端y端k zenginlik katmaktad脹r. Bunun nas脹l yap脹ld脹脹n脹
g旦rmeden 旦nce, bir
interface s脹n脹f脹n ne olduunu g旦relim.
package org.javatasarim.interfaces.oernek1;
public interface Tasit
{
public String getMarka();
}
Javada tan脹mlanm脹 bir interface s脹n脹ftan, normal bir s脹n脹fta olduu gibi
new() operat旦r端 ile
bir nesne oluturulamaz!
Bu aray端z端 kullanacak bir
s脹n脹f olutural脹m.









package org.javatasarim.interfaces.oernek1;
public class Audi implements Tasit
{
public String getMarka()
{
return "Audi A4";
}
}
Oluturduumuz s脹n脹fa
ait bir uygulama..

























package org.javatasarim.interfaces.oernek1;
/**
* TasitTest2 sinifi
*
* @author Oezcan Acar
*
*/
public class TasitTest2
{
/**
* Bu 旦rnekte, new operat旦r端 kullanilarak, bir Audi marka
* tasit 端rettik. Tasit interface'ini kullanan main metodu
* Tasit veritipinde bir nesne tanimliyor. Bu nesne
* Tasit interface'ini implemente eden herhanigi bir sinif
* olabilir.
*
* @param args
*/
public static void main(String args[])
{
Tasit tasit = new Audi();
System.out.println(tasit.getMarka());
}
}
Abstract (Soyut) S脹n脹f
 Ortak 旦zellikleri olan nesneleri modellemek i巽in Java
dilinde soyut s脹nflar kullan脹l脹r.
 Soyut s脹n脹flardan interface s脹n脹flar脹nda olduu gibi
somut nesneler oluturulamaz.
 package org.javatasarim.abstractclass;
Abstract (Soyut) S脹n脹f
























/**
* BinekOto sinifi
public abstract class BinekOto
{
private String marka;
private int ueretimYili;
private int vitesAdedi;
/**
* Altsiniflar tarafindan implemente
* edilmek zorunda olan bir metod.
* @return marka String
*/
public abstract String getMarka();
/**
* Altsiniflar tarafindan kullanilabilir
* yada tekrar re-implemente edilebilir
* bir metod.
*/
public int getUeretimYili()
{
return this.ueretimYili;
}
}
Abstract (Soyut) S脹n脹f
 Interface s脹n脹flar脹n脹n aksine, soyut s脹n脹flarda istenilen
s脹n脹f metodlar脹 normal bir Java s脹n脹f脹nda
 olduu gibi implemente edilebilir.
 BinekOto.java s脹n脹f脹 bir soyut s脹n脹ft脹r. getMarka()
isminde bir soyut metodu ve
 getUeretimYili() isminde normal bir metodu
bulunmaktad脹r. getMarka() soyut olduundan,
 alt s脹n脹flar脹n bu metodu mutlaka implemente
etmeleri gerekmektedir. Aksi taktirde Java
 compiler (derleyici) resim 3 de g旦r端ld端端 ekilde
hata mesaj脹 verecektir.
Abstract (Soyut) S脹n脹f
























Ford isminde, BinekOto s脹n脹f脹ndaki 旦zellikleri devralan bir alt s脹n脹f tan脹ml脹yoruz. Bunun
i巽in
Java dilinde extend direktifi kullan脹l脹r
package org.javatasarim.abstractclass;
/**
Ford marka binek otomobil
public class Ford extends BinekOto
{
public String getMarka()
{
return "Ford Focus";
}
/**
* getUeretimYili() metodu 端st sinifta
* tanimlanmistir ve alt sinifta degistirilerek
* tekrar re-implemente edilebilir yada
* degistirilmeden kullanilabilir.
*/
public int getUeretimYili()
{
System.out.println(super.getUeretimYili());
return super.getUeretimYili();
}
}
Abstract (Soyut) S脹n脹f















BinekOto s脹n脹f脹nda getMarka() soyut olarak tan脹mland脹脹 i巽in, alt s脹n脹flarda mutlaka
getMarka() isminde implementasyonu yap脹lm脹脹 bir metodun bulunmas脹
gerekmektedir. Ford
s脹n脹f脹, tan脹mlamak zorunda olmadan, BinekOto s脹n脹f脹nda yeralan getUeretimYili()
metodunu
ve s脹n脹f degiskenlerini kullanabilir. Java gibi nesneye y旦nelik programlama (OOP =
object
oriented programming) dillerinde, ortak deerler bir ana s脹n脹fta toplan脹r ve alt
s脹n脹flarda,
sadece alt s脹n脹f i巽in gerekli ekleme ve deiiklikler yap脹larak kullan脹l脹r. Alt s脹n脹flar,
istedikleri
taktirde, 端st s脹n脹fta tan脹mlanm脹 bir metodu, kendi b端nyelerinde deitirebilirler
(reimplementasyon).
Soyut s脹n脹flar, interface s脹n脹flar脹n aksine tecr端beli Java programc脹lar脹 taraf脹ndan
yaz脹l脹mda
tercih edilmezler. Kompleks s脹n脹f hiyerarileri, kodun bak脹m脹n脹 ve geniletilmesini
engeller.
Bu problemi 巽旦zmek i巽in 巽esitli tasar脹m ablonlar脹 端retilmitir. Bunlardan bir tanesi
Composite tasar脹m ablonudur. Composite tasar脹m ablonu ile, soyut s脹n脹flar ve bu
s脹n脹flar脹n
alt s脹n脹flar脹n脹 oluturan impelentasyonlar脹 birbirinden ay脹rmak ve bu ekilde s脹n脹flar
aras脹
ba脹ml脹l脹脹 azaltmak m端mk端nd端r.
Abstract Class ile Interface Aras脹ndaki Farklar












Abstract Class ile Interface Aras脹ndaki Farklar
1.
Abstract class; abstract methodlar脹 bar脹nd脹rabildii gibi, implement
edilmi methodlar脹 da bar脹nd脹rabilir. Interfaceler ise sadece method
tan脹mlar脹n脹 bar脹nd脹rabilir. Interfaceler i巽inde methodlar implement edilemez.
Ayr脹ca interface i巽inde tan脹mlanm脹 metodlar varsay脹lan olarak abstract
olarak tan脹mlanm脹t脹r.
2.
Abstract class i巽inde final ve static olmayan deikenler, veya final
ve static olan sabitler tan脹mlanabildii gibi, interfaceler de sadece sabitler
tan脹mlanabilir. Interface i巽inde tan脹mlanan sabitler varsay脹lan olarak public
final static olarak tan脹mlan脹rlar.
3.
Bir interface i巽inde yer alan t端m elemanlar public olarak tan脹mlanmal脹d脹r.
Fakat abstract class i巽indeki herey normal classlarda olduu gibi public,
protected ya da private olarak tan脹mlanabilir.
4.
Interfaceler implements anahtar kelimesiyle implement edilir, abstract
classlar ise extends anahtar kelimesi ile kendilerinden t端retilirler.
5.
Bir interface sadece baka bir interfaceden t端retilebilir. Abstract class ise
normal class gibi kendisinden s脹n脹f t端retebildii gibi birden fazla interfacei de
implement edebilir.
6.
Bir Java s脹n脹f脹 birden fazla interfacei implement edebildii gibi sadece bir
tane abstract classdan t端reyebilir.
7.
Interfaceler tamamiyle soyuttur ve bu sebepten dolay脹 interfacelerden
instancelar oluturulamaz. Abstract classlarda da instance oluturulamaz
fakat i巽inde main() methodu bar脹nd脹r脹yorsa 巽al脹t脹r脹labilirler.
8.
Javada bir class birden fazla classdan t端retilemedii i巽in bu ii
interfaceler yard脹m脹yla ger巽ekletiriyoruz. Java da multiple inheritance
interfaceler yard脹m脹yla ger巽ekletiriliyor. Bir Java class脹 birden fazla interfacei
implement edebilir.











9.
Abstract class varsay脹lan olarak Object class脹ndan
t端rediinden dolay脹 abstract class i巽inde hashCode, toString,
clone gibi methodlar kullan脹labilir. Fakat b旦yle bir durum
interfaceler i巽in ge巽erli deildir 巽端nk端 kendi i巽inde implement
edilmi bir method bar脹nd脹ramazlar.
10. Abstract classlar constructora sahip olabilir fakat
interfaceler脹n constructor脹 bulunmaz.
11. Abstract class脹n tan脹mlanmas脹 abstract anahtar kelimesiyle
yap脹l脹rken; interfacein tan脹m脹n脹 interface anahtar kelimesi ile
ger巽ekletiriyoruz.
12. Abstract classlar interfacelere g旦re daha h脹zl脹 巽al脹脹rlar.
13. Interfacelere daha sonradan eklenen metodlar interfacei
kullanan t端m classlar taraf脹ndan implement edilmesi
gerekmektedir. Fakat abstract classa daha sonradan eklenen bir
method ayn脹 abstract class i巽inde implement edilerek, bu
abstract classdan t端reyen subclasslar taraf脹ndan kullan脹labilir.
14. 聴巽inde sadece soyut metodlar脹 bar脹nd脹ran abstract
classlara fully abstract class, i巽inde hem soyut hem de somut
metodlar bulunan abstract classlara ise partially abstract
class denir. Fully abstract class ile interface aras脹nda fonksiyonellik
a巽脹s脹ndan bir fark bulunmamaktad脹r. 聴kisi de soyut method
bar脹nd脹rmaktad脹r.
15. Abstract classlar sadece bir tane classdan extend
edilebilirken; interfaceler ise bir yada birden fazla interfaceden
extend edilebilirler.
KAYNAKLAR
 http://hilmi.trakya.edu.tr/ders_notlari/Java/Nesneye
_Yonelik_Programlama.pdf
 rnekler 旦zg端n olarak haz脹rlanm脹 konu ak脹脹ndan
faydalan脹lm脹t脹r.
 zcan ACAR  Java Tasar脹m ablonlar脹
 Interface
 Abstract Class
 http://javamuhendisligi.blogspot.com.tr/2011/12/ab
stract-class-ile-interface-arasndaki.html
 Abstract class ile interface aras脹ndaki farklar
Ad

Recommended

PDF
Programlama I (C) Ders Notu
PaylasOgren
PDF
Mant脹k Devreleri
PaylasOgren
PPTX
Java OOP
Muhammed YALIN
PPTX
Temiz Kod
ASIMYILDIZ
PPTX
Java Classes.pptx
AliHorasan
PDF
Java ile grogramlamaya giris
rudiacikgoz
PPTX
Design Patterns - Tasar脹m ablonlar脹 Sunumu
Cem Topkaya (MSc)
PPTX
CSharp Programlama Dili ve Net Framework
Cem Topkaya (MSc)
PPT
Bas5e bol 03_turkce_tamami
muratgulenc
PPTX
BilgeAdam Nesne Y旦nelimli Programlama
Sinan Bozku
PDF
Nesne tabanl脹 programlamada s脹n脹flar
Erol Dizdar
PPTX
Introduction to Java programming
An脹l S旦zeri
PPTX
C#, Microsoft Yaz Okulu 2011 - 聴zmir
Enterprisecoding
PPT
bal脹kk 11111
ahmettuna343
PDF
Class Diagram
Seyfullah Demir
PPTX
Base presentation
Murat YavuzKAPLAN
PDF
C# OOP
nal n

More Related Content

Similar to Oopjava (9)

PPT
Bas5e bol 03_turkce_tamami
muratgulenc
PPTX
BilgeAdam Nesne Y旦nelimli Programlama
Sinan Bozku
PDF
Nesne tabanl脹 programlamada s脹n脹flar
Erol Dizdar
PPTX
Introduction to Java programming
An脹l S旦zeri
PPTX
C#, Microsoft Yaz Okulu 2011 - 聴zmir
Enterprisecoding
PPT
bal脹kk 11111
ahmettuna343
PDF
Class Diagram
Seyfullah Demir
PPTX
Base presentation
Murat YavuzKAPLAN
PDF
C# OOP
nal n
Bas5e bol 03_turkce_tamami
muratgulenc
BilgeAdam Nesne Y旦nelimli Programlama
Sinan Bozku
Nesne tabanl脹 programlamada s脹n脹flar
Erol Dizdar
Introduction to Java programming
An脹l S旦zeri
C#, Microsoft Yaz Okulu 2011 - 聴zmir
Enterprisecoding
bal脹kk 11111
ahmettuna343
Class Diagram
Seyfullah Demir
Base presentation
Murat YavuzKAPLAN
C# OOP
nal n

Oopjava

  • 1. NESNE TABANLI PROGRAMLAMA (JAVA) Bilgisayar Sistemleri retmeni Bahad脹r GNAYDIN Email: gunaydinbahadir@hotmail.com
  • 2. Ula脹m S脹n脹f脹 ncelikle 旦rnek olmas脹 a巽脹s脹ndan bir class olutural脹m. S脹n脹f脹m脹z脹n ad脹 ulasim.java olsun. S脹n脹f脹m脹z脹n amac脹 g旦nderilen parametrelere g旦re ulasim maliyetini hesaplamakt脹r. Burada yuz_km_litre 旦zellii arac脹n y端z kilometrede ka巽 litre yakt脹脹 bilgisini, gidilecek_km 旦zellii mesafeyi, mazot_端cret ise o g端nk端 mazot litre fiyat脹n脹 temsil etmektedir.
  • 3. ulasim.java package com.atml; class ulasim { float yuz_km_litre; float gidilecek_km; float mazot_ucret; public float maliyet_hesapla(){ yuz_km_litre*(gidilecek_km/100)*mazot_ucret; return } }
  • 4. INSTANCE Class tan脹m脹na uygun olarak yarat脹lan nesnelere instance (旦rnek) denir. S脹n脹f脹m脹z脹n 旦zellikler(property) ve y旦ntemlerden (method) olutuunu biliyoruz. imdi baka bir 旦rnek i巽inde bir instance oluturaca脹z. Yeni oluturaca脹m脹z nesnenin ad脹 u olsun
  • 5. ntptest.java package com.atml; public class ntptest { public static void main(String[] args) { ulasim u=new ulasim(); u.yuz_km_litre=5.2f; u.mazot_ucret=4.5f; u.gidilecek_km=750.5f; float ucret=u.maliyet_hesapla(); System.out.println("Toplam Maliyet...:"+ucret); } }
  • 6. Property Initialization zelliklerin deerleri belirtilmeden maliyet_hesapla metodunun 巽al脹mas脹 olas脹l脹脹nda derleyici hata 端retecektir. 端nk端 旦zelliklerin deerleri null dur. Bu gibi s脹k脹nt脹lara engel olmak i巽in 旦zellikler aa脹daki ekilde initialise(balatma) edilmedir. package com.atml; class ulasim { float yuz_km_litre=8.0f; float gidilecek_km=100f; float mazot_ucret=4.6f; public float maliyet_hesapla(){ return yuz_km_litre*(gidilecek_km/100)*mazot_ucret; } }
  • 7. Constructor Bir nesnenin yarat脹lma aamas脹nda baz脹 ilemlerin yap脹lmas脹, baz脹 deerlerin atanmas脹 gerekebilir. Bir nesne yarat脹l脹rken 巽ar脹lan method benzeri yap脹ya constructor' denir. Constructor asl脹nda bir method deildir. Ama classla ayn脹 ismi ta脹yan, d旦n端 deeri olmayan bir method olarak da d端端n端lebilir. Prizman脹n boyutlar脹n脹n daha instance yarat脹l脹rken verilmesi bu ekilde salanabilir. Bir sonraki 旦rnekte initialise ilemini constructor yard脹m脹yla yapal脹m.
  • 8. package com.atml; class ulasim_constructor { float yuz_km_litre; float gidilecek_km; float mazot_ucret; public ulasim_constructor(float ykl,float gk,float mu){ yuz_km_litre=ykl; gidilecek_km=gk; mazot_ucret=mu; } public float maliyet_hesapla(){ return yuz_km_litre*(gidilecek_km/100)*mazot_ucret; } }
  • 9. Ulasim.java package com.atml; class ulasim_constructor { float yuz_km_litre; float gidilecek_km; float mazot_ucret; public ulasim_constructor(float ykl,float gk,float mu){ yuz_km_litre=ykl; gidilecek_km=gk; mazot_ucret=mu; } public float maliyet_hesapla(){ return yuz_km_litre*(gidilecek_km/100)*mazot_ucret; } }
  • 10. rnek imdi bir 旦rnek ile instance olutural脹m.
  • 11. Ornek.java package com.atml; public class ulas脹m_c_test { public static void main(String[] args){ ulasim_constructor uc=new ulasim_constructor(6.7f,896f,4.5f); float masraf = uc.maliyet_hesapla(); System.out.println("Toplam masraf脹n脹z...:"+masraf+" TL"); } }
  • 12. Method Signature Bir method'un ismiyle birlikte s脹ras脹yla ald脹脹 parametre tipleri, o methodun 'signature'unu oluturur. Siz bir method 巽a脹rd脹脹n脹zda, 旦ncelikle o nesnede o isimde bir method olup olmad脹脹na bak脹l脹r. Eer varsa, 巽a脹rd脹脹n脹z parametrelerin tipleriyle birlikte eletirme yap脹l脹r ve uygun bir method varsa derleme ilemi baar脹l脹 olur. Aksi takdirde kod derlenemez. Bir nesnenin bir methodunu 巽a脹rd脹脹n脹zda compiler k脹z脹yorsa ve siz method ismini doru yazd脹脹n脹za eminseniz, bilinki verdiiniz paramtereler ya eksiktir, ya fazlad脹r, ya s脹ras脹 yanl脹t脹r ya da parametre tipleri yanl箪t脹r.
  • 13. Overloading (eitleme) Overloading (eitleme) Bir metotla ayn脹 isimde baka bir method yaz脹labilir. Buna overloading (巽eitleme) denir. Bu ilem, benzer ilemleri farkl脹 parametelerle yapan iki method i巽in yap脹l脹r. Bu ekilde, bir 巽ok method ismini 旦renmekten kurtulmu oluruz. Ancak, overloading ileminde 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脹 ii yap脹yorlarsa, bir tanesine hi巽 gerek yok. Farkl脹 iler yap脹yorlarsa farkl脹 bir isimde olmal脹d脹r.
  • 14. Birden Fazla Constructor Bir class'脹n farkl脹 parametreler alan birden fazla constructor'u olabilir. Yani constrcutor'lar da method'lar gibi 'overload' edilebilirler. Bir 旦rnek verelim.
  • 15. package com.atml; class ulasim_constructor { float yuz_km_litre; float gidilecek_km; float mazot_ucret; public ulasim_constructor(float ykl,float gk,float mu){ yuz_km_litre=ykl; gidilecek_km=gk; mazot_ucret=mu; } // G旦r端ld端端 gibi overload ederek oluturduumuz ikinci constructor iki parametreye sahip ve mazot 端cretini kendisi belirliyor public ulasim_constructor(float ykl,float gk){ yuz_km_litre=ykl; gidilecek_km=gk; mazot_ucret=(float) 5.0; } public float maliyet_hesapla(){ return yuz_km_litre*(gidilecek_km/100)*mazot_ucret; } }
  • 16. rnek package com.atml; public class ulas脹m_c_test { public static void main(String[] args){ ulasim_constructor uc=new ulasim_constructor(6.7f,896f,4.5f); float masraf = uc.maliyet_hesapla(); System.out.println("Toplam masraf脹n脹z...:"+masraf+" TL"); ulasim_constructor ucon2=new ulasim_constructor(6.7f,896f); float masraf1 = ucon2.maliyet_hesapla(); System.out.println("Toplam masraf脹n脹z...:"+masraf1+" TL"); } } G旦r端ld端端 gibi iki ayr脹 nesne (uc,ucon2) iki ayr脹 constructor kullan脹yor.
  • 17. Package Birbiriyle ilev veya kullan脹m a巽脹s脹ndan ilikili classlar package' ad脹 verilen bir birim alt脹nda birletirilir. Bir class脹n ait olduu packagei belirtmek i巽in package' keyword'端 kullan脹l脹r. package mypackage; public class MyClass // .. }
  • 18. Bir class'脹n dier bir classla ayn脹 packagete olmas脹, ona baz脹 avantajlar salar. Asl脹nda b端t端n classlar bir packagee ait olmak zorundad脹r. Hi巽 bir isim verilmediinde 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 packagesiz olan baka bir class脹n derlenmesini engelleyebilir.
  • 19. Import Bir class'脹n kendisiyle ayn脹 packagede olmayan class脹 kullanabilmesi i巽in, class tan脹m脹ndan 旦nce import etmesi gerekir. Bu sadece kullan脹lacan classlar脹n tam olarak hangi pakette olduunu s旦ylemek anlam脹na gelir. Bunun i巽in import' keyword'端 kullan脹l脹r. package myanotherpackage; 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 deildir. '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.
  • 20. * Operat旦r端yle Import Bir package'deki b端t端n classlar脹 import etmek i巽in *' operat旦r端 kullan脹labilir. package myanotherpackage; import mypackage.*; public class MyAnotherClass // .. } Bu ilem, altalta 巽ok say脹da import ifadesi yazmaktan daha kolayd脹r. '*' operat旦r端 kullan脹ld脹脹nda bir 巽ok class脹n gereksiz yere import edildii gibi bir izlenim domakla birlikte, import ilemi asl脹nda bir belirtmeden 旦teye ger巽ek bir i巽ine alma ilemi anlam脹na gelmedii i巽in 旦nemli bir performans kayb脹na yol a巽maz. Sadece baz脹 programc脹lar okunurluu artt脹rmak i巽in b旦yle bir yola gitmektedirler.
  • 21. Fully-Qualified Name (Tam Nitelendirilmi 脹sim) Asl脹nda her class package ismiyle birlikte adland脹r脹l脹r. rnein, 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.
  • 22. Bir class'ta 端st packagei import etmek, otomatikman alt packagelerin de import edilecei anlam脹na gelmez. rnein, java.awt.* ifadesi java.awt.event.* ifadesini i巽ermez. Bu alt package'den herhangi bir class kullan脹lacaksa ayr脹ca import edilmesi gerekir. Standart Packageler Java'n脹n kendi API脹 (Application Programming Interface Uygulama Programlama Aray端z端端) bir 巽ok classdan olutuu i巽in bir 巽ok package alt脹nda grupland脹r脹lm脹t脹r. Bunlar脹n 巽ou java. ve javax. la balar. javax 旦neki daha 巽ok, sonradan extension (ekleme) package'ler i巽in kullan脹l脹r. nceden extension olan packageler daha sonra standart API'a dahil olabilmektedir. Java'n脹n standart packageleri benzer ve ilikili class'lardan oluur. Her packagede bulunan class'lar脹n ezberlenmesine gerek yoktur. Sadece her packagede ne t端r classlar脹n bulunduu 旦renilmesi yeterlidir. rnein, aray端zle ilgili classlar java.awtdedir. G旦rsel bir bileen olarak Button bu packagetedir. Yine g旦rsel bir bileen olan text alan脹n脹n (TextArea'n脹n) da bu packagede olmas脹 gayet doald脹r.
  • 23. Naming Convention (脹simlendirme Gelenei) Package isimlerinin rastgele verilmesi, bir sistemde farkl脹 kurumlara ait packageleri bulunmas脹 durumunda name collision' (isim 巽arp脹mas脹) ad脹 verilen bir sorun yaratabilmektedir. Ayn脹 package ismini baka bir kurum da kulland脹ysa ne olacak? rnein siz packagein ad脹n脹 myapplets koydunuz. Sistemde ayn脹 isimde baka bir kuruma ait bir package daha var tesad端fen. Java 旦nce hanginizinkini bulursa onu y端kler. Sizinki 旦nce bulunuyorsa onlar脹n packagei doru 巽al脹maz, onlar脹nki 旦nceyse sizinki. Bu sorunlarla kar脹lamamak i巽in package isimlerinde standart bir y旦ntem uygulan脹r. Bir kurum, sahip olduu 脹nternet domain ismini tersten yazarak package isimlerinin 旦n端ne ekler. rnein godoro.coma sahip olan kurum veya kiiler, 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. Javay脹 ortaya 巽脹karan 'Sun' firmas脹 da kendi packagelerini com.sun. eklinde balatmaktad脹r. zel kurulular com., ticari olmaytan kurumlar da org. ile balarlar.
  • 24. Ayn脹 Packageteki Classlar Ayn脹 packagedeki classlar birbirlerinin private olmayan property ve methodlar脹na, onlar public olmasala bile ula脹rlar. Ayr脹ca, ayn脹 packagedeki classlar脹n birbirlerini import etmeleri gerekmez. 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脹 eitirildiinde dosyan脹nda ad脹 deitirilmelidir. Tek dosyada bulunan classlar derlendiinde her biri i巽in ayr脹 .class 端retilir. Yani derlendikten sonra classlar birbirinden ayr脹l脹rlar. Bir derleme biriminde sadece bir tane class bulundurmak, zorunlu olmasa da bir gelenek halini alm脹t脹r.
  • 25. Encapsulation Encapsulation Kavram脹 Her class 巽eitli 端yelerden (property ve methodlardan) oluur. Hemen hemen b端t端n class'lar baka bir class taraf脹ndan kullan脹lmak amac脹yla 端retildiinden, baz脹 端yeler sadece d脹ar脹dan kullan脹lmak 端zere haz脹rlanm脹t脹r. Buna kar脹 baz脹 property ve methodlar, dierlerine yard脹mc脹 olmak, sadece onlar taraf脹ndan class脹n i巽 ilerinde kullan脹lmak i巽in yaz脹l脹rlar. Belli bir class脹 kullanan class脹n bunlar脹 g旦rmesi veya bilmesi gerekmez. Hatta baz脹 durumlarda property ve methodlar脹n sadece ufak bir k脹sm脹 d脹ar脹s脹 taraf脹ndan kullan脹l脹r. Bir insan脹n belli bir classa bakt脹脹nda 端yelerden hangisi kendisinin iine yarar, hangisi sadece baka methodlarda kullan脹lmak i巽in yap脹lm脹t脹r ve classa 旦zeldir anlamas脹 巽ok zor olabilir. Baz脹 durumlarda da g端venlik ve salaml脹k salamak amac脹yla bir class脹 kullanan class'脹n baz脹 propertyleri deitirmesi ve baz脹 methodlara erimesi engellenmek istenebilir. Baz脹 property ve methodlar脹n ait olduu class脹n d脹脹nda eriimini s脹n脹rlama 旦zelliine 'encapsulation' (kaps端lleme) denir. Encapsulation salamak i巽in private, public ve proteced s旦zc端kleri kullan脹l脹r. Bunlara access modifier (eriim deitirici) denir. Hi巽 birini kullanmak da bu balamda 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脹 packagedeki dier classlar eriebilir, dier packagelerdekiler eriemez.
  • 26. Read Only Property public class sinifim{ private int value=3; public int getValue(){ return value; } }
  • 27. Applicationda instance olutural脹m public class app{ public static void main(){ sinifim d=new sinifim(); int v=d.getValue(); System.out.println("Value : "+v); } } Buradaki value private olduu i巽in int v=d.value; Derleyicinin hata vermesine yol a巽acakt脹r.
  • 28. Read/Write Only Property public class sinifim{ private int value=3; public int getValue(){ return value; } public void setValue(int v){ if(v>0){ value=v; }else{ value=-v; } } } 聴stenirse sinifim class脹nda getValue() metodu 巽脹kar脹larak sadece Write only property yap脹lm脹 olur.
  • 29. Applicationda instance olutural脹m public class app{ public static void main(){ sinifim d=new sinifim(); d.setValue(-7); int v=d.getValue(); System.out.println("Value : "+v); } } 聴stenirse sinifim class脹nda getvalue() metodu 巽脹kar脹larak sadece Write only property yap脹lm脹 olur.
  • 30. Protected Access Baz脹 durumlarda bir property veya methodun d脹ar脹ya kapal脹 olmas脹n脹 ancak o class脹 extend edenlere a巽脹k olmas脹 istenebilir. Bu durumda 'protected' eriim deitiricisi kullan脹l脹r. Bir class dierini extend ederse, onun b端t端n public propertylerin eriebilir hale gelir. Zatenbunlara her class'脹n eriebilmektedir. Hi巽 bir private property extend eden classa ge巽mez. Bunlar dier b端t端n classlara da kapal脹d脹r. Ancak protected property ve methodlar d脹ar脹ya kapal脹 olduklar脹 halde, extend edilen class bunlara eriim hakk脹na sahiptir. Bu keyword, belli bir property veya method'un sadece onu extend eden class'lar脹 ilgilendirmesi durumunda kullan脹l脹r. Eriim deitirici olarak protected verilmi property veya methodlara o classla ayn脹 package i巽erisindeki b端t端n class'lar taraf脹ndan da eriilebilir. Eriim 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 旦zellii i巽ermemesi, yani tan脹mland脹脹 classtan eriilemez ama onun d脹脹ndaki b端t端n classlardan eriilmesi gibi bir durum s旦z konusu olamaz.
  • 31. Inheritance (Kal脹t脹m) Inheritance Kavram脹 Bir class'脹n baka bir classdaki property ve methodlara 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 dierindeki 旦zellikleri miras olarak almas脹 i巽in kullan脹lan keyword extends' dir. Anlam olarak "Bu class u class脹 geniletir yani ondaki property ve methodlar脹 al脹r ve yenilerini ekler" demektir. Inheritance, baz脹 durumlarda baka birinin yazd脹脹 classa baz脹 eklemeler yaparak belli bir ilem i巽in kullan脹l脹r hale getirmek i巽in kullan脹labilir. B旦ylelikle sadece o classta olmayan property ve methodlar脹 eklemek suretiyle 巽ok k脹sa s端rede gelimi 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.
  • 32. Extends Kullan脹m脹 Kullan脹ma 旦rnek verebilmek ad脹na daha 旦nceden kulland脹脹m脹z ulasim_constructor.java s脹n脹f脹n脹n propertilerini aa脹daki ekilde protected olarak d端zenledik. package com.atml; class ulasim_constructor { Protected float yuz_km_litre; Protected float gidilecek_km; Protected float mazot_ucret; public ulasim_constructor() { yuz_km_litre=8.8f; gidilecek_km=900f; mazot_ucret=5.0f; } public ulasim_constructor(float ykl,float gk,float mu){ yuz_km_litre=ykl; gidilecek_km=gk; mazot_ucret=mu; } public ulasim_constructor(float ykl,float gk){ yuz_km_litre=ykl; gidilecek_km=gk; } public float maliyet_hesapla(){ return yuz_km_litre*(gidilecek_km/100)*mazot_ucret; }}
  • 33. Ulasim_ver2.java package com.atml; public class ulasim_ver2 extends ulasim_constructor { //yeni property ile yol zorluunu da maliyete ekleyeceiz public float yol_zorluk_oran=1.0f; public ulasim_ver2(float a,float b,float c,float d) { //super s脹nf脹n constructorunu 巽a脹rarak deerleri super s脹n脹ftaki //deikenlere aktard脹k super(a,b,c); yol_zorluk_oran=d; } //yol_durum hesaba kat脹larak yap脹lan yeni maliyet_hesaplav2 //metodu public float maliyet_hesaplav2() { return yuz_km_litre*(gidilecek_km/100)*mazot_ucret*yol_zorluk_oran; }}
  • 34. App_ulasim_ver2.java application ile 旦rnek package com.atml; public class app_ulasim_ver2 { public static void main(String[] args) { //uv2 ad脹nda nesne oluturduk ve deerleri aa脹daki //gibi verdik ulasim_ver2 uv2=new ulasim_ver2(5f,1000f,5.0f,1.5f); float ucret= uv2.maliyet_hesaplav2(); System.out.println("Yol Durumuna Bal脹 Toplam Maliyet...:"+ucret); //Alt sat脹rda miras ald脹脹m脹z metodunu kullanm脹 olduk. float ucret2= uv2.maliyet_hesapla(); System.out.println("Yol Durumuna Bak脹lmaks脹z脹n Toplam Maliyet...:"+ucret2); }} 脹kt脹: Yol Durumuna Bal脹 Toplam Maliyet...:375.0 Yol Durumuna Bak脹lmaks脹z脹n Toplam Maliyet...:250.0
  • 35. Extends G旦r端ld端端 gibi yeni bir s脹n脹f oluturarak yol_durum ad脹nda bir dier property ve maliyet_hesaplav2 metoduyla yeni bir s脹n脹f yaratm脹 ve eski s脹n脹f脹n hem constructor脹n脹 巽a脹rm脹, hem de property ve metodlar脹n脹 kullanm脹 olduk. Bir constructor'脹n dierini 巽a脹rmas脹 durumunda super ifadesi kesinlikle ilk sat脹rda belirtilmelidir. Herhangi bir kod par巽as脹 yaz脹ld脹ktan sonra super class'脹n bir constructoru 巽ar脹lamaz. Super class'脹n constructoru a巽脹k olarak 巽ar脹lmad脹k巽a, parametresiz olan super() constructor'un 巽ar脹ld脹脹 varsay脹l脹r. Super constructorun b旦yle bir constructoru yoksa mutlaka parametreli bir constructor 巽ar脹lmal脹d脹r. Aksi takdirde derleyici hata verir.
  • 36. 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 methodunun signature'uyla ayn脹 olmal脹d脹r. Bu ilem bazen methodun tamamen deitirme, bazen de sadece bir ekleme yapma eklinde yap脹l脹r. @Override public float maliyet_hesapla() { return yuz_km_litre*(gidilecek_km/100)*mazot_ucret*yol_z orluk_oran; } Maliyet_hesaplav2 metodu yerine Override ettik.
  • 37. Overriding (Ezme) Override eden method, override edilen methodu 巽a脹rabilir. Ancak ikisinin de ad脹 da parametreleri de ayn脹 olduu i巽in super anahtar s旦zc端丹端 kullan脹l脹r. @Override public float maliyet_hesapla() { float sonuc=super.maliyet_hesapla(); return sonuc*yol_zorluk_oran; }
  • 38. Overload Super class'da olan bir method'un ismiyle ayn脹 farkl脹 parametreler alan bir method yazl脹abilir. Ama bu durumda overriding deil overloading yap脹lm脹 olur. Yani var olan bir method'u deitirmek yerine yeni bir method eklenmi olur. 脹lk method 巽ar脹ld脹脹nda yine eskisi gibi 巽al脹脹r. -----Ulasim_ver2.java-- public float maliyet_hesapla(float a) { float sonuc=super.maliyet_hesapla(); return sonuc*a; }
  • 39. Multiple Inheritance 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 methodlar脹n脹 miras almas脹 m端mk端n deildir. C++ gibi dier nesneye y旦nelik dillerde bu m端mk端nd端r ama Javada kafa kar脹脹kl脹脹na, 巽al脹ma zorluuna, birbirine girmi yap脹lar yaratmaya neden olduu i巽in izin verilmemitir. Javadaki single inheritance (tekli inheritance)da hangi class'脹n hangisini extend ettii bir aa巽 yap脹s脹 eklinde net bir eklide g旦r端lmektedir. Asl脹nda bu yaz脹l脹m tasar脹m脹 a巽脹s脹ndan da gereklidir. rnein bir
  • 40. Multiple Inheritance 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 kular gibi u巽tuunu g旦r端p onu hem memeli hem ku saymak ne kadar yanl脹sa, bir class脹 iki ayr脹 class脹n 旦zelliklerine birden sahip olmas脹 gerektiini d端端nmek o derece yanl脹t脹r. Eer 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 baka 巽旦z端m yollar脹 devreye girer. Bunlar脹 programc脹 ve sistem tasar脹mc脹lar脹 Javada bilgi ve deneyimlerini artt脹rd脹k巽a 旦renebilirler. rnein iki class'脹 extend etmek yerine birini extend etmek, dierini bir property olarak tan脹mlamak ve kullanmak mant脹kl脹 bir 巽旦z端m olabilir..
  • 41. Aray端z Java dilinde interface ad脹n脹 ta脹yan, tasar脹m ablonlar脹nda ve modellemede kullan脹lan s脹n脹flar tan脹mlamak m端mk端nd端r. Bir interface normal bir Java s脹n脹f脹ndan farks脹z bir ekilde tan脹mlan脹r. S脹n脹f tan脹mlan脹rken class yerine interface terimi kullan脹l脹r. Nesneye y旦nelik programlama dillerinde (旦rnein C++) tamamen soyut (abstract) s脹n脹flar tan脹mlanarak oluturulabilecek interface benzeri s脹n脹flar i巽in Java dilinde interface ve implements gibi 旦zel kelimeler (keywords) mevcuttur. Bu Java diline esnek yaz脹l脹mlar yap脹labilmesi ad脹na b端y端k zenginlik katmaktad脹r. Bunun nas脹l yap脹ld脹脹n脹 g旦rmeden 旦nce, bir interface s脹n脹f脹n ne olduunu g旦relim. package org.javatasarim.interfaces.oernek1; public interface Tasit { public String getMarka(); } Javada tan脹mlanm脹 bir interface s脹n脹ftan, normal bir s脹n脹fta olduu gibi new() operat旦r端 ile bir nesne oluturulamaz!
  • 42. Bu aray端z端 kullanacak bir s脹n脹f olutural脹m. package org.javatasarim.interfaces.oernek1; public class Audi implements Tasit { public String getMarka() { return "Audi A4"; } }
  • 43. Oluturduumuz s脹n脹fa ait bir uygulama.. package org.javatasarim.interfaces.oernek1; /** * TasitTest2 sinifi * * @author Oezcan Acar * */ public class TasitTest2 { /** * Bu 旦rnekte, new operat旦r端 kullanilarak, bir Audi marka * tasit 端rettik. Tasit interface'ini kullanan main metodu * Tasit veritipinde bir nesne tanimliyor. Bu nesne * Tasit interface'ini implemente eden herhanigi bir sinif * olabilir. * * @param args */ public static void main(String args[]) { Tasit tasit = new Audi(); System.out.println(tasit.getMarka()); } }
  • 44. Abstract (Soyut) S脹n脹f Ortak 旦zellikleri olan nesneleri modellemek i巽in Java dilinde soyut s脹nflar kullan脹l脹r. Soyut s脹n脹flardan interface s脹n脹flar脹nda olduu gibi somut nesneler oluturulamaz. package org.javatasarim.abstractclass;
  • 45. Abstract (Soyut) S脹n脹f /** * BinekOto sinifi public abstract class BinekOto { private String marka; private int ueretimYili; private int vitesAdedi; /** * Altsiniflar tarafindan implemente * edilmek zorunda olan bir metod. * @return marka String */ public abstract String getMarka(); /** * Altsiniflar tarafindan kullanilabilir * yada tekrar re-implemente edilebilir * bir metod. */ public int getUeretimYili() { return this.ueretimYili; } }
  • 46. Abstract (Soyut) S脹n脹f Interface s脹n脹flar脹n脹n aksine, soyut s脹n脹flarda istenilen s脹n脹f metodlar脹 normal bir Java s脹n脹f脹nda olduu gibi implemente edilebilir. BinekOto.java s脹n脹f脹 bir soyut s脹n脹ft脹r. getMarka() isminde bir soyut metodu ve getUeretimYili() isminde normal bir metodu bulunmaktad脹r. getMarka() soyut olduundan, alt s脹n脹flar脹n bu metodu mutlaka implemente etmeleri gerekmektedir. Aksi taktirde Java compiler (derleyici) resim 3 de g旦r端ld端端 ekilde hata mesaj脹 verecektir.
  • 47. Abstract (Soyut) S脹n脹f Ford isminde, BinekOto s脹n脹f脹ndaki 旦zellikleri devralan bir alt s脹n脹f tan脹ml脹yoruz. Bunun i巽in Java dilinde extend direktifi kullan脹l脹r package org.javatasarim.abstractclass; /** Ford marka binek otomobil public class Ford extends BinekOto { public String getMarka() { return "Ford Focus"; } /** * getUeretimYili() metodu 端st sinifta * tanimlanmistir ve alt sinifta degistirilerek * tekrar re-implemente edilebilir yada * degistirilmeden kullanilabilir. */ public int getUeretimYili() { System.out.println(super.getUeretimYili()); return super.getUeretimYili(); } }
  • 48. Abstract (Soyut) S脹n脹f BinekOto s脹n脹f脹nda getMarka() soyut olarak tan脹mland脹脹 i巽in, alt s脹n脹flarda mutlaka getMarka() isminde implementasyonu yap脹lm脹脹 bir metodun bulunmas脹 gerekmektedir. Ford s脹n脹f脹, tan脹mlamak zorunda olmadan, BinekOto s脹n脹f脹nda yeralan getUeretimYili() metodunu ve s脹n脹f degiskenlerini kullanabilir. Java gibi nesneye y旦nelik programlama (OOP = object oriented programming) dillerinde, ortak deerler bir ana s脹n脹fta toplan脹r ve alt s脹n脹flarda, sadece alt s脹n脹f i巽in gerekli ekleme ve deiiklikler yap脹larak kullan脹l脹r. Alt s脹n脹flar, istedikleri taktirde, 端st s脹n脹fta tan脹mlanm脹 bir metodu, kendi b端nyelerinde deitirebilirler (reimplementasyon). Soyut s脹n脹flar, interface s脹n脹flar脹n aksine tecr端beli Java programc脹lar脹 taraf脹ndan yaz脹l脹mda tercih edilmezler. Kompleks s脹n脹f hiyerarileri, kodun bak脹m脹n脹 ve geniletilmesini engeller. Bu problemi 巽旦zmek i巽in 巽esitli tasar脹m ablonlar脹 端retilmitir. Bunlardan bir tanesi Composite tasar脹m ablonudur. Composite tasar脹m ablonu ile, soyut s脹n脹flar ve bu s脹n脹flar脹n alt s脹n脹flar脹n脹 oluturan impelentasyonlar脹 birbirinden ay脹rmak ve bu ekilde s脹n脹flar aras脹 ba脹ml脹l脹脹 azaltmak m端mk端nd端r.
  • 49. Abstract Class ile Interface Aras脹ndaki Farklar Abstract Class ile Interface Aras脹ndaki Farklar 1. Abstract class; abstract methodlar脹 bar脹nd脹rabildii gibi, implement edilmi methodlar脹 da bar脹nd脹rabilir. Interfaceler ise sadece method tan脹mlar脹n脹 bar脹nd脹rabilir. Interfaceler i巽inde methodlar implement edilemez. Ayr脹ca interface i巽inde tan脹mlanm脹 metodlar varsay脹lan olarak abstract olarak tan脹mlanm脹t脹r. 2. Abstract class i巽inde final ve static olmayan deikenler, veya final ve static olan sabitler tan脹mlanabildii gibi, interfaceler de sadece sabitler tan脹mlanabilir. Interface i巽inde tan脹mlanan sabitler varsay脹lan olarak public final static olarak tan脹mlan脹rlar. 3. Bir interface i巽inde yer alan t端m elemanlar public olarak tan脹mlanmal脹d脹r. Fakat abstract class i巽indeki herey normal classlarda olduu gibi public, protected ya da private olarak tan脹mlanabilir. 4. Interfaceler implements anahtar kelimesiyle implement edilir, abstract classlar ise extends anahtar kelimesi ile kendilerinden t端retilirler. 5. Bir interface sadece baka bir interfaceden t端retilebilir. Abstract class ise normal class gibi kendisinden s脹n脹f t端retebildii gibi birden fazla interfacei de implement edebilir. 6. Bir Java s脹n脹f脹 birden fazla interfacei implement edebildii gibi sadece bir tane abstract classdan t端reyebilir. 7. Interfaceler tamamiyle soyuttur ve bu sebepten dolay脹 interfacelerden instancelar oluturulamaz. Abstract classlarda da instance oluturulamaz fakat i巽inde main() methodu bar脹nd脹r脹yorsa 巽al脹t脹r脹labilirler. 8. Javada bir class birden fazla classdan t端retilemedii i巽in bu ii interfaceler yard脹m脹yla ger巽ekletiriyoruz. Java da multiple inheritance interfaceler yard脹m脹yla ger巽ekletiriliyor. Bir Java class脹 birden fazla interfacei implement edebilir.
  • 50. 9. Abstract class varsay脹lan olarak Object class脹ndan t端rediinden dolay脹 abstract class i巽inde hashCode, toString, clone gibi methodlar kullan脹labilir. Fakat b旦yle bir durum interfaceler i巽in ge巽erli deildir 巽端nk端 kendi i巽inde implement edilmi bir method bar脹nd脹ramazlar. 10. Abstract classlar constructora sahip olabilir fakat interfaceler脹n constructor脹 bulunmaz. 11. Abstract class脹n tan脹mlanmas脹 abstract anahtar kelimesiyle yap脹l脹rken; interfacein tan脹m脹n脹 interface anahtar kelimesi ile ger巽ekletiriyoruz. 12. Abstract classlar interfacelere g旦re daha h脹zl脹 巽al脹脹rlar. 13. Interfacelere daha sonradan eklenen metodlar interfacei kullanan t端m classlar taraf脹ndan implement edilmesi gerekmektedir. Fakat abstract classa daha sonradan eklenen bir method ayn脹 abstract class i巽inde implement edilerek, bu abstract classdan t端reyen subclasslar taraf脹ndan kullan脹labilir. 14. 聴巽inde sadece soyut metodlar脹 bar脹nd脹ran abstract classlara fully abstract class, i巽inde hem soyut hem de somut metodlar bulunan abstract classlara ise partially abstract class denir. Fully abstract class ile interface aras脹nda fonksiyonellik a巽脹s脹ndan bir fark bulunmamaktad脹r. 聴kisi de soyut method bar脹nd脹rmaktad脹r. 15. Abstract classlar sadece bir tane classdan extend edilebilirken; interfaceler ise bir yada birden fazla interfaceden extend edilebilirler.
  • 51. KAYNAKLAR http://hilmi.trakya.edu.tr/ders_notlari/Java/Nesneye _Yonelik_Programlama.pdf rnekler 旦zg端n olarak haz脹rlanm脹 konu ak脹脹ndan faydalan脹lm脹t脹r. zcan ACAR Java Tasar脹m ablonlar脹 Interface Abstract Class http://javamuhendisligi.blogspot.com.tr/2011/12/ab stract-class-ile-interface-arasndaki.html Abstract class ile interface aras脹ndaki farklar