La palabra clave JAVA final se utiliza para modificar datos, métodos o clases, lo que generalmente significa "inmutable", es decir, los datos no se pueden cambiar, los métodos no se pueden anular y las clases no se pueden heredar. Generalmente hay dos razones para utilizar final: diseño y eficiencia. A medida que se actualiza la versión JAVA, el compilador y la JVM pueden solucionar algunos problemas de eficiencia. Por tanto, utilizar final para resolver problemas de eficiencia no es tan importante.
El modificador Final se usa principalmente en los campos de tipos de datos primitivos o clases inmutables (si todos los métodos de la clase no cambian su objeto, esta clase es una clase inmutable. String es una clase inmutable).
【datos finales】
Hay dos situaciones principales en las que se utiliza la palabra clave Final para modificar datos:
1. Constantes en tiempo de compilación
2. Valores inicializados en tiempo de ejecución.
Para las constantes en tiempo de compilación, se refiere a un campo que es final y estático (según la convención, las constantes en tiempo de compilación se nombran con letras mayúsculas y cada palabra está separada por un guión bajo. Solo ocupa un espacio de almacenamiento). no se puede cambiar. El compilador puede sustituir constantes en tiempo de compilación en cualquier fórmula de cálculo que pueda usarla. Es decir, la fórmula de cálculo se puede ejecutar en tiempo de compilación, lo que reduce relativamente la carga del tiempo de ejecución. Una constante en tiempo de compilación debe tener un valor asignado cuando se define (no necesariamente un tipo básico).
Para los valores inicializados en tiempo de ejecución, para los tipos básicos, final hace que el valor no se pueda cambiar; para las referencias a objetos, final hace que la referencia no se pueda cambiar, es decir, no se puede cambiar para que apunte a otro objeto. Sin embargo, el objeto en sí se puede modificar (. aplicable a matrices, las matrices también son objetos).
Cadena final estática privada TESTD = "prueba";
cadena final estática pública TESTE = "prueba";
public static final String[] TESTF = {"1","2"} //Tipo no básico
cadena final estática privada [] TESTG = nueva cadena [2];
principal vacío estático público (String args []) {
prueba int finalA = 1;
prueba de cadena finalB = "prueba";
final int[] pruebaC = {1,1,2,};
System.out.println(pruebaC[1]);
pruebaC[1] = 123;
System.out.println(pruebaC[1]);
}
}
JAVA permite generar campos finales no asignados, pero el campo final debe asignarse en la definición del campo o en cada constructor (tantos constructores como haya) para garantizar que se inicialice antes de su uso. De esta manera, final se puede usar de manera más flexible. En la misma clase, se pueden asignar diferentes valores a diferentes objetos manteniendo características inmutables.
público javaBlankFinal(){
en blanco = 2011;
}
público javaBlankFinal(int temporal){
en blanco = 2012;
}
javaBlankFinal público (temperatura de cadena) {
en blanco = 2014;
}
principal vacío estático público (String args []) {
nuevo javaBlankFinal();
}
}
Hay dos razones para usar el método final: una es bloquear el método para evitar que se sobrescriba y garantizar que el comportamiento del método permanezca sin cambios durante la herencia; la otra es convertir llamadas a métodos en llamadas integradas para reducir el costo del método; llamadas. Sin embargo, en versiones recientes, la JVM puede optimizarse a sí misma, por lo que no es necesario utilizar métodos finales para solucionar problemas de eficiencia.
Con respecto al método final, hay otra cosa a tener en cuenta: todos los métodos privados de la clase se designan implícitamente como métodos finales (también puede agregarles modificaciones finales, pero no tiene sentido). Cuando intentas anular un método privado, el compilador no informa un error, pero en realidad no sobrescribes el método, simplemente generas un nuevo método. Debido a que las clases externas no pueden acceder al método privado, por supuesto, no se puede anular.
El uso de la anotación @Override puede evitar los problemas anteriores. Como se muestra en el programa:
final privado vacío finalFunctionB(){
System.out.println("finalFunctionB");
}
final vacío finalFunctionC(){
System.out.println("finalFunctionC");
}
función nulaD(){}
}
anulación de claseFinalFunction extiende finalFunction{
//@Override Agrega la anotación @Override para identificar si se trata de una anulación
función final pública vacíaA(){
System.out.println("anular función finalA");
}
público final vacío finalFunctionB(){
System.out.println("anular función finalB");
}
//final void finalFunctionC(){} //No se puede anular el método final de finalFunction
@Anular
función vacíaD(){} //Método de anulación real
}
la clase pública javaFinalFunction extiende la función final{
principal vacío estático público (String args []) {
función final ff = nueva función final();
//ff.finalFunctionA(); //No se puede llamar al método privado
//ff.finalFunctionB();
overrideFinalFunction desactivado = nueva overrideFinalFunction();
off.finalFunctionA(); //método público
apagado.finalFunctionB();
}
}
El uso de clases finales generalmente se debe a razones de diseño, que no permiten heredar la clase. Esto garantiza que el comportamiento de la clase no cambiará y también puede evitar algunos riesgos de seguridad. Todos los métodos de la clase Final están implícitamente designados como métodos finales y, por lo tanto, no se pueden anular (debido a que la clase final prohíbe la herencia, los métodos de su clase no se pueden anular). En la API principal de Java, hay muchos ejemplos de aplicación de final, como java.lang.String. Especifique final para la clase String para evitar que se sobrescriban métodos como length().
Para los campos finales, incluso si una clase se declara final, los campos de la clase no se convertirán automáticamente en campos finales.
clase pública javaFinalClass{
principal vacío estático público (String args []) {
finalClass fc = nueva clase final();
System.out.println(fc.testA);
fc.pruebaA = 2012;
System.out.println(fc.testA);
}
}