1. Variable finale
La variable finale est une constante qui ne peut pas être modifiée une fois qu'elle est initialisée.
classe Test1 {final double pi = 3,14; // Le nom de la constante est mieux capitalisé Public Test1 () {pi = 3,14; } void test () {System.out.println ("pi est:" + pi); } public static void main (String [] args) {test1 t = new test1 (); t.test (); }} Sortir:
Pi est: 3.14
(1) variable finale vierge
La variable finale qui n'est pas initialisée au moment de la déclaration est appelée variable finale vierge. La variable finale vierge doit être initialisée dans le constructeur, sinon une erreur de compilation sera lancée.
classe Test1 {Double Pi final; Test1 () {pi = 3.14; // Initialize dans le constructeur} void test () {System.out.println ("pi est:" + pi); } public static void main (String [] args) {test1 t = new test1 (); t.test (); }} Sortir:
Pi est: 3.14
(2) variable finale statique non initialisée
La variable finale statique qui n'est pas initialisée pendant la phase de déclaration ne peut être initialisée que dans les blocs de code statique.
classe Test1 {Double Pi final statique; statique {pi = 3,14; } void test () {System.out.println ("pi est:" + pi); } public static void main (String [] args) {test1 t = new test1 (); t.test (); }} Sortir:
Pi est: 3.14
2. Méthode finale
La méthode finale ne peut pas être écrasée. C'est-à-dire qu'une sous-classe peut appeler la méthode fianl de la classe parent, mais ne peut pas l'écraser.
Classe Test {Double Pi final statique = 3,14; Final void test () {System.out.println ("pi est:" + pi); }} classe Test1 étend le test {public static void main (String [] args) {test1 t = new test1 (); t.test (); }} Sortir:
Pi est: 3.14
3. Classe finale
Les CAL finaux ne peuvent pas être hérités
Classe finale Test1 {Double Pi final statique = 3,14; Final void test () {System.out.println ("pi est:" + pi); } public static void main (String [] args) {test1 t = new test1 (); t.test (); }} Sortir:
Pi est: 3.14
PS: Pourquoi la classe java.lang.string est-elle conçue comme finale?
Tout d'abord, vous devez être clair sur le mot-clé final.
Final semble ne pas vouloir changer, mais il y a deux raisons de ne pas vouloir changer: la conception ou l'efficacité. La classe modifiée par final ne peut pas être héritée, donc la classe modifiée par final ne peut pas être falsifiée.
Après avoir compris cela, jetons un coup d'œil au problème:
(1) Du point de vue de la conception,
A. Assurez-vous qu'ils ne changent pas de sémantique dans les sous-classes. La classe String est une classe finale, ce qui signifie que personne n'est autorisé à définir une sous-classe d'une chaîne. En d'autres termes, s'il y a une référence de chaîne, il doit se référer à un objet String, mais il ne peut pas être un objet d'autres classes.
B. La chaîne ne peut pas être modifiée une fois qu'elle est créée, car le concepteur Java partagera la chaîne. Le paragraphe suivant est un commentaire dans le code source:
(2) Du point de vue de l'efficacité:
A. Conçu comme final, le JVM n'a pas besoin de demander des méthodes liées dans le tableau des fonctions virtuelles, mais les localise directement sur les méthodes connexes de la classe de chaîne, améliorant l'efficacité de l'exécution.
Les concepteurs de B. Java croient que le partage apporte plus d'efficacité.
En bref, il est nécessaire de s'assurer que l'objet référencé par java.lang.string doit être un objet de java.lang.string, pas une classe qui fait référence à ses descendants, afin d'assurer son efficacité et sa sécurité.