Welchen Zweck erfüllen in Java die Schlüsselwörter "final", "finally" und "finalize"? [geschlossen]


82

In Java, welchen Zweck die Schlüsselwörter final, finallyund finalizeerfüllen?


4

12
Sie sind nicht einmal vergleichbare Konzepte. Sie werden einfach ähnlich geschrieben. Lies etwas.
Marcelo Cantos

3
Sie haben nichts miteinander zu tun - konzeptionell völlig unabhängig. Studiere jedes einzeln.
Ed Staub

7
Dies sollte nicht abgeschlossen werden, da dies eine relativ häufige Frage zu sein scheint.
David Titarenco

1
hat aufgrund einer guten Antwort für die Wiedereröffnung gestimmt, was für Benutzer, die hier landen, nützlich sein kann.
Akappa

Antworten:


272

Finale

final kann verwendet werden, um eine Variable als "unveränderlich" zu markieren.

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

final kann auch eine Methode nicht "überschreibbar" machen

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

finalkann auch eine Klasse nicht "vererbbar" machen. dh die Klasse kann nicht untergeordnet werden.

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

endlich

finallywird in einer try / catch-Anweisung verwendet, um Code "immer" auszuführen.

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

Java 7 hat einen neuen Versuch mit einer Ressourcenanweisung , mit der Sie Ressourcen automatisch schließen können, die java.io.Closeable oder explizit oder implizit implementieren java.lang.AutoCloseable

finalisieren

finalizewird aufgerufen, wenn ein Objekt durch Müll gesammelt wird. Sie müssen es selten überschreiben. Ein Beispiel:

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

18
bessere Antwort als die meisten Java-Bücher !!
Tagebuch Portfolio

3
Danke dir. Diese Antwort ist im Vergleich zu anderen, die sich selbst "Experten" nennen, gut erklärt.
Datum

2
Gute Antwort, aber die Signatur der Finalisierungsmethode ist falsch.
Samarth Shah

Hinweis: Die Object#finalize()Methode war in Java 9 ( JDK-8165641 ) veraltet .
Slaw

19
  • "Final" bedeutet, dass etwas nicht geändert werden kann. Normalerweise möchten Sie dies für statische Variablen verwenden, die während der gesamten Lebensdauer Ihres Programms denselben Wert haben.
  • "Endlich" wird in Verbindung mit einem Try / Catch-Block verwendet. Alles innerhalb der "finally" -Klausel wird ausgeführt, unabhängig davon, ob der Code im 'try'-Block eine Ausnahme auslöst oder nicht.
  • "Finalize" wird von der JVM aufgerufen, bevor ein Objekt im Müll gesammelt wird.

6

Das letzte Schlüsselwort wird verwendet, um Konstanten zu deklarieren.

final int FILE_TYPE = 3;

Das Schlüsselwort finally wird in einer try catch-Anweisung verwendet, um einen Codeblock anzugeben, der unabhängig von ausgelösten Ausnahmen ausgeführt werden soll.

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

Und schließlich (haha) ist finalize im nicht ganz sicher, ob es sich um ein Schlüsselwort handelt, aber es gibt eine finalize () -Funktion in der Object-Klasse.


6

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

endgültige - konstante Erklärung.

finally - Der finally-Block wird immer ausgeführt, wenn der try-Block beendet wird, mit Ausnahme des Aufrufs System.exit (0). Dadurch wird sichergestellt, dass der finally-Block auch dann ausgeführt wird, wenn eine unerwartete Ausnahme auftritt. Aber schließlich ist es nicht nur für die Ausnahmebehandlung nützlich - es ermöglicht dem Programmierer zu vermeiden, dass der Bereinigungscode versehentlich durch eine Rückgabe umgangen, fortgesetzt oder unterbrochen wird. Das Einfügen von Bereinigungscode in einen finally-Block ist immer eine gute Vorgehensweise, auch wenn keine Ausnahmen zu erwarten sind.

finalize () - Methode hilft bei der Speicherbereinigung. Eine Methode, die aufgerufen wird, bevor ein Objekt vom Garbage Collector verworfen wird, damit es seinen Status bereinigen kann. Sollte nicht zum Freigeben von Nicht-Speicherressourcen wie Dateihandles, Sockets, Datenbankverbindungen usw. verwendet werden, da Java nur über eine begrenzte Anzahl dieser Ressourcen verfügt und Sie nicht wissen, wann die Garbage Collection aktiviert wird, um diese Nicht-Speicherressourcen freizugeben durch die finalize () Methode.

Haben Sie versucht, auf Google zu suchen, und benötigen eine Erläuterung?


4
Willkommen bei Stack Overflow! Während dieser Artikel tatsächlich die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Der Stapelüberlauf ist nur so nützlich wie seine Fragen und Antworten. Wenn dieser Blog-Host ausfällt oder URLs verschoben werden, wird diese Antwort unbrauchbar. Vielen Dank!
Sarnold

6

final: final ist ein Schlüsselwort. Die als final deklarierte Variable sollte nur einmal initialisiert werden und kann nicht geändert werden. Als final deklarierte Java-Klassen können nicht erweitert werden. Als final deklarierte Methoden können nicht überschrieben werden.

endlich: endlich ist ein block. Der finally-Block wird immer ausgeführt, wenn der try-Block beendet wird. Dadurch wird sichergestellt, dass der finally-Block auch dann ausgeführt wird, wenn eine unerwartete Ausnahme auftritt. Aber schließlich ist es nicht nur für die Ausnahmebehandlung nützlich - es ermöglicht dem Programmierer zu vermeiden, dass der Bereinigungscode versehentlich durch eine Rückgabe umgangen, fortgesetzt oder unterbrochen wird. Das Einfügen von Bereinigungscode in einen finally-Block ist immer eine gute Vorgehensweise, auch wenn keine Ausnahmen zu erwarten sind.

finalize: finalize ist eine Methode. Bevor ein Objekt durch Müll gesammelt wird, ruft das Laufzeitsystem seine finalize () -Methode auf. Sie können den Freigabecode für Systemressourcen in die Methode finalize () schreiben, bevor Sie den Müll sammeln.


2

1. Final • Final wird verwendet, um Einschränkungen für Klasse, Methode und Variable anzuwenden. • Die endgültige Klasse kann nicht vererbt werden, die endgültige Methode kann nicht überschrieben werden und der endgültige Variablenwert kann nicht geändert werden. • Die endgültigen Variablen werden zum Zeitpunkt der Erstellung initialisiert, außer im Fall einer leeren endgültigen Variablen, die im Konstruktor initialisiert wird. • Final ist ein Schlüsselwort.

2. Schließlich • Wird schließlich für die Ausnahmebehandlung zusammen mit try and catch verwendet. • Es wird ausgeführt, ob eine Ausnahme behandelt wird oder nicht. • Dieser Block wird verwendet, um Ressourcen wie Datenbankverbindung und E / A-Ressourcen zu schließen. • Schließlich ist ein Block.

3. Finalisieren • Finalisieren wird vom Garbage Collection-Thread unmittelbar vor dem Sammeln berechtigter Objekte aufgerufen, um die Bereinigungsverarbeitung durchzuführen. • Dies ist die letzte Möglichkeit für das Objekt, eine Bereinigung durchzuführen. Da jedoch nicht garantiert werden kann, ob finalize () aufgerufen wird, ist es eine schlechte Praxis, die Ressource bis zum Abschluss des Aufrufs zu behalten. • Finalisieren ist eine Methode.


0

Die Bedeutung von final in Java ist: - Auf eine Variable angewendet bedeutet, dass die jeweilige Variable nach der Initialisierung nicht mehr geändert werden kann

private final double numer = 12;

Wenn Sie versuchen, diesen Wert zu ändern, wird eine Fehlermeldung angezeigt.

-auf eine Methode angewendet bedeutet, dass die jeweilige Methode nicht überschrieben werden kann

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

Die endgültige Methode kann jedoch vererbt werden, da das Schlüsselwort final die Neudefinition der Methode einschränkt.

- Auf eine Klasse angewendet bedeutet, dass die jeweilige Klasse nicht erweitert werden kann.

class Base
{

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

Die Bedeutung von endlich ist:

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

Selbst wenn in diesem Beispiel der Try-Catch ausgeführt wird oder nicht, wird immer ausgeführt, was sich in finally befindet. Die Bedeutung von finalize:

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();  
}}  

bevor Sie den Garbage Collector anrufen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.