Em Java, a palavra -chave final é usada para declarar que o objeto tem imutável. Os objetos aqui incluem variáveis, métodos e classes, que são semelhantes à palavra -chave const em C ++.
imutável significa que, após a criação do objeto, o estado não pode ser alterado. Você pode considerar o uso da palavra -chave final de três perspectivas:
variável final
Defina o objeto final A, então a pode ser inicializado apenas uma vez. Uma vez inicializado, os dados de A não podem ser modificados. Se A é um tipo de referência, outros objetos não poderão ser rebocados.
A variável final que não é inicializada é chamada de Blank Final. Se for uma variável de membro, ele deve ser inicializado ou atribuído no construtor.
exemplo:
classe Circle {estático final duplo PI = 3.1415926; Final Int Radius = 5; Final Int Xpos; final Int ypos; public círculo (int x, int y) {xpos = x; ypos = y; }} Método final
Se você definir o método final, o método não poderá ser sobrecarregado. O Designer de Método não deseja que outras funções relacionadas ocorram devido à sobrecarga do método.
exemplo:
classe Baseclass {public final void method () {}} classe DerivedClass estende Baseclass {public final void method () {} // Erro de compilação}Deve -se notar que a definição de método final pode não produzir necessariamente o efeito da inline, porque se o método está embutido depende da estratégia da JVM, e não da palavra -chave final, é impreciso melhorar a eficiência do método através do projeto final.
Classe final
A classe X final definida pela classe final X não pode ser herdada.
Em Java, a classe String é projetada como final, e sua definição é a seguinte
A cópia do código é a seguinte:
A string final da classe pública estende o objeto implementa
Classe interna e final
Ao definir a classe interna anônima em um método, a classe interna pode acessar apenas variáveis de tipo final no método, para que o compilador Java possa capturar o valor da variável com antecedência e salvar uma cópia na classe interna. Quando o método é destruído, o espaço de memória da classe interna ainda está completo.
exemplo:
public class Wrapper {public static void main (string [] args) {// objeto obj = null; // compilar erro de objeto final obj = null; novo thread (novo runnable () {public void run () {obj = "hello";}}). start (); }} PS: Problema de que a classe anônima interna não pode acessar variáveis não finais externas
Isso parece um pouco difícil de falar, mas, na verdade, quero falar mais sobre alguns recursos das classes internas do Java.
A razão pela qual penso nessa pergunta é que, quando estava lendo o código sobre o HTTP Keepalive no código -fonte do JDK recentemente, um dos arquivos de origem, Sun.net.www.protocol.http.httpurlconnection.java, viu acidentalmente o código a seguir.
resultado booleano final [] = {false}; java.security.accessController.Doprivileged (novo java.Security.privilegedaction () {public object run () {try {inetaddress a1 = inTadddress.getbyname (h1); inTadDress a2 A1.Equals (A2);As classes internas anônimas de Java não podem acessar variáveis não finais da função correspondente. Para acessar a variável local externa, essa variável deve ser definida como fianl primeiro. No entanto, uma vez definido como final, o valor dessa variável não pode ser modificado em uma classe interna anônima, portanto, não é tão fácil retornar alguns valores úteis em uma classe interna anônima. Este código usa um método muito inteligente, usando matrizes aqui para ignorar essa limitação. Embora não possamos modificar a referência ao resultado da variável, podemos modificar o conteúdo da matriz apontado pelo resultado.
Eu só quero gravar um pequeno truque para modificar variáveis externas por classes anônimas internas. Mas desde que você chegou aqui, você também pode continuar a ver quais recursos ou limitações as classes internas têm.
Antes de continuar este artigo, sinto que é muito necessário esclarecer alguns dos termos Java envolvidos neste artigo. Esses termos não são fáceis de se traduzir em chinês, então ainda os descreveremos em inglês.
// Esta é a classe Classpublic Javaterm {// Campo ou Variável de membro Private Int Field; // construtor public javaterm () {} // método public void method () {// variável local int localVariable = 0; // Classe local Classe LocalClass {public localClass () {}} // classe Anonymous new Runnable () {public void run () {}}; }}Hoje vamos nos concentrar mais na classe local e na classe anônima, os quais pertencem à classe interna.
Java nos permite definir outra classe em uma classe, chamada classe aninhada, e a classe aninhada pode ser dividida em duas categorias, uma é a classe estática aninhada e a outra é classe aninhada não estática, também conhecida como classe interna. A classe interna também pode ser dividida em classe local e classe anônima.
Algumas limitações da aula anônima