En Java, la palabra clave final se usa para declarar que el objeto tiene inmutable. Los objetos aquí incluyen variables, métodos y clases, que son similares a la palabra clave const en C ++.
Inmutable significa que después de que se crea el objeto, el estado no se puede cambiar. Puede considerar usar la palabra clave final desde tres perspectivas:
variable final
Defina el objeto A final A, entonces A solo se puede inicializar una vez. Una vez inicializado, los datos de A no se pueden modificar. Si A es un tipo de referencia, otros objetos no pueden ser rebajados.
La variable final que no se inicializa se llama en blanco final. Si se trata de una variable miembro, debe inicializarse o asignarse en el constructor.
ejemplo:
Círculo de clase {Doble final estático PI = 3.1415926; Final int radio = 5; final int XPOS; final int ypos; Círculo público (int x, int y) {xpos = x; YPOS = Y; }} Método final
Si define el método final, el método no se puede sobrecargar. El diseñador del método no quiere que ocurran otras funciones relacionadas debido a la sobrecarga del método.
ejemplo:
class BasecLass {public final void método () {}} La clase DerivedClass extiende Baseclass {public Final Void Method () {} // Error de compilación}Cabe señalar que la definición de método final puede no producir necesariamente el efecto de línea, porque si el método está en línea depende de la estrategia de JVM, en lugar de la palabra clave final, es inexacto mejorar la eficiencia del método a través del diseño final.
clase final
La clase X final definida por la clase final X no se puede heredar.
En Java, la clase de cadena está diseñada como final, y su definición es la siguiente
La copia del código es la siguiente:
La cadena final de clase pública extiende el objeto Implementa serializable, comparable <String>, CharSequence
Clase interna y final
Al definir la clase interna anónima en un método, la clase interna solo puede acceder a las variables de tipo final en el método, de modo que el compilador Java puede capturar el valor de la variable con anticipación y guardar una copia en la clase interna. Cuando el método se destruye, el espacio de memoria de la clase interna aún está completo.
ejemplo:
Public Class Wrapper {public static void main (string [] args) {// object obj = null; // compilar error objeto final obj = null; new Thread (new Runnable () {public void run () {obj = "hello";}}). start (); }} PD: Problema que la clase anónima interna no puede acceder a variables no final externas
Esto suena un poco difícil de hablar, pero de hecho, quiero hablar más sobre algunas características de las clases internas de Java.
La razón por la que pienso en esta pregunta es que cuando estaba leyendo el código sobre http keepalive en el código fuente JDK recientemente, uno de los archivos de origen, Sun.net.www.protocol.http.httpurlconnection.java, vio accidentalmente el siguiente código.
Resultado final booleano [] = {false}; java.security.accesscontroller.doPrivileged (new java.security.privilegedAction () {public object run () {try {inetAddress a1 = inetDress.getByName (h1); inetaddress a2 = inetDress.getByname (h2); a1.equals (a2);Las clases internas anónimas de Java no pueden acceder a las variables no final de la función correspondiente. Para acceder a una variable local externa, esta variable debe definirse como Fianl primero. Sin embargo, una vez que se define como final, el valor de esta variable no puede modificarse en una clase interna anónima, por lo que no es tan fácil devolver algunos valores útiles en una clase interna anónima. Este código utiliza un método muy inteligente, utilizando matrices aquí para evitar esta limitación. Aunque no podemos modificar la referencia al resultado variable, podemos modificar el contenido de la matriz apuntada por resultado.
Solo quiero registrar un pequeño truco para modificar variables externas mediante clases anónimas internas. Pero desde que llegó aquí, también podría continuar viendo qué características o limitaciones tienen las clases internas.
Antes de continuar este artículo, creo que es muy necesario aclarar algunos de los términos de Java involucrados en este artículo. Estos términos no son fáciles de traducir al chino, por lo que aún los describiremos en inglés.
// Esta es la clase ClassPublic Javaterm {// campo o el campo Variable private int; // constructor public javaterm () {} // método público void método () {// local variable int localVariable = 0; // clase local clase localClass {public localClass () {}} // class anónimo new runnable () {public void run () {}}; }}Hoy nos centraremos más en la clase local y la clase anónima, los cuales pertenecen a la clase Inner.
Java nos permite definir otra clase en una clase, llamada clase anidada, y la clase anidada se puede dividir en dos categorías, una es una clase anidada estática y la otra es una clase anidada no estatada, también conocida como clase interna. La clase interior también se puede dividir en clase local y clase anónima.
Algunas limitaciones de la clase anónima