12 Mart 2012 Pazartesi

Final Mövzusu


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.
X_SABIT_DEYER = 34
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: