Java'da "final", "nihayet" ve "finalize" anahtar kelimeleri hangi amacı yerine getirir? [kapalı]


82

Java'da, ne amaçla anahtar kelimeleri yapmak final, finallyve finalizeyerine getirmek?



12
Karşılaştırılabilir kavramlar bile değiller. Sadece benzer şekilde yazılırlar. Biraz okuyun.
Marcelo Cantos

3
Birbirleriyle hiçbir ilgileri yoktur - tamamen ilgisiz, kavramsal olarak. Her birini ayrı ayrı inceleyin.
Ed Staub

7
Nispeten yaygın bir soru gibi göründüğü için bu kapatılmamalıdır.
David Titarenco

1
İyi bir yanıt nedeniyle yeniden açılmak üzere oy verildi; bu, buraya gelen kullanıcılar için faydalı olabilir.
akappa

Yanıtlar:


272

final

final bir değişkeni "değiştirilemez" olarak işaretlemek için kullanılabilir

private final String name = "foo";  //the reference name can never change

final bir yöntemi "geçersiz kılınamaz" da yapabilir

public final String toString() {  return "NULL"; }

finalbir sınıfı "miras alınamaz" da yapabilir. yani, sınıf alt sınıflara ayrılamaz.

public final class finalClass {...}
public class classNotAllowed extends finalClass {...} // Not allowed

en sonunda

finally"her zaman" kodunu yürütmek için bir dene / yakala deyiminde kullanılır

lock.lock();
try {
  //do stuff
} catch (SomeException se) {
  //handle se
} finally {
  lock.unlock(); //always executed, even if Exception or Error or se
}

Java 7, java.io.Closeable veya java.lang.AutoCloseable'ı açık veya kapalı olarak uygulayan kaynakları otomatik olarak kapatmak için kullanabileceğiniz yeni bir kaynakla deneme ifadesine sahiptir.

Sonuçlandırmak

finalizebir nesne çöp toplandığında çağrılır. Nadiren geçersiz kılmanız gerekir. Bir örnek:

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}

18
Java kitaplarının çoğundan daha iyi yanıt !!
diaryfolio

3
Teşekkür ederim. Bu cevap, kendilerine "uzman" olarak adlandırılan diğerlerine kıyasla daha iyi açıklanmıştır.
datnt

2
Güzel cevap ama sonuçlandırma yönteminin imzası yanlış.
Samarth Şah

Not:Object#finalize() yöntem Java 9 (kullanımdan kaldırıldı JDK-8.165.641 ).
Slaw

19
  • "Son", bir şeyin değiştirilemeyeceğini belirtir. Bunu genellikle programınızın ömrü boyunca aynı değeri tutacak statik değişkenler üzerinde kullanmak istersiniz.
  • "Nihayet", bir dene / yakala bloğu ile birlikte kullanılır. "Nihayet" cümlesinin içindeki her şey, "try" bloğundaki kodun bir istisna atıp atmadığına bakılmaksızın çalıştırılacaktır.
  • "Sonlandır", bir nesne çöp toplanmaya başlamadan önce JVM tarafından çağrılır.

6

Son anahtar kelime sabitleri bildirmek için kullanılır.

final int FILE_TYPE = 3;

Nihayet anahtar sözcüğü, atılan istisnalara bakılmaksızın yürütülecek bir kod bloğu belirtmek için bir try catch deyiminde kullanılır.

try
{
  //stuff
}
catch(Exception e)
{
  //do stuff
}
finally
{
  //this is always run
}

Ve son olarak (haha), bir anahtar kelime olduğundan tam olarak emin değilim, ancak Object sınıfında bir finalize () işlevi var.


6

http://allu.wordpress.com/2006/11/08/difference-between-final-finally-and-finalize/

final - sabit beyan.

Nihayet - Nihayet bloğu, System.exit (0) çağrısı dışında, try bloğu çıktığında her zaman yürütülür. Bu, beklenmeyen bir istisna meydana gelse bile final bloğunun yürütülmesini sağlar. Ancak son olarak, istisna işlemeden daha fazlası için kullanışlıdır - programcının temizleme kodunun yanlışlıkla bir dönüş, devam etme veya kesme ile atlanmasını önlemesini sağlar. Hiçbir istisna beklenmese bile temizleme kodunu nihayet bloğuna koymak her zaman iyi bir uygulamadır.

finalize () - yöntem çöp toplamaya yardımcı olur. Bir nesne çöp toplayıcı tarafından atılmadan önce çağrılan ve durumunu temizlemesine izin veren bir yöntem. Dosya tanıtıcıları, soketler, veritabanı bağlantıları vb. Gibi bellek dışı kaynakları serbest bırakmak için kullanılmamalıdır çünkü Java'da bu kaynaklardan yalnızca sınırlı sayıda vardır ve bu bellek dışı kaynakları serbest bırakmak için çöp toplama işleminin ne zaman başlayacağını bilemezsiniz. finalize () yöntemi ile.

