A palavra-chave final em Java é usada para criar elementos que não podem ser alterados pos­te­ri­or­mente. Esse mo­di­fi­ca­dor pode ser usado em classes, métodos e variáveis, prin­ci­pal­mente para evitar erros e uti­li­za­ções ina­de­qua­das de códigos.

O que é Java final?

A maioria das lin­gua­gens de pro­gra­ma­ção oferecem a pos­si­bi­li­dade de alterar e ampliar códigos que já existem. Isso também é possível em Java, mas, em alguns casos, pode ser im­por­tante que um elemento seja criado para ser inal­te­rá­vel. O mo­di­fi­ca­dor que permite criar esse tipo de elementos em Java é o final. Ele pode ser usado para res­trin­gir o acesso a uma classe, um método ou uma variável. Com ele, o valor de uma variável final não poderá mais ser alterado, não será possível ampliar uma classe final e um método final não poderá mais ser im­ple­men­tado. Isso ajuda a evitar que o código seja utilizado de formas in­de­se­ja­das.

Hos­pe­da­gem que se adapta às suas ambições
  • Fique online com 99,99% de tempo de atividade e segurança robusta
  • Aumente o de­sem­pe­nho com um clique à medida que o tráfego cresce
  • Inclui domínio gratuito, SSL, e-mail e suporte 24 horas por dia, 7 dias por semana

Classes finais

Use o Java final para uma classe sempre que você quiser impedir que a classe seja ampliada. Isso é feito com frequên­cia, pois, em muitos casos, pode ser im­por­tante evitar a derivação de uma subclasse. Isso é válido prin­ci­pal­mente para tipos de dados básicos, como java.lang.Math ou java.lang.String, que sempre são de­cla­ra­dos como final. Mesmo se você tiver outros motivos para evitar que sub­clas­ses sejam derivadas de uma classe, o Java final é a melhor forma de fazer isso. O exemplo abaixo esclarece como criar uma classe final e uma segunda classe que tenta ampliá-la. Em seguida, há uma classe main com o método main.

final class ClasseFinal {
	public void exemplodemetodo() {
		System.out.println("Este é um método dentro da classe final");
	}
}
class OutraClasse extends ClasseFinal {
	public void exemplodemetodo() {
		System.out.println("O método agora também está na outra classe.");
	}
}
public class Main {
	public static void main(String[] args) {
		OutraClasse nossaOutraClasse = new OutraClasse();
		nossaOutraClasse.exemplodemetodo();
	}
}
java

Ao tentar executar o código, re­ce­be­re­mos a seguinte mensagem:

Main.java:6: error: cannot inherit from final ClasseFinal
class OutraClasse extends ClasseFinal
       ^
1 error
java

Métodos finais

Se um método for iden­ti­fi­cado como final, ele não poderá ser subs­ti­tuído. Isso evita prin­ci­pal­mente que um método possa receber outro sig­ni­fi­cado em uma classe su­bor­di­nada. Para evitar isso, crie um método final com o mo­di­fi­ca­dor Java final. No exemplo abaixo, isso é feito ao criar uma classe chamada “Imperador” que contém um método chamado “meuTitulo”. A classe seguinte, chamada “Rei” amplia a classe “Imperador” e tenta subs­ti­tuir o método “meuTitulo”. Para o método main, vamos usar “Principe” como outra forma de tentar acessar o método. No código, o exemplo fica assim:

public class Imperador {
	public final void meuTitulo() {
		System.out.println("Eu sou o imperador.");
	}
}
public class Rei extends Imperador {
	public final void meuTitulo() {
		System.out.println("Eu sou o rei.");
	}
}
public class Principe {
	public static void main(String[] args) {
		Rei meuRei = new Rei();
		Rei.meuTitulo();
	}
}
java

Ao tentar usar o código, a seguinte mensagem de erro é emitida:

Main.java:9: error meuTitulo() in Rei cannot override meuTitulo() in Imperador public final void meuTitulo() {
		^
overriden method is final
java

Variáveis finais

O Java final também é usado para criar variáveis cujo valor não pode ser alterado pos­te­ri­or­mente. Isso é im­por­tante prin­ci­pal­mente quando de­ter­mi­na­das variáveis devem per­ma­ne­cer sempre cons­tan­tes em um código. No exemplo a seguir, é criada uma variável x que contém o valor 5. A seguir, tentamos chamar essa variável e atribuir um novo valor a ela. Veja abaixo como fica o código:

public class Main {
	final int x = 5;
public static void main(String[] args) {
	Main novoValor = new Main();
	novoValor.x = 10;
	System.out.println(novoValor.x);
	}
}
java

Se usarmos o comando Java System.out.println para ver o resultado, a seguinte mensagem de erro é emitida:

Main.java:6: error: cannot assign a value to final variable x
	novoValor.x = 10;
		     ^
1 error
java

Variáveis finais vazias

A princípio, todas as variáveis devem ser ini­ci­a­li­za­das em Java. Mas, se você declarar uma variável final vazia, poderá ini­ci­a­li­zar a variável com um cons­tru­tor de classe. No código, isso pode ser feito da seguinte forma:

public class Exemplo {
	final String exemplodetexto;
	Exemplo() {
		exemplodetexto = "Sua mensagem aqui.";
	}
	public static void main(String[] args) {
		Exemplo novoObjeto = new Exemplo();
		System.out.println(novoObjeto.exemplodetexto);
	}
}
java

Ao ser executado, esse código retorna a seguinte frase:

Sua mensagem aqui.
java
Ir para o menu principal