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

Classes derivadas editar

Sendo uma linguagem de programação orientada a objetos, Java oferece mecanismos para definir classes derivadas a partir de classes existentes. É fundamental que se tenha uma boa compreensão sobre como objetos de classes derivadas são criados e manipulados, assim como das restrições de acesso que podem se aplicar a membros de classes derivadas. Também importante para uma completa compreensão da utilização desse mecanismo em Java é entender como se relacionam interfaces e herança.

A forma básica de herança em Java é a extensão simples entre uma superclasse e sua classe derivada. Para tanto, utiliza-se na definição da classe derivada a palavra-chave extends seguida pelo nome da superclasse.

A hierarquia de classes de Java tem como raiz uma classe básica, Object, definida no pacote java.lang. Quando não for especificada uma superclasse na definição de uma classe, o compilador assume implicitamente que a superclasse é Object. Assim, definir a classe Ponto2D como em

class Ponto2D { 
    // ... 
}

é equivalente a defini-la como

class Ponto2D extends Object { 
    // ... 
}

É por esse motivo que todos os objetos podem invocar os métodos definidos na classe Object, como equals() e toString().

O método equals permite comparar objetos por seus conteúdos. Se um comportamento distinto do padrão for desejado para uma classe definida pelo programador, o método deve ser redefinido.

O método toString() permite converter uma representação interna do objeto em uma string que pode ser apresentada ao usuário. Este método é invocado quando é preciso converter um valor ou objeto qualquer para strings, como na concatenação com outras strings ou na apresentação em um console.

Outros métodos da classe Object incluem clone(), um método protegido que permite criar uma duplicata de um objeto, e getClass(), que retorna um objeto que representa a classe à qual o objeto pertence. Esse objeto será da classe Class, uma outra classe do pacote java.lang. Para obter o nome da classe, pode-se usar o método estático getName() dessa classe, que retorna uma string.

Para criar uma classe Ponto3D a partir da definição da classe que representa um ponto em duas dimensões, a nova classe deve incluir um atributo adicional para representar a terceira coordenada:

public class Ponto3D extends Ponto2D { 
    private int z;
    public Ponto3D(int x, int y, int z) { 
        super(x, y); 
        this.z = z; 
    }
    public Ponto3D( ) { 
        z = 0; 
    }
    public static void main(String[] args) { 
        Ponto2D ref2 = new Ponto2D(); 
        Ponto3D p3 = new Ponto3D(1,2,3); 
        System.out.println("Distancia: " + p3.distancia(ref2)); 
    }
}

Nesse exemplo, o método distancia que é utilizado em main é aquele que foi definido para a classe Ponto2D que, por herança, é um método da classe Ponto3D. Esse exemplo ilustra, na definição do primeiro construtor, o uso da palavra-chave super para invocar um construtor específico da superclasse. Se presente, essa expressão deve ser a primeira do construtor, pois o início da construção do objeto é a construção da parte da superclasse. Caso não esteja presente, está implícita uma invocação para o construtor padrão, sem argumentos, da superclasse, equivalente à forma super().