Google'da aramayı denediniz ve bir açıklama için açıklamaya mı ihtiyacınız var?


4
Stack Overflow'a hoş geldiniz! Bu makale aslında soruya cevap olsa da, tercih edildiğini burada cevabın temel parçalarını kapsadığı ve başvuru için bağlantı sağlar. Stack Overflow, yalnızca soruları ve yanıtları kadar yararlıdır ve bu blog ana bilgisayarı kapanırsa veya URL'ler taşınırsa, bu yanıt işe yaramaz hale gelir. Teşekkürler!
sarnold

6

final: final bir anahtar kelimedir. Son olarak bildirilen değişken yalnızca bir kez başlatılmalıdır ve değiştirilemez. Final olarak ilan edilen Java sınıfları genişletilemez. Final olarak bildirilen yöntemler geçersiz kılınamaz.

nihayet: nihayet bir bloktur. Nihayet bloğu, try bloğu çıktığında her zaman yürütülür. Bu, beklenmedik bir istisna meydana gelse bile nihayet bloğunun yürütülmesini sağlar. Ancak son olarak, istisna işlemeden daha fazlası için kullanışlıdır - programcının temizleme kodunun yanlışlıkla bir dönüş, devam etme veya kesme ile atlanmasını önlemesini sağlar. Hiçbir istisna beklenmese bile temizleme kodunu nihayet bloğuna koymak her zaman iyi bir uygulamadır.

finalize: finalize bir yöntemdir. Bir nesne çöp olarak toplanmadan önce, çalışma zamanı sistemi finalize () yöntemini çağırır. Çöp toplanmadan önce finalize () yönteminde sistem kaynakları yayın kodu yazabilirsiniz.


2

1. Son • Son, sınıf, yöntem ve değişken üzerindeki kısıtlamaları uygulamak için kullanılır. • Son sınıf miras alınamaz, son yöntem geçersiz kılınamaz ve son değişken değeri değiştirilemez. • Son değişkenler, Oluşturucu'da başlatılan boş son değişken durumu dışında, oluşturma sırasında başlatılır. • Final bir anahtar kelimedir.

2. Son olarak • Son olarak, dene ve yakala ile birlikte istisna işleme için kullanılır. • İstisna ele alınsın ya da işlenmesin yürütülecektir. • Bu blok, veritabanı bağlantısı, G / Ç kaynakları gibi kaynakları kapatmak için kullanılır. • Son olarak bir bloktur.

3. Sonlandırma • Sonlandırma, temizleme işlemini gerçekleştirmek için uygun nesneleri toplamadan hemen önce Çöp toplama iş parçacığı tarafından çağrılır. • Bu, nesnenin herhangi bir temizleme gerçekleştirmesi için son şanstır, ancak finalize () 'nin çağrılıp çağrılmayacağı garanti edilmediğinden, çağrıyı sonlandırana kadar kaynağı tutmak kötü bir uygulamadır. • Sonuçlandırmak bir yöntemdir.


0

Java'da final'in anlamı şudur: -bir değişkene uygulanır, ilgili değişkenin başlatıldıktan sonra artık değiştirilemeyeceği anlamına gelir

private final double numer = 12;

Bu değeri değiştirmeye çalışırsanız, bir hata alırsınız.

-bir yönteme uygulandığında, ilgili yöntemin geçersiz kılınamayacağı anlamına gelir

 public final void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }

Ancak son yöntem miras alınabilir çünkü son anahtar kelime yöntemin yeniden tanımlanmasını kısıtlar.

-bir sınıfa uygulandığında, ilgili sınıfın uzatılamayacağı anlamına gelir.

class Base
{

    public void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }
}

Nihayet'in anlamı şudur:

class TestFinallyBlock{  
  public static void main(String args[]){  
  try{  
   int data=25/5;  
   System.out.println(data);  
  }  
  catch(NullPointerException e){System.out.println(e);}  
  finally{System.out.println("finally block is always executed");}  
  System.out.println("rest of the code...");  
  }  
} 

bu örnekte, try-catch çalıştırılsa da çalıştırılmasa bile, nihayetin içinde olan her zaman yürütülecektir. Sonlandırmanın anlamı:

class FinalizeExample{  
public void finalize(){System.out.println("finalize called");}  
public static void main(String[] args){  
FinalizeExample f1=new FinalizeExample();  
FinalizeExample f2=new FinalizeExample();  
f1=null;  
f2=null;  
System.gc();  
}}  

Çöp Toplayıcıyı aramadan önce.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.