W celu zablokowania możliwości dziedziczenia można ustawić modyfikator klasy. Spowoduje to, że nie da się użyć jej jako klasy nadrzędnej, czyli nie da się utworzyć klasy dziedziczącej na podstawie tej klasy. Przykładem jest poniższy kod, gdzie interfejs został zaimplementowany w klasie abstrakcyjnej AA, która natomiast została odziedziczona i rozwinięta w klasie AAA, a ta oznaczona dodatkowo modyfikatorem final. Próba stworzenia klasy AAAA dziedziczącej z AAA napotka opór i zostanie wygenerowany błąd uniemożliwiający skompilowanie tak napisanego programu.

public class FinalClass {

    public static void main(String[] args) {

    }
    
}

interface A {
    void pokaz();
    void pokaz2();
}

abstract class AA implements A {
    @Override
    public final void pokaz() {
        System.out.println("Metoda zdefiniowana w klasie abstrakcyjnej...");
    }
}

final class AAA extends AA {

    @Override
    public void pokaz2() {
       System.out.println("Metoda zdefiniowana w klasie finalnej...");
    }  
}

//  Poniższy kod jest obarczony błędem "cannot inherit from final AAA"
class AAAA extends AAA {
    
}

Jak widać powyżej, możemy oznaczyć klasę jako finalną, z takiej klasy nie można już dziedziczyć. Należy przy tym zauważyć, że wszystkie metody w takiej klasie są też finalne. Można także oznaczyć metody w dowolnej klasie jako finalne – wtedy nie będzie możliwe ich przesłanianie (@Overriding)1Tak została oznaczona metoda pokaz() zdefiniowana w klasie AA. Nie da się jej przesłonić, możesz spróbować w klasie AAA dopisać przesłaniającą metodę pokaz() i zobaczyć komunikat błędu.. Do tej pory znaliśmy formę final tylko do tworzenia stałych, teraz okazało się, że używana jest ona także do opieczętowywania klas – blokując ich dziedziczenie; i metod – blokując ich przesłanianie.