Estou sempre confuso entre static
e final
palavras - chave em java .
Como eles são diferentes ?
Vamos examinar primeiro as variáveis estáticas e os métodos estáticos.
Class.variable
Class.methodName()
this
ou super
palavras - chave de qualquer maneira.Java também possui "classes aninhadas estáticas". Uma classe aninhada estática é apenas aquela que não tem implicitamente uma referência a uma instância da classe externa.
Classes aninhadas estáticas podem ter métodos de instância e métodos estáticos.
Não existe classe estática de nível superior em Java.
O método principal é
static
que ele deve estar acessível para que um aplicativo seja executado antes de qualquer instanciação.
final
A palavra-chave é usada em vários contextos diferentes para definir uma entidade que não pode ser alterada posteriormente.Uma final
classe não pode ser subclassificada. Isso é feito por razões de segurança e eficiência. Consequentemente, muitas das classes da biblioteca padrão Java são final
, por exemplo, java.lang.System
e java.lang.String
. Todos os métodos em uma final
classe são implicitamente final
.
Um final
método não pode ser substituído por subclasses. Isso é usado para impedir o comportamento inesperado de uma subclasse que altera um método que pode ser crucial para a função ou consistência da classe.
Uma final
variável pode ser inicializada apenas uma vez, por meio de um inicializador ou uma declaração de atribuição. Não precisa ser inicializado no ponto da declaração: isso é chamado de blank final
variável. Uma variável de instância final em branco de uma classe deve ser definitivamente atribuída no final de cada construtor da classe em que é declarada; da mesma forma, uma variável estática final em branco deve ser definitivamente atribuída em um inicializador estático da classe na qual é declarada; caso contrário, ocorrerá um erro em tempo de compilação nos dois casos.
Quando uma classe interna anônima é definida no corpo de um método, todas as variáveis declaradas final
no escopo desse método são acessíveis de dentro da classe interna. Depois de atribuída, o valor da variável final não pode ser alterado.
Class.methodName()
estático significa que pertence à classe e não uma instância, isso significa que há apenas uma cópia dessa variável / método compartilhada entre todas as instâncias de uma determinada classe .
final é totalmente independente, é uma maneira de definir uma inicialização única. Você pode inicializar ao definir a variável ou dentro do construtor, em nenhum outro lugar.
note Observação: Os métodos finais e as classes finais são uma maneira de declarar explicitamente que o método ou a classe não pode ser substituída / estendida, respectivamente.
Leitura Extra Portanto, no tópico estático, estávamos falando sobre os outros usos que ele pode ter, às vezes é usado em blocos estáticos. Ao usar variáveis estáticas, às vezes é necessário configurá-las antes de usar a classe, mas infelizmente você não obtém um construtor. É aqui que a palavra-chave estática entra.
Você não deve confundir isso com os blocos inicializadores de instância chamados antes do construtor por instância.
fonte
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
Os dois realmente não são semelhantes.
static
campos são campos que não pertencem a nenhuma instância específica de uma classe .Aqui, o
static
campon
não está associado a nenhuma instância específica de,C
mas a toda a classe em geral (e é por isso queC.n
pode ser usado para acessá-lo). Você ainda pode usar uma instância deC
para acessarn
? Sim - mas não é considerado particularmente uma boa prática.final
por outro lado, indica que uma variável específica não pode ser alterada após ser inicializada.Aqui,
n
não pode ser reatribuído porque éfinal
. Uma outra diferença é que qualquer variável pode ser declaradafinal
, enquanto nem todas as variáveis podem ser declaradas estáticas.Além disso, as classes podem ser declaradas, o
final
que indica que elas não podem ser estendidas:Da mesma forma, os métodos podem ser declarados finais para indicar que eles não podem ser substituídos por uma classe estendida:
fonte
public
classe potencialmente que define o arquivo) oustatic
as classes internas podem definirstatic
variáveis. Outras classes internas são instâncias da classe externa e não podem ter variáveis estáticas.final -
1) Quando aplicamos a palavra-chave " final " a uma variável , o valor dessa variável permanece constante. (ou) Depois que declararmos uma variável como final, o valor dessa variável não poderá ser alterado.
2) É útil quando um valor variável não muda durante o tempo de vida de um programa
estático -
1) quando aplicamos a palavra-chave " estática " a uma variável , significa que ela pertence à classe.
2) Quando aplicamos a palavra-chave " estática " a um método , isso significa que o método pode ser acessado sem criar nenhuma instância da classe
fonte
static
significa que há apenas uma cópia da variável na memória compartilhada por todas as instâncias da classe.A
final
palavra-chave significa apenas que o valor não pode ser alterado. Semfinal
, qualquer objeto pode alterar o valor da variável.fonte
Estático e final têm grandes diferenças:
Variáveis ou classes estáticas estarão sempre disponíveis em (praticamente) em qualquer lugar. Final é apenas uma palavra-chave que significa que uma variável não pode ser alterada. Então, se tivesse:
O programa seria executado até tentar alterar o "primeiro" número inteiro, o que causaria um erro. Fora desta classe, você só teria acesso à variável "primeiro" se tivesse instanciado a classe. Isso contrasta com o "segundo", disponível o tempo todo.
fonte
Pense em um objeto como um alto-falante. Se o Speaker for uma classe, ele terá variáveis diferentes, como volume, agudo, baixo, cor etc. Você define todos esses campos enquanto define a classe do Speaker. Por exemplo, você declarou o campo de cores com um modificador estático, ou seja, está dizendo ao compilador que existe exatamente uma cópia dessa variável, independentemente de quantas vezes a classe foi instanciada.
Declarando
garantirá que sempre que essa classe for instanciada, o valor do campo de cor seja "Preto", a menos que não seja alterado.
Nota: Agora que você alterar a cor do alto-falante como final, esse código não será executado, porque a palavra-chave final garantirá que o valor do campo nunca seja alterado.
Você pode copiar / colar esse código diretamente no seu emulador e tentar.
fonte
Diferença fácil,
Final : significa que o valor da variável é Final e não será alterado em lugar nenhum. Se você disser que x = 5 final significa que x não pode ser alterado, seu valor é final para todos.
Estático: significa que ele possui apenas um objeto. vamos supor que você tenha x = 5, na memória há x = 5 e seu presente dentro de uma classe. se você criar um objeto ou instância da classe, o que significa que existe uma caixa específica que representa essa classe e suas variáveis e métodos. e se você criar um outro objeto ou instância dessa classe, significa que existem duas caixas dessa mesma classe que possuem x diferentes na memória. e se você chamar x em posições diferentes e alterar o valor, o valor será diferente. a caixa 1 tem x que tem x = 5 e a caixa 2 tem x = 6. mas se você tornar o x estático, significa que não poderá ser criado novamente. você pode criar um objeto de classe, mas esse objeto não terá x diferente. se x é estático, as caixas 1 e 2 terão o mesmo x, que tem o valor 5. Sim, eu posso alterar o valor de static em qualquer lugar, pois não é final. Portanto, se eu disser que a caixa 1 tem xe altero seu valor para x = 5, e depois faço outra caixa que é a caixa2 e altero o valor da caixa2 x para x = 6. então, como X é estático, ambas as caixas têm o mesmo x. e as duas caixas fornecerão o valor da caixa como 6, porque a caixa2 substitui o valor de 5 a 6.
Final e estático são totalmente diferentes. Final que é final não pode ser alterado. estático que permanecerá como um, mas pode ser alterado.
"Este é um exemplo. Lembre-se de que a variável estática é sempre chamada pelo nome da classe. Porque é apenas um para todos os objetos dessa classe. Então a classe A tem x = 5, posso chamá-la e alterá-la por Ax = 6; "
fonte
Estático é algo que qualquer objeto de uma classe pode chamar, que inerentemente pertence a um tipo de objeto.
Uma variável pode ser final para toda uma turma, e isso significa simplesmente que não pode mais ser alterada. Ele pode ser definido apenas uma vez e tentar defini-lo novamente resultará em um erro. É útil por várias razões, talvez você queira declarar uma constante que não pode ser alterada.
Algum código de exemplo:
A Wikipedia contém a lista completa de palavras-chave java .
fonte
Não tentarei dar uma resposta completa aqui. Minha recomendação seria concentrar-se em entender o que cada um deles faz e, em seguida, deve ser claro que seus efeitos são completamente diferentes e por que às vezes são usados juntos.
static
é para membros de uma classe (atributos e métodos) e deve ser entendida em contraste com os membros da instância (não estáticos). Eu recomendo a leitura "Noções básicas sobre membros de instância e classe" nos Tutoriais Java. Também posso ser usado emstatic
blocos, mas não me preocuparia com isso para começar.final
tem significados diferentes, de acordo com o que é aplicado a variáveis, métodos, classes ou alguns outros casos. Aqui eu gosto mais das explicações da Wikipedia .fonte
Os valores das variáveis estáticas podem ser alterados, embora uma cópia da variável passe pelo aplicativo, enquanto os valores da variável final podem ser inicializados uma vez e não podem ser alterados em todo o aplicativo.
fonte