1. Variável final
A variável final é uma constante que não pode ser alterada depois de ser inicializada.
classe Test1 {final duplo Pi = 3.14; // O nome da constante é melhor Public Test1 () {Pi = 3.14; } void test () {System.out.println ("pi é:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Saída:
PI é: 3.14
(1) variável final em branco
A variável final que não é inicializada no momento da declaração é chamada de variável final em branco. A variável final em branco deve ser inicializada no construtor; caso contrário, um erro de compilação será lançado.
classe Test1 {final duplo Pi; Test1 () {pi = 3.14; // inicialize no construtor} void test () {System.out.println ("pi é:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Saída:
PI é: 3.14
(2) variável final estática não inicializada
A variável final estática que não é inicializada durante a fase de declaração só pode ser inicializada em blocos de código estático.
classe Test1 {Pi duplo final estático; estático {pi = 3,14; } void test () {System.out.println ("pi é:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Saída:
PI é: 3.14
2. Método final
O método final não pode ser substituído. Ou seja, uma subclasse pode chamar o método Fianl da classe pai, mas não pode substituí -lo.
classe teste {final estático duplo Pi = 3,14; Final void test () {System.out.println ("Pi é:" + pi); }} classe Test1 estende o teste {public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Saída:
PI é: 3.14
3. Classe final
Cals finais não podem ser herdados
Classe final Test1 {estático final duplo PI = 3,14; Final void test () {System.out.println ("Pi é:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Saída:
PI é: 3.14
PS: Por que a classe Java.lang.string foi projetada como final?
Primeiro de tudo, você deve ser claro sobre a palavra -chave final.
Final parece não querer mudar, mas há duas razões para não querer mudar: design ou eficiência. A classe modificada pelo final não pode ser herdada; portanto, a classe modificada pelo final não pode ser adulterada.
Depois de entender isso, vamos dar uma olhada no problema:
(1) de uma perspectiva de design,
A. Verifique se eles não alteram a semântica em subclasses. A classe String é uma classe final, o que significa que ninguém pode definir uma subclasse de uma string. Em outras palavras, se houver uma referência de string, ele deve se referir a um objeto String, mas não pode ser um objeto de outras classes.
B. String não pode ser modificada depois de criada, porque o designer Java compartilhará a string. O parágrafo a seguir é um comentário no código -fonte:
(2) da perspectiva da eficiência:
A. Projetado como final, a JVM não precisa consultar métodos relacionados na tabela de funções virtuais, mas as localiza diretamente nos métodos relacionados da classe String, melhorando a eficiência da execução.
B. Designers Java acreditam que o compartilhamento traz mais eficiência.
Em resumo, é necessário garantir que o objeto referenciado por java.lang.string deve ser um objeto de java.lang.string, não uma classe que referencia seus descendentes, para garantir sua eficiência e segurança.