Programação Orientada a Objetos: Uma Abordagem com Java/Princípios da programação na linguagem Java/Classes Java/Classes abstratas e finais

Origem: Wikilivros, livros abertos por um mundo aberto.

Classes abstratas e finais[editar | editar código-fonte]

Uma classe abstrata não pode ser instanciada, ou seja, não há objetos que possam ser construídos diretamente de sua definição. Por exemplo, a compilação do seguinte trecho de código

abstract class AbsClass { 
    public static void main(String[] args) { 
        AbsClass obj = new AbsClass(); 
    }
}

geraria a seguinte mensagem de erro:

AbsClass.java:3: class AbsClass is an abstract class. It can’t be instantiated. 
    AbsClass obj = new AbsClass(); 
                   ^ 1 error

Em geral, classes abstratas definem um conjunto de funcionalidades das quais pelo menos uma está especificada mas não está definida — ou seja, contém pelo menos um método abstrato, como em

abstract class AbsClass { 
    public abstract int umMetodo(); 
}

Um método abstrato não cria uma definição, mas apenas uma declaração de um método que deverá ser implementado em uma classe derivada. Se esse método não for implementado na classe derivada, esta permanece como uma classe abstrata mesmo que não tenha sido assim declarada explicitamente. Assim, para que uma classe derivada de uma classe abstrata possa gerar objetos, os métodos abstratos devem ser definidos em classes derivadas:

class ConcClass extends AbsClass { 
    public int umMetodo() { 
        return 0; 
    } 
}

Uma classe final, por outro lado, indica uma classe que não pode ser estendida. Assim, a compilação do arquivo Reeleicao.java com o seguinte conteúdo:

final class Mandato { 
}

public class Reeleicao extends Mandato { 
}

ocasionaria um erro de compilação:

caolho:Exemplos[39] javac Reeleicao.java 
   Reeleicao.java:4: Can’t subclass final classes: class Mandato 
   public class Reeleicao extends Mandato { 
                                  ^ 1 error

A palavra-chave final pode também ser aplicada a métodos e a atributos de uma classe.

Um método final não pode ser redefinido em classes derivadas.

Um atributo final não pode ter seu valor modificado, ou seja, define valores que, uma vez definidos, são constantes. Apenas valores de tipos primitivos podem ser utilizados para definir constantes.

A utilização do modificador final para uma referência a objetos é permitida. No entanto, é preciso ressaltar que o conteúdo do objeto em geral pode ser modificado — apenas a referência é fixa. O mesmo é válido para arranjos.

Tipicamente, a definição de valores para variáveis final ocorre junto com a declaração. A partir de Java 1.1, é possível ter atributos de uma classe que sejam final mas não recebem valor na declaração, mas sim nos construtores da classe. (A inicialização deve obrigatoriamente ocorrer em uma das duas formas.) São os chamados blank finals, que introduzem um maior grau de flexibilidade na definição de constantes para objetos de uma classe, uma vez que essas podem depender de parâmetros passados para o construtor.

Argumentos de um método que não devem ser modificados podem ser declarados como final, também, na própria lista de parâmetros.