Diferença entre estático e final?


174

Estou sempre confuso entre statice finalpalavras - chave em java .

Como eles são diferentes ?

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.


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.


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!
}

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


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.


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.


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.


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


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 .


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 .


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.