Diferença entre estático e final?

174

Estou sempre confuso entre statice finalpalavras - chave em java .

Como eles são diferentes ?

TechnoCorner
fonte

Respostas:

238

A palavra-chave estática pode ser usada em 4 cenários

  • variáveis ​​estáticas
  • métodos estáticos
  • blocos estáticos de código
  • classe aninhada estática

Vamos examinar primeiro as variáveis ​​estáticas e os métodos estáticos.

Variável estática

  • É uma variável que pertence à classe e não ao objeto (instância).
  • Variáveis ​​estáticas são inicializadas apenas uma vez, no início da execução. Essas variáveis ​​serão inicializadas primeiro, antes da inicialização de qualquer variável de instância.
  • Uma única cópia a ser compartilhada por todas as instâncias da classe.
  • Uma variável estática pode ser acessada diretamente pelo nome da classe e não precisa de nenhum objeto.
  • Sintaxe: Class.variable

Método estático

  • É um método que pertence à classe e não ao objeto (instância).
  • Um método estático pode acessar apenas dados estáticos. Ele não pode acessar dados não estáticos (variáveis ​​de instância), a menos que tenha / crie uma instância da classe.
  • Um método estático pode chamar apenas outros métodos estáticos e não pode chamar um método não estático, a menos que tenha / crie uma instância da classe.
  • Um método estático pode ser acessado diretamente pelo nome da classe e não precisa de nenhum objeto.
  • Sintaxe: Class.methodName()
  • Um método estático não pode se referir a thisou superpalavras - chave de qualquer maneira.

Classe estática

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.

Nota:

O método principal é staticque 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 finalclasse 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.Systeme java.lang.String. Todos os métodos em uma finalclasse são implicitamente final.

  • Um finalmé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 finalvariá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 finalvariá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.

Nota: Se a variável for uma referência, isso significa que a variável não pode ser ligada novamente para fazer referência a outro objeto. Mas o objeto que ele faz referência ainda é mutável, se foi originalmente mutável.

Quando uma classe interna anônima é definida no corpo de um método, todas as variáveis ​​declaradas finalno 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.

Ashish
fonte
5
(Não diminuí a votação) Alguns esclarecimentos adicionais: "Um método estático pode acessar apenas dados estáticos. Ele não pode acessar dados não estáticos (variáveis ​​de instância)" - A menos que tenha / crie uma instância da classe. "Um método estático pode chamar apenas outros métodos estáticos e não pode chamar um método não estático." - A menos que tenha / crie uma instância da classe.
Xagyg 08/12/12
1
no método estático Sintaxe explicação que você mencionou errado eu acho. ele poderia serClass.methodName()
Mdhar9e
também podemos ter classe estática. Faça a correção na sua resposta. Obrigado :)
Madhusudan
No Java 8, uma classe anônima (e lambda) pode acessar efetivamente variáveis ​​finais e nenhuma restrição da palavra-chave final.
akhil_mittal
38

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 .

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

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.

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

Você não deve confundir isso com os blocos inicializadores de instância chamados antes do construtor por instância.

Jon Taylor
fonte
Após dados fornecidos por você é capaz de limpar tudo graças confusão ...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.
prashant Thakre
2
Simples e claro como as coisas devem ser. A resposta aceita é apenas ... detalhada.
22

Os dois realmente não são semelhantes. staticcampos são campos que não pertencem a nenhuma instância específica de uma classe .

class C {
    public static int n = 42;
}

Aqui, o staticcampo nnão está associado a nenhuma instância específica de, Cmas a toda a classe em geral (e é por isso que C.npode ser usado para acessá-lo). Você ainda pode usar uma instância de Cpara acessar n? 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.

class C {
    public final int n = 42;
}

Aqui, nnão pode ser reatribuído porque é final. Uma outra diferença é que qualquer variável pode ser declarada final, enquanto nem todas as variáveis ​​podem ser declaradas estáticas.

Além disso, as classes podem ser declaradas, o finalque indica que elas não podem ser estendidas:

final class C {}

class B extends C {}  // error!

Da mesma forma, os métodos podem ser declarados finais para indicar que eles não podem ser substituídos por uma classe estendida:

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}
arshajii
fonte
Obrigado pelas entradas. O código fornece erro: classe C {public static int n = 42; } diz que o campo não pode declarar estático no tipo não estático. Por que não posso declarar ou fazer Cn?
TechnoCorner
O @TechnoCorner apenas as classes de nível superior (a publicclasse potencialmente que define o arquivo) ou staticas classes internas podem definir staticvariáveis. Outras classes internas são instâncias da classe externa e não podem ter variáveis ​​estáticas.
zapl
17

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

Rohit
fonte
12

static significa que há apenas uma cópia da variável na memória compartilhada por todas as instâncias da classe.

A finalpalavra-chave significa apenas que o valor não pode ser alterado. Sem final, qualquer objeto pode alterar o valor da variável.

Emmanuel Osimosu
fonte
3

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:

public class Test{    
   public final int first = 10;
   public static int second = 20;

   public Test(){
     second = second + 1
     first = first + 1;
   }
}

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.

alistair
fonte
3

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

static final String color = "Black"; 

garantirá que sempre que essa classe for instanciada, o valor do campo de cor seja "Preto", a menos que não seja alterado.

public class Speaker {

static String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //will provide output as "Black"
            Speaker.color = "white";
    System.out.println(Speaker.color);  //will provide output as "White"
}}

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.

public class Speaker {

static final String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //should provide output as "Black"
            Speaker.color = "white"; //Error because the value of color is fixed.  
    System.out.println(Speaker.color); //Code won't execute.
}}

Você pode copiar / colar esse código diretamente no seu emulador e tentar.

vishnulphb
fonte
2

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; "

Malick Usman
fonte
1

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:

class someClass
{
   public static int count=0;
   public final String mName;

   someClass(String name)
   {
     mname=name;
     count=count+1;
   }

  public static void main(String args[])
  {
    someClass obj1=new someClass("obj1");
    System.out.println("count="+count+" name="+obj1.mName);
    someClass obj2=new someClass("obj2");
    System.out.println("count="+count+" name="+obj2.mName);
  }
}

A Wikipedia contém a lista completa de palavras-chave java .

PearsonArtPhoto
fonte
O que você quer dizer com um objeto em particular? Você pode ilustrar.
TechnoCorner
0

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 em staticblocos, mas não me preocuparia com isso para começar.

finaltem 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 .

madth3
fonte
-1

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.

Debasish Paul
fonte