Variável final: após inicializada, não pode ter seu valor alterado. Exemplo:
private final int a = 10;
Ou:
public class Teste {
private final int a;
public Teste() {
a = new Random().nextInt(); // após essa atribuição não é mais
// possível alterar o valor da variável
}
}
Método final: não pode ser sobrescrito por subclasses. Exemplo:
public class Teste {
public final void imprimeFrase() {
System.out.println("Olá mundo!");
}
}
O método imprimeFrase não pode ser sobrescrito. Uma tentativa de fazer isso resultaria em um erro de compilação:
Cannot override the final method from Teste
Variável estática: variável que tem o mesmo valor para todas as INSTÂNCIAS daquela classe. Por exemplo:
public class Teste {
private static int id = 0;
public static int getId() {
return id;
}
public void aumentaID() {
id++;
}
}
Uma vez alterado o valor de ID em uma das instâncias, o valor da variável da classe é alterado (essa é uma variável de classe e não de instância).
Método estático: similar as variáveis estáticas. Exemplo:
package java.lang;
public final class Integer extends Number {
private int i;
public Integer(int i) {
this.i = i;
}
public static Integer valueOf(int i) {
return new Integer(i);
}
......
}
Por fim, variáveis estáticas e finais: são aquelas variáveis de classes que não podem ter seus valores alterados, ou seja, são um espécie de constates globais. Em geral (nem sempre), são públicas e a convenção é que as nomeie apenas com letras maiúsculas e sublinhados(_). Exemplo:
package java.lang;
public final class Integer extends Number {
public static final int MIN_VALUE = -[telefone removido];
public static final int MAX_VALUE = [telefone removido];
.......
}