En Java, le mot-clé final est utilisé pour déclarer que l'objet a immuable. Les objets ici incluent des variables, des méthodes et des classes, qui sont similaires au mot clé const en C ++.
Immutable signifie qu'après la création de l'objet, l'état ne peut pas être modifié. Vous pouvez envisager d'utiliser le mot-clé final à partir de trois perspectives:
variable finale
Définissez l'objet final A, puis A ne peut être initialisé qu'une seule fois. Une fois initialisés, les données de A ne peuvent pas être modifiées. Si A est un type de référence, d'autres objets ne peuvent pas être référés.
La variable finale qui n'est pas initialisée est appelée blanc final. S'il s'agit d'une variable de membre, il doit être initialisé ou attribué dans le constructeur.
exemple:
classe Circle {Double Pi final statique = 3,1415926; rayon int final = 5; INT XPOS final; Int YPOS final; Circle public (int x, int y) {xpos = x; ypos = y; }} Méthode finale
Si vous définissez la méthode finale, la méthode ne peut pas être surchargée. Le concepteur de méthode ne veut pas que d'autres fonctions connexes se produisent en raison de la surcharge de la méthode.
exemple:
Class Baseclass {public final void méthode () {}} classe DeriveClass étend Baseclass {public final void method () {} // error de compilation}Il convient de noter que la définition de la méthode finale ne peut pas nécessairement produire l'effet de la ligne, car si la méthode est en ligne dépend de la stratégie de JVM, plutôt que du mot-clé final, il est inexact d'améliorer l'efficacité de la méthode par la conception finale.
classe finale
La classe X finale définie par la classe X finale ne peut pas être héritée.
En Java, la classe String est conçue comme finale, et sa définition est la suivante
La copie de code est la suivante:
La classe publique Final String étend l'objet implémente sérialisable, comparable <string>, charondence
Classe interne et final
Lors de la définition de la classe intérieure anonyme dans une méthode, la classe intérieure ne peut accéder aux variables de type final que dans la méthode, afin que le compilateur Java puisse capturer la valeur de la variable à l'avance et enregistrer une copie dans la classe intérieure. Lorsque la méthode est détruite, l'espace mémoire de la classe intérieure est toujours terminé.
exemple:
Classe publique Wrapper {public static void main (String [] args) {// objet obj = null; // compiler l'erreur final objet obj = null; nouveau thread (new Runnable () {public void run () {obj = "hello";}}). start (); }} PS: émettez cette classe anonyme interne ne peut pas accéder aux variables non finales externes
Cela semble un peu difficile à parler, mais en fait, je veux parler davantage de certaines fonctionnalités des classes internes Java.
La raison pour laquelle je pense à cette question est que lorsque je lisais le code sur HTTP Keepalive dans le code source JDK récemment, l'un des fichiers source, Sun.net.www.protocol.http.httpurlconnection.java, a accidentellement vu le code suivant.
Résultat final booléen [] = {false}; java.security.accessController.Doprivileged (new java.security.priviledAction () {public objet run () {try {inetaddress a1 = inetaddress.getbyname (h1); inetaddress a2 = inetaddress.getbyname (h2); 0] = = = = = inetaddress.get.getBame (h2); 0] = = = = = InetAddress.get.getBame (h2); 0] = = = = = = insetaddress.get a1.equals (a2);} catch (inconnuhostException e) {} catch (SecurityException e) {} return null;}}); return result [0];Les classes internes anonymes de Java ne peuvent pas accéder aux variables non finales de la fonction correspondante. Pour accéder à la variable locale externe, cette variable doit être définie comme Fianl en premier. Cependant, une fois qu'il est défini comme final, la valeur de cette variable ne peut pas être modifiée dans une classe interne anonyme, il n'est donc pas si facile de renvoyer certaines valeurs utiles dans une classe interne anonyme. Ce code utilise une méthode très intelligente, en utilisant ici des tableaux pour contourner cette limitation. Bien que nous ne puissions pas modifier la référence au résultat de la variable, nous pouvons modifier le contenu du tableau indiqué par résultat.
Je veux juste enregistrer une petite astuce pour modifier les variables externes par des classes anonymes internes. Mais depuis que vous êtes arrivé ici, vous pourriez aussi bien continuer à voir quelles fonctionnalités ou limites les classes internes ont.
Avant de poursuivre cet article, je pense qu'il est très nécessaire de clarifier certains des termes Java impliqués dans cet article. Ces termes ne sont pas faciles à traduire en chinois, nous les décrirons donc en anglais.
// Ceci est classpublic class javaterm {// champ ou variable membre private int champ; // Constructeur public javaterm () {} // méthode public void méthode () {// variable local int localVariable = 0; // classe locale classe localClass {public localclass () {}} // classe anonyme new Runnable () {public void run () {}}; }}Aujourd'hui, nous nous concentrerons davantage sur la classe locale et la classe anonyme, qui appartiendront toutes deux à une classe intérieure.
Java nous permet de définir une autre classe dans une classe, appelée classe imbriquée, et la classe imbriquée peut être divisée en deux catégories, l'une est une classe imbriquée statique, et l'autre est une classe imbriquée non statique, également connue sous le nom de classe interne. La classe intérieure peut également être divisée en classe locale et classe anonyme.
Quelques limites de la classe anonyme