Herança

Herança é um conceito chave no contexto da programação orientada a objetos. Em Java, herança é um mecanismo que nos permite criar novas classes com base na estrutura de uma classe base. A nova classe, adquire os campos e métodos dessa classe base.
Dessa forma, a herança nos permite criar hierarquias convenientes e reutilizar código.
Estendendo classes
Uma classe derivada de outra classe é chamada de subclasse (também conhecida como classe derivada, classe estendida ou classe filho).
A classe da qual a subclasse é derivada é chamada de superclasse (também chamada de classe base ou classe pai).
Para derivar uma classe de outra, utilizamos a palavra-chave extends:
class SuperClass { }
class SubClassA extends SuperClass { }
class SubClassB extends SuperClass { }
class SubClassC extends SubClassA { }
Em Java é preciso conhecer as seguintes particularidades:
- Java não suporta herança múltipla, isso significa que uma classe só pode herdar (ser derivada) de uma única superclasse.
- Uma hierarquia de classe pode ter múltiplos níveis (classe C pode estender a classe B que pode estender a classe A, e assim por diante.)
Uma subclasse herda todos os campos e métodos public e protected da superclasse. Uma subclasse também pode ter seus próprios métodos e campos particulares. Os membros herdados e próprios serão usados da mesma forma.
Construtores não são herdados, mas o construtor da superclasse pode ser chamado usando a palavra-chave especial super.
Se você deseja que a superclasse, a classe base, seja acessível por todas as subclasses dentro do mesmo pacote, mas não fora dele, você pode usar o modificador de acesso protected.
Em herança, a superclasse, a classe base, representa características genéricas e a subclasse representa características mais específicas.
Exemplo:
Pessoa tem dados genéricos. Cliente e empregado herdam de pessoa. Gerente e desenvolvedor, por sua vez, herdam de funcionário.
class Person {
protected String name;
protected int yearOfBirth;
protected String address;
// public getters and setters for all fields here
}
class Client extends Person {
protected String contractNumber;
protected boolean gold;
// public getters and setters for all fields here
}
class Employee extends Person {
protected Date startDate;
protected Long salary;
// public getters and setters for all fields here
}
class Programmer extends Employee {
protected String[] programmingLanguages;
public String[] getProgrammingLanguages() {
return programmingLanguages;
}
public void setProgrammingLanguages(String[] programmingLanguages) {
this.programmingLanguages = programmingLanguages;
}
}
class Manager extends Employee {
protected boolean smile;
public boolean isSmile() {
return smile;
}
public void setSmile(boolean smile) {
this.smile = smile;
}
}
Essa hierarquia do exemplo acima possui dois níveis e cinco classes no total. Todos os campos são protcted, isso significa que eles só serão visíveis para subclasses. Cada classe tem getters e setters públicos, mas algumas não têm, pois, usam o construtor padrão sem argumento.
A herança fornece um mecanismo poderoso para reutilização de código e escrita de hierarquias convenientes. Muitas coisas no mundo real podem ser simuladas, como hierarquias de um conceito mais geral para um mais específico.
Classes final
Se uma classe for declarada com a palavra-chave final, ela não poderá ter subclasses.
Resumo
A herança permite construir hierarquias de classes onde subclasses (filhas) recebem alguns campos e métodos da superclasse (mãe). Essa hierarquia pode ter vários níveis, mas cada classe pode herdar apenas de uma única superclasse. Uma boa hierarquia de classes ajuda a evitar duplicação de código e torna seu programa mais modular. Se uma classe não deve ter subclasses, ela deve ser marcada como final.




