Menu
CoddyTech

A Palavra-chave final

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 13 de 87.

A palavra-chave final em Java impede modificações. Ela pode ser aplicada a variáveis, métodos e classes, com um efeito diferente em cada caso.

Quando aplicado a uma variável, final a torna uma constante: depois de atribuída, seu valor não pode mudar:

public class Circle {
    private final double PI = 3.14159;
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;  // Pode atribuir uma vez no construtor
    }
    
    public void setRadius(double r) {
        // this.radius = r;  // Erro! Não é possível reatribuir uma variável final
    }
}

Uma variável final deve ser inicializada na declaração ou no construtor. Depois disso, qualquer tentativa de reatribuí-la causa um erro de compilação.

Para tipos de referência, final significa que a referência não pode apontar para um objeto diferente, mas o conteúdo do objeto ainda pode mudar:

private final StringBuilder name = new StringBuilder("John");

// name = new StringBuilder("Jane");  // Erro! Não é possível reatribuir
name.append(" Doe");  // OK! O conteúdo do objeto pode mudar

Usar final com campos comunica claramente a intenção — informa aos outros desenvolvedores que esse valor nunca deve mudar após a inicialização. Isso é especialmente útil para valores de configuração, IDs ou quaisquer dados que devam permanecer constantes durante toda a vida útil de um objeto.

Um método final não pode ser sobrescrito em uma subclasse:

class Base {
    public final void greet() {
        System.out.println("Hi");
    }
}
class Child extends Base {
    // public void greet() { }  // Erro! greet() é final em Base
}

Uma final classe não pode ser estendida de forma alguma. String é uma classe final, então nenhuma classe pode estendê-la:

final class Config { }
// class MyConfig extends Config { }  // Erro! Config é final
challenge icon

Desafio

Fácil

Vamos criar um sistema de cadastro de Student que usa a palavra-chave final para proteger dados que nunca devem mudar após o cadastro de um estudante.

Você criará dois arquivos para organizar seu código:

  • Student.java: Crie uma classe Student em que certas informações ficam permanentemente bloqueadas depois de definidas:
    • Um campo final studentId (String) - atribuído na criação e que nunca pode mudar
    • Um campo final enrollmentYear (int) - o ano em que o estudante se matriculou, também permanente
    • Um campo privado comum name (String) - pode ser atualizado se o estudante mudar de nome
    • Um construtor que recebe os três valores e inicializa os campos
    • Um getter getStudentId() para o ID do estudante
    • Um getter getEnrollmentYear() para o ano de matrícula
    • Um getter getName() e um setter setName() para o nome
    • Um método getInfo() que retorna: "ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
  • Main.java: Crie um objeto Student, depois atualize o nome e exiba as informações. Você receberá quatro entradas: o ID do estudante, o nome inicial, o ano de matrícula e um novo nome para atualizar. Imprima duas linhas:
    • As informações do estudante antes da mudança de nome
    • As informações do estudante depois da mudança de nome

Você receberá quatro entradas nesta ordem: studentId (String), name (String), enrollmentYear (int) e newName (String).

Observe como os campos final protegem o ID e o ano de matrícula do estudante — esses são registros permanentes que não devem mudar, enquanto o nome pode ser atualizado por meio do setter.

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leia as entradas
        String studentId = scanner.nextLine();
        String name = scanner.nextLine();
        int enrollmentYear = scanner.nextInt();
        scanner.nextLine(); // consuma a quebra de linha
        String newName = scanner.nextLine();
        
        // TODO: Crie um objeto Student com os valores iniciais
        
        // TODO: Imprima as informações do estudante antes da alteração do nome
        
        // TODO: Atualize o nome do estudante usando o setter
        
        // TODO: Imprima as informações do estudante após a alteração do nome
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online