Herança em POO
Herança
● Herança é um princípio de orientação a
objetos, que permite que classes compartilhem
atributos e métodos, através de "heranças".
● Ela é usada na intenção de reaproveitar código
ou comportamento generalizado ou
especializar operações ou atributos.
● O conceito de herança de várias classes é
conhecido como herança múltipla.
Herança
● Herança Múltipla:
– Algumas linguagens de programação suportam a
herança múltipla, que permite que uma subclasse
tenha capacidade de herdar características de duas
ou mais superclasses. Assim, uma única classe
pode agrupar atributos e métodos de várias
classes.
– Não é o caso de Java, que não permite essa
funcionalidade.
Exemplo de Herança
Herança
● Na herança, as características comuns a um
grupo de classes são reunidas em uma
superclasse ("classe mãe") e, a partir dessa,
outras classes podem ser especificadas. Cada
subclasse ("classe filha") apresenta as
características (métodos, atributos, ...)
especificadas pela superclasse e, além disso,
pode especificar o que for definido como sua
particularidade.
Herança
●
A herança tem a vantagem de
capturar o que é comum e o isolar
daquilo que é diferente, além de ser
vista diretamente no código OO.
●
Porém, ela gera um forte
acoplamento, pois uma pequena
mudança numa superclasse afeta
todas as suas subclasses.
Herança de atributos
Extends
● Para fazermos uma classe herdar as
características de uma outra, usamos a palavra
reservada extends logo após a definição do
nome da classe.
Acessar a superclasse
● Para poder acessar os atributos da superclasse
é necessário utilizar a palavra reservada This.
Instância
Super
● Como estamos tratando de herança de classes, toda
classe tem seu método construtor. Portanto, se estamos
trabalhando com duas classes, temos dois métodos
construtores. Para acessarmos o método construtor da
classe que está sendo herdada usamos o super().
● Podemos usar o super para qualquer construtor da
classe pai, pois o Java consegue diferenciar os
construtores por causa da sobrecarga de métodos.
Herança de métodos
● Observe o seguinte sistema
Herança de métodos
Herança de métodos
● No Java, quando herdamos um método,
podemos alterar seu comportamento. Podemos
reescrever (reescrever, sobrescrever, override)
este método
Herança de métodos
● Há como deixar explícito no seu código que determinador método é
a reescrita de um método da sua classe mãe. Fazemos isso
colocando @Override em cima do método.
● Isso é chamado anotação.
● Existem diversas anotações e cada uma vai ter um efeito diferente
sobre seu código.
Herança de métodos
● Repare que, por questões de compatibilidade,
isso não é obrigatório. Mas caso um método
esteja anotado com @Override, ele
necessariamente precisa estar reescrevendo um
método da classe mãe.
Invocando o método reescrito
● Depois de reescrito, não podemos mais
chamar o método antigo que fora herdado da
classe mãe: realmente alteramos o seu
comportamento. Mas podemos invocá-lo no
caso de estarmos dentro da classe.
● Imagine que para calcular a bonificação de um
Gerente devemos fazer igual ao cálculo de um
Funcionario porém adicionando R$ 1000.
Poderíamos fazer assim:
Invocando o método reescrito
Invocando o método reescrito
● Aqui teríamos um problema: o dia que o
getBonificacao do Funcionario mudar,
precisaremos mudar o método do Gerente para
acompanhar a nova bonificação. Para evitar
isso, o getBonificacao do Gerente pode chamar
o do Funcionario utilizando a palavra chave
super.
Invocando o método reescrito
Invocando o método reescrito
● Essa invocação vai procurar o método com o nome
getBonificacao de uma super classe de Gerente. No
caso ele logo vai encontrar esse método em Funcionario.
● Essa é uma prática comum, pois muitos casos o método
reescrito geralmente faz "algo a mais" que o método da
classe mãe. Chamar ou não o método de cima é uma
decisão sua e depende do seu problema. Algumas vezes
não faz sentido invocar o método que reescrevemos.
Override
● Ele é uma forma de garantir que você está
sobrescrevendo um método e não criando um
novo.
● EX:
Override
● Você sobrescreveu corretamente o método imprime() e
o código acima funcionará sem maiores problemas.
● Entretanto um belo dia você resolveu mudar o nome do
método na SuperClasse de imprime() para imprimir().
● Resultado:
Exercício
● Implemente o restante das classes:

Aula Herança

  • 1.
  • 2.
    Herança ● Herança éum princípio de orientação a objetos, que permite que classes compartilhem atributos e métodos, através de "heranças". ● Ela é usada na intenção de reaproveitar código ou comportamento generalizado ou especializar operações ou atributos. ● O conceito de herança de várias classes é conhecido como herança múltipla.
  • 3.
    Herança ● Herança Múltipla: –Algumas linguagens de programação suportam a herança múltipla, que permite que uma subclasse tenha capacidade de herdar características de duas ou mais superclasses. Assim, uma única classe pode agrupar atributos e métodos de várias classes. – Não é o caso de Java, que não permite essa funcionalidade.
  • 4.
  • 5.
    Herança ● Na herança,as características comuns a um grupo de classes são reunidas em uma superclasse ("classe mãe") e, a partir dessa, outras classes podem ser especificadas. Cada subclasse ("classe filha") apresenta as características (métodos, atributos, ...) especificadas pela superclasse e, além disso, pode especificar o que for definido como sua particularidade.
  • 6.
    Herança ● A herança tema vantagem de capturar o que é comum e o isolar daquilo que é diferente, além de ser vista diretamente no código OO. ● Porém, ela gera um forte acoplamento, pois uma pequena mudança numa superclasse afeta todas as suas subclasses.
  • 7.
  • 8.
    Extends ● Para fazermosuma classe herdar as características de uma outra, usamos a palavra reservada extends logo após a definição do nome da classe.
  • 9.
    Acessar a superclasse ●Para poder acessar os atributos da superclasse é necessário utilizar a palavra reservada This.
  • 10.
  • 11.
    Super ● Como estamostratando de herança de classes, toda classe tem seu método construtor. Portanto, se estamos trabalhando com duas classes, temos dois métodos construtores. Para acessarmos o método construtor da classe que está sendo herdada usamos o super(). ● Podemos usar o super para qualquer construtor da classe pai, pois o Java consegue diferenciar os construtores por causa da sobrecarga de métodos.
  • 12.
    Herança de métodos ●Observe o seguinte sistema
  • 13.
  • 14.
    Herança de métodos ●No Java, quando herdamos um método, podemos alterar seu comportamento. Podemos reescrever (reescrever, sobrescrever, override) este método
  • 15.
    Herança de métodos ●Há como deixar explícito no seu código que determinador método é a reescrita de um método da sua classe mãe. Fazemos isso colocando @Override em cima do método. ● Isso é chamado anotação. ● Existem diversas anotações e cada uma vai ter um efeito diferente sobre seu código.
  • 16.
    Herança de métodos ●Repare que, por questões de compatibilidade, isso não é obrigatório. Mas caso um método esteja anotado com @Override, ele necessariamente precisa estar reescrevendo um método da classe mãe.
  • 17.
    Invocando o métodoreescrito ● Depois de reescrito, não podemos mais chamar o método antigo que fora herdado da classe mãe: realmente alteramos o seu comportamento. Mas podemos invocá-lo no caso de estarmos dentro da classe. ● Imagine que para calcular a bonificação de um Gerente devemos fazer igual ao cálculo de um Funcionario porém adicionando R$ 1000. Poderíamos fazer assim:
  • 18.
  • 19.
    Invocando o métodoreescrito ● Aqui teríamos um problema: o dia que o getBonificacao do Funcionario mudar, precisaremos mudar o método do Gerente para acompanhar a nova bonificação. Para evitar isso, o getBonificacao do Gerente pode chamar o do Funcionario utilizando a palavra chave super.
  • 20.
  • 21.
    Invocando o métodoreescrito ● Essa invocação vai procurar o método com o nome getBonificacao de uma super classe de Gerente. No caso ele logo vai encontrar esse método em Funcionario. ● Essa é uma prática comum, pois muitos casos o método reescrito geralmente faz "algo a mais" que o método da classe mãe. Chamar ou não o método de cima é uma decisão sua e depende do seu problema. Algumas vezes não faz sentido invocar o método que reescrevemos.
  • 22.
    Override ● Ele éuma forma de garantir que você está sobrescrevendo um método e não criando um novo. ● EX:
  • 23.
    Override ● Você sobrescreveucorretamente o método imprime() e o código acima funcionará sem maiores problemas. ● Entretanto um belo dia você resolveu mudar o nome do método na SuperClasse de imprime() para imprimir(). ● Resultado:
  • 24.
    Exercício ● Implemente orestante das classes: