Você está na página 1de 6

Prog.

Orientada a Objetos Acadêmico: ___________________________


IP 05 Herança

Às vezes a solução para uma tarefa muito simples pode ser implementada com
um programa procedural (estruturado), porque a criação de classes pode deixar a
solução mais complicada. Porém, qualquer aplicação onde seja necessário
representar conjuntos de dados dependentes ou interligados entre si – por
exemplo, datas, registros de alunos, contas bancárias, etc. –, podem se beneficiar
da orientação a objetos. Qualquer aplicação pode ser implementada tanto com
orientação a objetos, como de forma estruturada.

Uma das principais características da orientação a objetos é a capacidade de


reutilização de código. Por exemplo, o reaproveitamento de classes e objetos que
já estejam escritos. A reutilização de código diminui a necessidade de escrever
novos códigos, economiza trabalho, diminui a possibilidade de erros e simplifica a
codificação de tarefas complexas por dividir o problema em tarefas menores. em
linguagens estruturadas a reutilização de códigos pode ser feita implementando
funções que podem ser reutilizadas em várias partes do programa. A
programação OO vai além, permitindo a criação de classes baseadas em outras.
Essa técnica é chamada de Herança. As classes criadas com herança podem
conter os métodos e propriedades das classes originais. Podem, ainda, permitir o
acesso direto às propriedades encapsuladas na classe original, além de poder
implementar novos métodos e propriedades.

Herança
Vamos supor que procuramos modelar uma classe para um aluno de ensino
médio como RegistroEscolar. Porém, um aluno de um curso superior não
poderia ser representado apenas por esses dados porque também precisamos
modelar os dados do TCC e orientador. Embora os dois tipos de alunos tenham
características comuns, não seria prático representar os dois com a mesma
classe pois eles tem características diferentes. Assim, se um aluno do ensino
médio for modelado por essa classe, dois atributos não seriam utilizados. O que é
um desperdício e causa confusão. A solução para a OO é criar duas classes:
RegistroEscolar e RegistroAcademico. A última contém os atributos e
métodos do RegistroEscolar e os atributos adicionais.

A Herança permite criar uma classe com base em outra, permitindo reutilizar os
métodos e atributos que não são privados da classe base. Toda vez que duas ou
mais classes fazem parte de um mesmo tipo (uma relação é-um-tipo-de),
podemos utilizar a herança. Por exemplo, o RegistroAcademico é um tipo de
RegistroEscolar. Quando dizemos que uma ou mais classes são do tipo,
significa que elas herdam da classe menos especializada, mas genérica. Dizemos
que as classes mais específicas herdam características. Se quisermos criar outro
registro, como o de pós-graduação, poderemos criar uma classe que herda as
características de RegistroEscolar. As relações de herança na UML são
representadas por uma seta fechada e sem preenchimento direcionada à classe
mais genérica.

Para implementar essas classes com herança utilizamos a palavra extends:


public class RegistroEscolar {
private int matricula;
private String email;
private byte situacao;

public void atualizarSituacao(byte situacao) {


System.out.println("Situação alterada de " + this.nome);
this.situacao = situacao;
}
}
public class RegistroAcademico extends RegistroEscolar {
private String tituloTcc;
private String orientador;
}

Associação, Delegação ou Composição


O mecanismo de delegação (ou composição, ou associação) permite a
reutilização de classes com instâncias de outras classes que ficam contidas na
instância de uma outra classe. Isto é útil quando uma classe é composta ou
relacionada a outra classe. A delegação permite incluirmos uma instância de outra
classe como um atributo da classe base. Para usar os métodos da outra classe se
escrevem métodos na classe base que chamam os métodos da classe associada,
assim delegando as funções da outra classe. Por exemplo, vamos supor que os
registros escolares estão associados à uma pessoa aluno (assim como o
orientador de TCC também é do tipo pessoa). As relações entre classes são
representadas por uma seta (aberta ou fechada com preenchimento) e,
normalmente, com o nome do atributo escrito sobre ela.
Podemos re-implementar as classes desta maneira:
public class Pessoa {

private String nome;

// Getters e Setters
}
public class RegistroEscolar {

private int matricula;


private String email;
private byte situacao;
private Pessoa aluno;

public void atualizarSituacao(byte situacao) {


System.out.println("Situação alterada de " +
this.aluno.getNome());
this.situacao = situacao;
}

// Getters e Setters
}
public class RegistroAcademico extends RegistroEscolar {

private String tituloTcc;


private Pessoa orientador;

// Getters e Setters
}

A complexidade de atualizar a situação dos alunos pode ser reutilizada da classe


RegistroEscolar. Outros métodos da classe pessoa podem ser acessados pelas
instâncias associadas como atributos (aluno e orientador).

