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;
}
}
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.