Classe final
A classe final não pode ser herdada. Ao mesmo tempo, uma vez que a classe é modificada com o final, significa que todos os métodos na classe final são implicitamente especificados como métodos finais.
Método final
Durante o processo de herança de classe, a subclasse não pode ser modificada ou substituída pelo método final na classe pai.
Os métodos privados são todos implicitamente especificados como métodos finais.
Existem duas razões para usar o método final:
variável final
A palavra -chave final é o método mais usado para modificar variáveis. Se as variáveis do membro forem modificadas, elas deverão ser inicializadas no momento da definição ou no construtor e nenhuma atribuição poderá ser feita após a inicialização.
Existem diferentes significados para tipos básicos e objetos de classe:
O campo final estático é chamado de período de compilação constante e geralmente é capitalizado.
Exemplo
classe Glyph {void draw () {System.out.println ("Glyph.draw ()"); } GLYPH () {System.out.println ("Glyph () antes do draw ()"); empate(); System.out.println ("Glyph () após draw ()"); }} classe Roundglyph estende o glifo {private int Redius = 1; Redondglicho (int r) {raio = r; System.out.println ("Roundglyph.Roundglyph (), RADIUS =" + RADIUS); } void draw () {System.out.println ("Roundglyph.Draw (), RADIUS =" + RADIUS); }} classe pública rolyconstructors {public static void main (string [] args) {new Roundglyph (5); }} Resultado da saída:
Glyph () antes do draw () redondglyph.draw (), raio = 0Glyph () após draw () redondglyph.Roundglyph (), raio = 5
O código acima mostra o processo de inicialização da classe e problemas catastróficos ocultos.
A função principal chama o construtor Roundglyph com o parâmetro 5 para criar um objeto Roundglyph, e o construtor redondoso de sua classe pai é chamado antes que o construtor Roundglyph seja executado.
No entanto, o método de desenho é chamado no construtor do glifo da classe pai. Devido ao polimorfismo, o método de desenho da subclasse é realmente chamado. No entanto, o Redius da subclasse não foi inicializado através do construtor neste momento, então a saída é:
Roundglyph.Draw (), raio = 0
Obviamente, este não é o resultado que queremos, por isso é importante observar:
A segunda razão é que o final não aplica polimorfismo, portanto, pode -se garantir que o método correspondente do objeto atual seja chamado, em vez do método de substituição da subclasse que não foi realizado no trabalho de inicialização.
Resuma o método de alocação de memória de final:
1. Modificar variáveis:
De um modo geral, há três lugares onde as variáveis finais podem ser atribuídas: atribuição direta, no construtor ou no bloco de inicialização.
(1) Inicialização:
Como a declaração e a inicialização estão associadas à sintaxe java,
Ou seja: se você não exibir uma variável de inicialização, o sistema a inicializará automaticamente com um valor padrão. (Se int for 0)
Para variáveis finais, se você não atribuir valores quando declarado, o sistema padrão é um campo em branco, que é inicializado no construtor.
Se for estático, você pode inicializar o bloco.
(2) Memória:
Os métodos de processamento de constantes (variáveis finais) e variáveis não finais são diferentes.
Quando cada tipo usa uma constante, ele copiará uma cópia em seu próprio pool constante.
As constantes também são armazenadas na área do método, como variáveis de classe (estática), mas são armazenadas no pool constante.
(Provavelmente, as variáveis de classe são compartilhadas por todas as instâncias, enquanto os pools constantes são exclusivos de cada instância.)
2. Método de modificação:
Ele é salvo na área do método e pode ser substituído diretamente pelo código da função sem esperar até a execução para decidir qual função é específica.
3. Categoria de modificação:
Salvar na área do método.