JAVA Final deyimi nedir ne işe yarar
Java’da pek bilinmeyen anahtar kelimelerinden birinde sırada. Final anahtar kelimesi, değişkenlere, method’lara ve bazı sınıflara konulabiliyor. Final deyince aklınıza “değiştirilemez”ibaresi gelebilir.. Tanım olarak;
- Final sınıf değişkenleri: Final olan bir sınıf değişkenine sadece bir kere değer ataması yapılabilir ve bu atama sadece sınıf konstrüktöründe gerçekleşebilir.
- Final metot parametreleri: Final olarak tanımlanmış bir metot parametresine sadece bir kere değer atanabilir. Metot parametrelerinin tamamen final olarak tanımlamış olmalarında büyük fayda vardır. Bu şekilde parametrenin metot bünyesinde değişikliğe ugrama tehlikesi ortadan kaldırılmış olur.
- Final metotlar: Final olan bir metot ne alt sınıflarca yeniden yüklenebilir (method overloading) ne de saklı (hidden) tutulabilir.
- Final sınıflar: Final olan bir sınıf genişletilerek bir alt sınıf oluşturulamaz.
Final Değişkenler :
Final değişkenler ilk değerini aldıktan sonra bir daha değiştirilemiyorlar. Örnek :
final int a=4;
int a=3; // –> Hatalı’dırr final değer ilk değeri aldıktan sonra değiştirilemez..
System.out.println(“a : ” + a);
Not : * Eğer final değişkeni tanımlayıp ilk değeri belirtmezseniz yine hata alırsınız. null,0 gibi değerler vermesini beklemeyin..
Final Değişkene bir örnek daha verirsek..
public class Ornek{
static final double PI = 3.14; // burada pi sayısını 3,14 e sabitliyoruz. Program içerisinde değiştirmeye çalışıldığında hata verecektir.
int yarıçap;
static int dairecevre;
double cevrehesapla(int r) {
int yaricap = r;
double daireninAlanı = 2 * PI * yaricap;
return daireninAlanı;
}
public static void main(String[] args) {
Ornek d1 = new Ornek();
double sonuc = d1.cevrehesapla(3);
System.out.println(sonuc);
}
}Final method–> Final method ise override olmasına izin vermeyen method’tur..(Override : Kalıtım yoluyla miras olarak aldığımız metodu ezmektektir..) Aşağıdaki kod parçacığında override engellenmiş ve derleme hatası mevcuttur.
public class FinalSuperClass{
final void yaz() {
System.out.println("Ana sinif final metodu");
}
}
public class FinalSubClass extends FinalSuperClass{
void yaz() {
System.out.println("Alt sınıftaki final metodu");
}
}
Final Class –>Final metodlara benzer bir yapı vardır. Final kelimesi oluşturulan sınıflarda kalıtım yapılamaz. Yani sınıfın alt sınıfları oluşturulamaz.
Finalize() –>Bir nesnenin yok edilmesi için kullanılan method’dur..Bu method çalışma esnasında nesne yok edileceği zaman çağrılır.. Yani sona erdirme methodudur.. Kullanılması pek önerilmemektedir. Aşağıdaki makalelerden nedenini öğrenebilirsiniz..
Detaylı bilgi için :
//www.seckintozlu.com/1300-effective-java-madde-7-finalizer-sonlandirici-kullanmaktan-kacinin.html
//www.dijitalders.com/icerik/44/2164/java_class_yapisinda_finalize_metotunun_kullanimi.html





ilk belirttiğiniz durum için eksik bilgiler var
final ve non-static bir veri elemanına
1-) İlk değer vererek
2-) non-static initializer içerisinde
3-) constructor içerisinde
final ve static bir veri elemanına
1-) ilk değer vererek
2-) static initializer içerisine tek bir kez atama yapılabilir.
– Aşağıda hepsini kapsayan bir örnek yaptım
class Test {
private static final int VAR = 5; // initalization
private static final String className;
static { // static initalizer block
className = “Test”;
}
private final int m_initialized = 1; // initalization
private final int m_initalizerBlock;
{ // non-static initalizer block
m_initalizerBlock = 2;
}
private final int m_initializeWithCtor;
public Test(int initializeWithCtor)
{
m_initializeWithCtor = initializeWithCtor;
}
}
2. dediğiniz durum ile alakalı java pass by value bir dil olduğu için final olarak belirtilmesinin pek bir anlamı yoktur. Java 8’den önce bu durumun kullanıldığı yerler vardı. Elimde gösterebileceğim bir örnek yok maalesef. Java 8 ile beraber effectively final kavramı dile eklendiği için artık buna da gerek kalmamıştır. Java 8’den sonra yazılan pek çok kodda böyle bir durum göremezsiniz.
//stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final
– Ayrıca saydıklarınızın dışında final türden bir yerel değişken bildirilebilir. Final yerel değişkenlere atama bir kez yapılabilir. İlk değer verme zorunluluğu yoktur.
void foo()
{
final int a = 5;
final int b;
b = 5; // doğru
}