En Java, ¿qué propósito cumplen las palabras clave `final`,` finalmente` y `finalize`? [cerrado]

82

En Java, qué propósito las palabras clave final, finallyy finalizecumplen?

Pat R Ellery
fuente
4
Pregunta de tarea? allu.wordpress.com/2006/11/08/…
Gray
12
Ni siquiera son conceptos comparables. Simplemente se escriben de manera similar. Lee un poco.
Marcelo Cantos
3
No tienen nada que ver el uno con el otro, totalmente ajenos, conceptualmente. Estudie cada uno por separado.
Ed Staub
7
Esto no debe cerrarse, ya que parece ser una pregunta relativamente común.
David Titarenco
1
votó para reabrir debido a una buena respuesta, que puede ser útil para los usuarios que aterrizan aquí.
Akappa

Respuestas:

272

final

final se puede utilizar para marcar una variable como "inmutable"

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

final también puede hacer que un método no sea "anulable"

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

finaltambién puede hacer que una clase no sea "heredable". es decir, la clase no puede ser subclasificada.

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

finalmente

finallyse usa en una declaración try / catch para ejecutar código "siempre"

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

Java 7 tiene una nueva declaración de prueba con recursos que puede usar para cerrar automáticamente los recursos que implementan explícita o implícitamente java.io.Closeable o java.lang.AutoCloseable

finalizar

finalizese llama cuando un objeto se recolecta como basura. Rara vez es necesario anularlo. Un ejemplo:

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}
krico
fuente
18
mejor respuesta que la mayoría de los libros de Java !!
diaryfolio
3
Gracias. Esta respuesta está bien explicada en comparación con otros que se llaman a sí mismos "expertos".
2014
2
Buena respuesta, pero la firma del método de finalización es incorrecta.
Samarth Shah
Nota: El Object#finalize()método quedó obsoleto en Java 9 ( JDK-8165641 ).
Slaw
19
  • "Final" denota que algo no se puede cambiar. Por lo general, desea usar esto en variables estáticas que tendrán el mismo valor durante la vida útil de su programa.
  • "Finalmente" se usa junto con un bloque try / catch. Todo lo que esté dentro de la cláusula "finalmente" se ejecutará independientemente de si el código del bloque 'try' arroja una excepción o no.
  • La JVM llama a "Finalizar" antes de que un objeto esté a punto de ser recolectado como basura.
Kevin R.
fuente
6

La palabra clave final se usa para declarar constantes.

final int FILE_TYPE = 3;

La palabra clave finalmente se usa en una declaración try catch para especificar un bloque de código a ejecutar independientemente de las excepciones lanzadas.

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

Y finalmente (jaja), finalize, no estoy del todo seguro de que sea una palabra clave, pero hay una función finalize () en la clase Object.

ctrlc-root
fuente
6

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

final - declaración constante.

finalmente: el bloque finalmente siempre se ejecuta cuando el bloque try sale, excepto la llamada System.exit (0). Esto asegura que el bloque finalmente se ejecute incluso si ocurre una excepción inesperada. Pero finalmente es útil para algo más que el manejo de excepciones: permite al programador evitar que el código de limpieza se omita accidentalmente por un retorno, continuación o interrupción. Poner el código de limpieza en un bloque final siempre es una buena práctica, incluso cuando no se anticipan excepciones.

finalize (): el método ayuda en la recolección de basura. Un método que se invoca antes de que el recolector de basura descarte un objeto, lo que le permite limpiar su estado. No se debe usar para liberar recursos que no son de memoria como identificadores de archivos, sockets, conexiones de bases de datos, etc. porque Java solo tiene un número finito de estos recursos y no sabe cuándo se activará la recolección de basura para liberar estos recursos que no son de memoria. mediante el método finalize ().

¿Intentaste buscar en Google y necesitas una aclaración para obtener una explicación?

Vorapsak
fuente
4
¡Bienvenido a Stack Overflow! Si bien este artículo puede responder a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Stack Overflow solo es tan útil como sus preguntas y respuestas, y si el host de este blog se cae o las URL se mueven, esta respuesta se vuelve inútil. ¡Gracias!
sarnold
6

final: final es una palabra clave. La variable declinada como final debe inicializarse solo una vez y no se puede cambiar. Las clases de Java declaradas como finales no se pueden extender. Los métodos declarados como finales no se pueden anular.

finalmente: finalmente es un bloque. El bloque finalmente siempre se ejecuta cuando sale el bloque try. Esto asegura que el bloque finalmente se ejecute incluso si ocurre una excepción inesperada. Pero finalmente es útil para algo más que el manejo de excepciones: permite al programador evitar que el código de limpieza se omita accidentalmente por un retorno, continuación o interrupción. Poner el código de limpieza en un bloque final siempre es una buena práctica, incluso cuando no se anticipan excepciones.

finalizar: finalizar es un método. Antes de que un objeto sea recolectado como basura, el sistema en tiempo de ejecución llama a su método finalize (). Puede escribir el código de liberación de recursos del sistema en el método finalize () antes de recolectar la basura.

veneno
fuente
2

1. Final • Final se utiliza para aplicar restricciones de clase, método y variable. • La clase final no se puede heredar, el método final no se puede anular y el valor de la variable final no se puede cambiar. • Las variables finales se inicializan en el momento de la creación, excepto en el caso de una variable final en blanco que se inicializa en Constructor. • Final es una palabra clave.

2. Finalmente • Finalmente se usa para el manejo de excepciones junto con try and catch. • Se ejecutará tanto si se maneja la excepción como si no. • Este bloque se utiliza para cerrar los recursos como la conexión de la base de datos, los recursos de E / S. • Finalmente es un bloque.

3. Finalizar • Finalizar es llamado por el subproceso de recolección de basura justo antes de recolectar los objetos elegibles para realizar el proceso de limpieza. • Esta es la última oportunidad para que el objeto realice una limpieza, pero dado que no está garantizado si se llamará a finalize (), es una mala práctica mantener el recurso hasta finalizar la llamada. • Finalizar es un método.

Mulalo Madida
fuente
0

El significado de final en java es: -aplicado a una variable significa que la variable respectiva una vez inicializada ya no se puede modificar

private final double numer = 12;

Si intenta modificar este valor, obtendrá un error.

-aplicado a un método significa que el método respectivo no se puede anular

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

Pero el método final se puede heredar porque la palabra clave final restringe la redefinición del método.

-aplicado a una clase significa que la clase respectiva no se puede extender.

class Base
{

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

El significado de finalmente es:

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

en este ejemplo, incluso si se ejecuta try-catch o no, lo que está dentro de finalmente siempre se ejecutará. El significado de finalizar:

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

antes de llamar al recolector de basura.

Gianina Gaita
fuente