Final Deyisenler
Final sozunun menasi son demekdir.Java proqramlasdirma
dilinde final acar sozu deyisdirilemezliyi saglar. Biz qlobal olan
deyiskenlere,metodlara,ve ya siniflere final anlayisini tetbiq ede bilerik.
Qlobal deyiskenler
ile final anlayisi birlesdiyi
zaman diger proqramlasdirma dillerindeki
sabit deyer xususiyyeti ortaya
cixir.Qlobal olan sabit deyiskenler static olsa da olmasa da final xususiyyetine
sahib ola biler.Biz diqqetli olmaliyiq ki,final qlobal deyiskenler sadece bir
defe qiymet ala bilir.Meselen asagidaki kimi bir numuneye baxaq.
class Qutu {
int i = 0 ;
}
public class FinalNumune {
final int X_SABIT_DEYER = 34 ;
final static int Y_SABIT_DEYER = 35 ;
final int A_SABIT_DEYER = (int)(Math.random()*50);
final Qutu k = new Qutu() ;
public static void main(String args[]) {
FinalNumune fo = new FinalNumune();
//fo.X_SABIT_DEYER = 15 ! SEHV !
//fo.Y_SABIT_DEYER = 16 ! SEHV !
//fo.A_SABIT_DEYER = 17 ! SEHV !
fo.k.i = 35 ; // dogru
// fo.k = new Qutu() ! hata !
System.out.println("X_SABIT_DEYER = "+fo.X_SABIT_DEYER) ;
System.out.println("Y_SABIT_DEYER = "+fo.Y_SABIT_DEYER) ;
System.out.println("A_SABIT_DEYER = "+fo.A_SABIT_DEYER) ;
System.out.println("Qutu.i = "+fo.k.i) ;
}
}
Yuxaridaki numunemizi arasdirsaq x_SABIT_DEYER ve Y_SABIT_DEYER deyiskenlerinin qiymetlerini proqramimizi isletince bile bilerik,amma A_SABIT_DEYER deyiskeninin qiymetini proqrami isletmesek bile bilmerik.Cunki Math sinifine aid static bir metod olan random(),1 ile 50 arasinda istenilen qiymet ala biler,amma butun final xususiyyetine sahib olan deyiskenlere sadece bir defe qiymet verecek.Grunduyu kimi bu uc deyisen ozlerinin ilk qiymetlerini saxlayirlar.Qutu tipindeki k deyisenini finel etdiyimizde isler biraz qarisir.Biz k deyisenine final ermekle bu deyisenin basqa bir Qutu obyektine baglanmasina icaze vermerik,amma Qutu tipindeki k deyiseninin bagli oldugu obyektin ici deyise biler.numunemizinn neticesi awagidaki kimidir.
int i = 0 ;
}
public class FinalNumune {
final int X_SABIT_DEYER = 34 ;
final static int Y_SABIT_DEYER = 35 ;
final int A_SABIT_DEYER = (int)(Math.random()*50);
final Qutu k = new Qutu() ;
public static void main(String args[]) {
FinalNumune fo = new FinalNumune();
//fo.X_SABIT_DEYER = 15 ! SEHV !
//fo.Y_SABIT_DEYER = 16 ! SEHV !
//fo.A_SABIT_DEYER = 17 ! SEHV !
fo.k.i = 35 ; // dogru
// fo.k = new Qutu() ! hata !
System.out.println("X_SABIT_DEYER = "+fo.X_SABIT_DEYER) ;
System.out.println("Y_SABIT_DEYER = "+fo.Y_SABIT_DEYER) ;
System.out.println("A_SABIT_DEYER = "+fo.A_SABIT_DEYER) ;
System.out.println("Qutu.i = "+fo.k.i) ;
}
}
Yuxaridaki numunemizi arasdirsaq x_SABIT_DEYER ve Y_SABIT_DEYER deyiskenlerinin qiymetlerini proqramimizi isletince bile bilerik,amma A_SABIT_DEYER deyiskeninin qiymetini proqrami isletmesek bile bilmerik.Cunki Math sinifine aid static bir metod olan random(),1 ile 50 arasinda istenilen qiymet ala biler,amma butun final xususiyyetine sahib olan deyiskenlere sadece bir defe qiymet verecek.Grunduyu kimi bu uc deyisen ozlerinin ilk qiymetlerini saxlayirlar.Qutu tipindeki k deyisenini finel etdiyimizde isler biraz qarisir.Biz k deyisenine final ermekle bu deyisenin basqa bir Qutu obyektine baglanmasina icaze vermerik,amma Qutu tipindeki k deyiseninin bagli oldugu obyektin ici deyise biler.numunemizinn neticesi awagidaki kimidir.
X_SABIT_DEYER = 34
Y_SABIT_DEYER = 35
A_SABIT_DEYER = 39
Qutu.i = 35
Y_SABIT_DEYER = 35
A_SABIT_DEYER = 39
Qutu.i = 35
Final Parametrler
Final acar sozunun
bir başka isletmek yoluda metod paramtleridir. Metod içerisinde
deyiştirilmesini istemediyimiz parametrleri final acar sozu ile teyin ede
bilerik. Aşağıdaki kod bunu anlamamıza komek olacaq.
public final class FinalDeneme {
public void metod1() {
int a = 4;
System.out.println("a'nin
deyeri: " + a);
metod2(a);
System.out.println("a'nin
deyeri: " + a);
}
public void metod2(final int
b) {
b = b*2;
}
}
Yuxarıdaki kodda
metod1 içerisinde teyin etdiyimiz "a" deyişenini parametr olaraq
metod2'ye axtaririq ve metod2 içerisinde parametr deyişeninin deyerini
deyişdirmeye çalışıriq. Parametr deyişeni "b" final olaraq
teyin erdiyimiz ucun b deyişenine metod2 içerisinde herhansi bir emeliyyat
vasitesile basqa qiymet almasini temin etmek mümkün deyildir. Bu deyişen metod2
içerisinde sadece oxuna biler,. Bu sebeble yuxarıdaki kod derleme
anindan kece bilmeyecek ve aşağıdaki sehvi verecek.
The final local variable b cannot be assigned. It must be blank and not
using a compound assignment
Final Metodlar
Final acar sozu
metodlara da tetbiq oluna bilir. Final ile yazılan metodlar alt sinifler
terefinden override edile bilmezler. Aşağıdaki kod bu veziyyete
misaldir.
public class FinalDeneme {
public final void
finalMetod() {
System.out.println("Ata
sinifdeki finalMetod");
}
}
public class FinalDenemeSubClass extends FinalDeneme {
public void finalMetod() {
System.out.println("Alt
sinifdeki finalMetod");
}
}
Yuxarıdaki kod
derleme zamani aşağıdaki sehvi verecekdir.
Cannot override the final method from FinalDeneme
Göründüyü kimi ata
sinifdeki final ile teyin etdiyimiz bir metodu alt sinifde override etmeye
çalışdığımızda sehv alırıq. Alt siniflerde override edilerek deyişdirilmesini
istemediğimiz metodları final olaraq teyin ede bilerik.
Final Sinifler
Final final acar
sozu siniflere de tetbiq oluna biler. Bir sinifi aşağıdaki kimi final acar sozu
islederek teyin edirikse bu sinifi toretmek mümkün olmaz. Aşağıdaki
kodu inceleyek.
public final class FinalDeneme {
public void metod() {
System.out.println("Ata
sinifdeki finalMetod");
}
}
public class FinalDenemeSubClass extends FinalDeneme {
public void metod() {
System.out.println("Alt
sinifdekiki finalMetod");
}
}
Bu numunede final teyin edilmis bir sinifi toredib
içerisindeki metodu alt sinif içerisinde override etmeye çalışıriq. Metod final
olaraq teyin edildiyi üçün metodun override edilmesi eslinde mümkün kimi görünür
ancaq bu sefer sinifi final olaraq teyin etdiyimiz üçün sinifi toretmek
mümkün olmamaqdadir. Çünki final olaraq teyin olunan sinifler heçbir
sinif törede bilmez.Belelikle yuxaridaki kimi bir kod da aşagidaki kimi bir
sehve yol açacaq.
The type FinalDenemeSubClass cannot subclass the final class FinalDeneme
Hiç yorum yok:
Yorum Gönder