1. Variable final
La variable final es una constante que no se puede cambiar una vez que se inicializa.
clase test1 {final doble pi = 3.14; // El nombre de la constante es mejor en capitalización de la prueba public1 () {pi = 3.14; } vacío test () {System.out.println ("Pi is:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Producción:
Pi es: 3.14
(1) Variable final en blanco
La variable final que no se inicializa en el momento de la declaración se llama variable final en blanco. La variable final en blanco debe inicializarse en el constructor, de lo contrario se lanzará un error de compilación.
clase Test1 {final Double Pi; Test1 () {pi = 3.14; // Inicializar en el constructor} void test () {System.out.println ("Pi Is:" + Pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Producción:
Pi es: 3.14
(2) Variable final estática no inicializada
La variable final estática que no se inicializa durante la fase de declaración solo se puede inicializar en bloques de código estático.
Test de clase1 {Doble final estático Pi; estática {pi = 3.14; } vacío test () {System.out.println ("Pi is:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Producción:
Pi es: 3.14
2. Método final
El método final no se puede sobrescribir. Es decir, una subclase puede llamar al método Fianl de la clase principal, pero no puede sobrescribirlo.
Prueba de clase {Doble final estático Pi = 3.14; Test Void final () {System.out.println ("Pi Is:" + Pi); }} La clase Test1 extiende la prueba {public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Producción:
Pi es: 3.14
3. Clase final
Las calas finales no se pueden heredar
Test de clase final1 {Doble final estático Pi = 3.14; Test Void final () {System.out.println ("Pi Is:" + Pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Producción:
Pi es: 3.14
PD: ¿Por qué la clase Java.lang.String está diseñada como final?
En primer lugar, debe tener claro la final de la palabra clave.
Final parece no querer cambiar, pero hay dos razones para no querer cambiar: diseño o eficiencia. La clase modificada por final no puede heredarse, por lo que la clase modificada por final no puede manipularse.
Después de entender esto, echemos un vistazo al problema:
(1) Desde una perspectiva de diseño,
R. Asegúrese de que no cambien la semántica en subclases. La clase de cadena es una clase final, lo que significa que a nadie puede definir una subclase de una cadena. En otras palabras, si hay una referencia de cadena, debe referirse a un objeto de cadena, pero no puede ser un objeto de otras clases.
B. La cadena no se puede modificar una vez que se crea, porque el diseñador de Java compartirá la cadena. El siguiente párrafo es un comentario en el código fuente:
(2) Desde la perspectiva de la eficiencia:
A. Diseñado como final, el JVM no necesita consultar métodos relacionados con la tabla de funciones virtuales, pero los localiza directamente en los métodos relacionados de la clase de cadena, mejorando la eficiencia de la ejecución.
B. Los diseñadores de Java creen que compartir trae más eficiencia.
En resumen, es necesario asegurarse de que el objeto hecho referenciado por java.lang.string debe ser un objeto de java.lang.string, no una clase que hace referencia a sus descendientes, para garantizar su eficiencia y seguridad.