Nessa aula, trataremos de um modificador da linguagem Java que possui múltiplos significados: final.
Ao final da aula, entenderemos cada um dos contextos onde final é aplicado e o seu efeito.
A primeira utilidade de final é criar constantes.
Uma variável declarada como final não pode ter seu valor alterado após ter sido inicializada.
A inicialização não precisa ser feita na declaração, mas em qualquer momento antes do uso da variável.
O mesmo vale para campos static final, que devem ser inicializados na declaração ou em um método static antes de serem acessados.
No caso dos campos de instância final, são tipicamente inicializados no construtor, onde passam a ser constantes.
Antes de ser inicializada, essas variáveis são conhecidas como blank final.
Lembrando que o valor de um campo/variável final de um tipo complexo é uma referência. Logo, a referência é constante, mas o objeto apontado por ela não.
final float CONST_GRAVIDADE = 9.8; // Constante
final float CONST_GRAVIDADE;
...
CONST_GRAVIDADE = 9.8; // Constante a partir daqui.
public interface Movel {
public static final float CONST_MOVIMENTO = 0.5; // Constante
}
public class Livro {
private final String titulo;
...
public Livro(String titulo) {
this.titulo = titulo; // campo constante a partir deste ponto.
}
}
Um método declarado como final não pode ser sobrescrito em uma subclasse.
Usamos esse recurso quando queremos garantir que haja uma implementação consistente de um método em todas as classes descendentes de uma certa classe.
public abstract class Pessoa {
...
public final String getCpf() {
... // Método concreto que não queremos que ninguém sobrescreva nas subclasses.
}
}
public class Usuario {
...
@Override
public final String getCpf() {
... // Erro de compilação. Não queremos ninguém mexendo na forma de retornar o CPF.
}
}
Por fim, uma classe final não pode ser herdada por outras.
É uma forma de dizer que não queremos variantes de um determinado tipo.
public final class Usuario {
... // Não podem existir tipos diferentes de usuário.
}
public class UsuarioPremium extends Usuario {
... // Erro de compilação.
}
Agora sabemos como aplicar o modificador final em cada uma de suas atribuições.
Com isso podemos definir constantes e limitar a sobrescrita de métodos e herança de classes.
Perguntas:
Até a próxima aula!