Herança
A herança é um mecanismo da Orientação a Objeto que permite criar novas classes a partir de classes já existentes, aproveitando-se das características existentes na classe a ser estendida. Este mecanismo é muito interessante, pois promove um grande reuso e reaproveitamento de código existente. Com a herança é possível criar classes derivadas, subclasses, a partir de classes bases, superclasses. As subclasses são mais especializadas do que as suas superclasses, mais genéricas. As subclasses herdam todas as características de suas superclasses, como suas variáveis e métodos. A linguagem Java permite o uso de herança simples, mas não permite a implementação de herança múltipla. Para superar essa limitação o Java faz uso de interfaces, o qual pode ser visto como uma “promessa”que certos métodos com características previamente estabelecidas serão implementados, usando inclusive a palavra reservada implements para garantir esta implementação. As interfaces possuem sintaxe similar as classes, no entanto apresentam apenas a especificação das funcionalidades que uma classe deve conter, sem determinar como essa funcionalidade deve ser implementada. Apresentam apenas protótipos dos métodos.
A herança é um mecanismo da Orientação a Objeto que permite criar novas classes a partir de classes já existentes, aproveitando-se das características existentes na classe a ser estendida. Este mecanismo é muito interessante, pois promove um grande reuso e reaproveitamento de código existente. Com a herança é possível criar classes derivadas, subclasses, a partir de classes bases, superclasses. As subclasses são mais especializadas do que as suas superclasses, mais genéricas. As subclasses herdam todas as características de suas superclasses, como suas variáveis e métodos. A linguagem Java permite o uso de herança simples, mas não permite a implementação de herança múltipla. Para superar essa limitação o Java faz uso de interfaces, o qual pode ser visto como uma “promessa”que certos métodos com características previamente estabelecidas serão implementados, usando inclusive a palavra reservada implements para garantir esta implementação. As interfaces possuem sintaxe similar as classes, no entanto apresentam apenas a especificação das funcionalidades que uma classe deve conter, sem determinar como essa funcionalidade deve ser implementada. Apresentam apenas protótipos dos métodos.
Por
exemplo, Imagine que dentro de uma organização empresarial, o sistema de RH
tenha que trabalhar com os diferentes níveis hierárquicos da empresa, desde o
funcionário de baixo escalão até o seu presidente. Todos são funcionários da
empresa, porém cada um com um cargo diferente. Mesmo a secretária, o pessoal da
limpeza, o diretor e o presidente possuem um número de identificação, além de
salário e outras características em comum. Essas características em comum podem
ser reunidas em um tipo de classe em comum, e cada nível da hierarquia ser
tratado como um novo tipo, mas aproveitando-se dos tipos já criados, através da
herança. Os subtipos, além de herdarem todas as características de seus
supertipos, também podem adicionar mais características, seja na forma de
variáveis e/ou métodos adicionais, bem como reescrever métodos já existentes na
superclasse, polimorfismo. A herança permite vários níveis na hierarquia de
classes, podendo criar tantos subtipos quanto necessário, até se chegar ao
nível de especialização desejado. Podemos tratar subtipos como se fossem seus
supertipos, por exemplo, o sistema de RH pode tratar uma instância de
Presidente como se fosse um objeto do tipo Funcionário, em determinada
funcionalidade. Porém não é possível tratar um supertipo como se fosse um
subtipo, a não ser que o objeto em questão seja realmente do subtipo desejado e
a linguagem suporte este tipo de tratamento, seja por meio de conversão de
tipos ou outro mecanismo. Algumas linguagens de programação permitem herança múltipla,
ou seja, uma classe pode estender características de várias classes ao mesmo
tempo. É o caso do C++. Outras linguagens não permitem herança múltipla, por se
tratar de algo perigo se não usada corretamente. É o caso do Java. Na
Orientação a Objetos as palavras classe base, supertipo, superclasse, classe
pai e classe mãe são sinônimos, bem como as palavras classe derivada, subtipo,
subclasse e classe filha também são sinônimos.
O que um
aluno, um professor e um funcionário possuem em comum? Todos eles são pessoas
e, portanto, compartilham alguns dados comuns. Todos têm nome, idade, endereço,
etc. E, o que diferencia um aluno de outra pessoa qualquer? Um aluno possui uma
matrícula; Um funcionário possui um código de funcionário, data de admissão, salário,
etc.; Um professor possui um código de professor e informações relacionadas à
sua formação.
É aqui
que a herança se torna uma ferramenta de grande utilidade. Podemos criar uma
classe Pessoa, que possui todos os atributos e métodos comuns a todas as
pessoas e herdar estes atributos e métodos em classes mais específicas, ou
seja, a herança parte do geral para o mais específico. Comece criando uma
classe Pessoa, Pessoa.java, como mostrado no código a seguir:
1.
public class Pessoa{
2.
public String nome;
3.
public int idade;
4.
}
Esta
classe possui os atributos nome e idade. Estes atributos são comuns a todas as
pessoas. Veja agora como podemos criar uma classe Aluno que herda estes atributos
da classe Pessoa e inclui seu próprio atributo, a saber, seu número de
matrícula. Eis o código:
1.
public class Aluno extends Pessoa{
2.
public String matricula;
3.
}
Observe
que, em Java, a palavra-chave usada para indicar herança é extends. A classe
Aluno agora possui três atributos: nome, idade e matricula. Exemplo:
1.
public class Estudos{
2.
public static void main(String args[]){
3.
Aluno aluno = new Aluno();
4.
aluno.nome = "Aluno Esforçado";
5.
aluno.idade = 20;
6.
aluno.matricula = "XXXX99999";
7.
System.out.println("Nome: " + aluno.nome + "\n" +
8.
"Idade: " + aluno.idade + "\n" +
9.
"Matrícula: " + aluno.matricula);
10.
}
11.
}
A herança
nos fornece um grande benefício. Ao concentrarmos características comuns em uma
classe e derivar as classes mais específicas a partir desta, nós estamos
preparados para a adição de novas funcionalidades ao sistema. Se mais adiante
uma nova propriedade comum tiver que ser adicionada, não precisaremos efetuar
alterações em todas as classes. Basta alterar a superclasse e pronto. As
classes derivadas serão automaticamente atualizadas.
1.
public
abstract class Animal {
2.
public
abstract void fazerBarulho();
3.
}
4.
public class
Cachorro extends Animal {
5.
public
void fazerBarulho() {
6.
System.out.println("AuAu!");
7.
}
8.
}
9.
public class Gato
extends Animal {
10.
public
void fazerBarulho() {
11.
System.out.println("Miau!");
12.
}
13.
}
14.
class
Veiculo {
15.
public
Veiculo() {
16.
System.out.print("Veiculo
");
17.
}
18.
public
void checkList() {
19.
System.out.println("Veiculo.checkList");
20.
}
21.
public
void adjust() {
22.
System.out.println("Veiculo.adjust");
23.
}
24.
public
void cleanup() {
25.
System.out.println("Veiculo.cleanup");
26.
}
27.
}
28.
class
Automovel extends Veiculo {
29.
public
Automovel() {
30.
System.out.println("Automovel");
31.
}
32.
public
void checkList() {
33.
System.out.println("Automovel.checkList");
34.
}
35.
public
void adjust() {
36.
System.out.println("Automovel.adjust");
37.
}
38.
public
void cleanup() {
39.
System.out.println("Automovel.cleanup");
40.
}
41.
}
42.
class
Bicicleta extends Veiculo {
43.
public
Bicicleta() {
44.
System.out.println("Bicicleta");
45.
}
46.
public
void checkList() {
47.
System.out.println("Bicicleta.checkList");
48.
}
49.
public
void adjust() {
50.
System.out.println("Bicicleta.adjust");
51.
}
52.
public
void cleanup() {
53.
System.out.println("Bicicleta.cleanup");
54.
}
}
Nenhum comentário:
Postar um comentário
O que achou dessa postagem?