Construtores
Os construtores são um tipo de método especial. A função do construtor é
inicializar os atributos do objeto assim que criamos uma instância com a palavra
new. O método construtor tem, obrigatoriamente, o mesmo nome da classe e não
tem um tipo de retorno. Por exemplo:
public class Pessoa {

private String nome;

public Pessoa() {

public Pessoa(String nome) {


this.nome = nome;
}

// Getters e Setters
}

A classe Pessoa passou a ter dois tipos de construtores: no primeiro caso a


classe não recebe nenhum parâmetro e o atributo nome não é inicializado; no
segundo caso, a classe recebe o nome por parâmetro e esse valor é passado
para o atributo da instância. Dessa forma há dois jeitos de se instanciar uma
classe pessoa (com ou sem parâmetro nome):
Pessoa p1 = new Pessoa();
Pessoa p2 = new Pessoa("Maria");

Enumeradores
Existe um outro tipo de classes em Java: os enumeradores (palavra-chave enum).
O enumerador contém constantes e métodos para representar alguns tipos de
dados. Por exemplo, se quiséssemos declarar três tipos de situação do registro
acadêmico: matriculado, formado e trancado, poderíamos criar um enumerador
com a descrição do estado e um código de estado.
public enum SituacaoRegistro {

MATRICULADO ("Matriculado", 1),


FORMADO ("Formado", 2),
TRANCADO ("Trancado", 3);

private final String descricao;


private final byte codigo;

// Consrutor:
private SituacaoRegistro(String d, int c) {
descricao = d;
codigo = (byte) c;
}

// Getters e Setters
}

Então, poderíamos utilizar o tipo do enumerador como atributo:


public class RegistroEscolar {

private int matricula;


private String email;
private SituacaoRegistro situacao;
private Pessoa aluno;
public void atualizarSituacao(SituacaoRegistro situacao) {
System.out.println("Situação alterada de " +
this.situacao.getDescricao() + " para " +
situacao.getDescricao() + " do aluno " +
this.aluno.getNome());
this.situacao = situacao;
}

// Getters e Setters
}

O enumerador representará valores associados as variáveis de cada constante. O


construtor deve ser declarado privado porque será chamado apenas pela classe e
não pelo programador e ele usará os valores passados como atributos para definir
cada uma das três instâncias de situação.

Referências:
Cardoso, Caíque. Orientação a Objetos na Prática - Aprendendo Orientação a
Objetos na Prática. Rio de Janeiro: Editora Ciência Moderna Ltda., 2006.
Santos, Rafael. Introdução à Programação Orientada a Objetos Usando Java. Rio
de Janeiro: Elsevier. 2 ed. 2013.

Lista de Exercícios
Resolva esta lista de exercícios com base nos conhecimentos apresentados,
desenhe os modelos de classe nesta instrução e depois implemente os códigos das
classes em Java seguindo os padrões de nomenclatura e correta identação do
código.

Q.18: Crie uma classe "Pessoa" que possua os atributos "nome" e "sobrenome".
Crie as classes "Funcionario" e "Cliente", que herdam da classe "Pessoa".
- A classe "Funcionario" deve possuir o atributo "salario";
- A classe "Cliente" deve possuir o atributo "cpf".
- Crie objetos de cada uma das classes e imprima os valores dos tributos de
cada uma.

Q.19: Crie uma classe "Veiculo" que possua os atributos "marca", "modelo", "ano",
"cor" e "velocidade". Crie as classes "Carro" e "Moto", que herdam da classe
"Veiculo".
- A classe "Carro" deve possuir os atributos "potencia" e "numPortas";
- A classe "Moto" deve possuir o atributo "cilindradas";
- Crie objetos de cada uma das classes e imprima os atributos
correspondentes.
Q.20: Crie uma classe "Animal" que possua os atributos "nome" e "idade" e que
possua os métodos "comer" e "dormir". Cada método deve apenas imprimir um texto
indicando o que ele faz.
- Crie uma classe "Gato", que herda da classe "Animal". A classe "Gato" deve
possuir um método "miar";
- Crie uma classe "Cachorro" que herde da classe "Animal". A classe
"Cachorro" deve possuir um método "latir";
- Crie uma classe "Cavalo" que herde da classe "Animal" e possua um novo
atributo "raca";
- Crie as classes "Mamifero", "Ave" e "Reptil", que herdam da classe "Animal".
A classe "Mamifero" deve possuir o método "amamentar". A classe "Ave"
deve possuir o método "voar". A classe "Reptil" deve possuir o método
"rastejar".
- Crie objetos de cada uma das classes e chame os métodos correspondentes.

Q.21: Crie uma classe "FiguraGeometrica" que possua os métodos "area" e


"perimetro". Crie as classes "Retangulo" e "Circulo", que herdam da classe
"FiguraGeometrica".
- A classe "Quadrado" deve possuir o atributo "lado";
- A classe "Retangulo" deve possuir os atributos "base" e "altura";
- A classe "Circulo" deve possuir o atributo "raio". O perímetro de um círculo é
dado pela equação: 2 * π * r, e a sua área por: π * r²;
- Crie objetos de cada uma das classes e chame os métodos correspondentes
"area" e "perimetro".

Q.22: Crie uma classe "ContaBancaria" que possua os atributos "numeroConta" e


"saldo". Crie as classes "ContaCorrente" e "ContaPoupanca", que herdam da classe
"ContaBancaria".
- A classe "ContaCorrente" deve possuir o atributo "limiteChequeEspecial" e o
método "sacar";
- A classe "ContaPoupanca" deve possuir o atributo "taxaJuros" e o método
"rendimento";
- Crie objetos de cada uma das classes e chame os métodos correspondentes.

Q.23: Crie uma classe "Produto" que possua os atributos "codigo", "descricao" e
"preco".
- Crie as classes "ProdutoDuravel" e "ProdutoNaoDuravel", que herdam da
classe "Produto";
- A classe "ProdutoDuravel" deve possuir o atributo "tempoGarantia" e o
método "calcularDesconto";
- A classe "ProdutoNaoDuravel" deve possuir o atributo "dataValidade" e o
método "verificarValidade";
- Crie objetos de cada uma das classes e chame os métodos correspondentes.

Você também pode gostar