4 - Java - Herança

Você também pode gostar

Você está na página 1de 29

Java Básico

Herança

Ayslan Macedo de Sousa


1
Herança
• Na orientação a objetos, Herança é o mecanismo
pelo qual uma classe pode estender outra classe,
aproveitando seus comportamentos (métodos) e
variáveis possíveis (atributos).

2
Herança na UML
A herança pode ser representada na UML assim:

Nesse exempo PessoaFisica e PessoaJuridica herdam os atributos e


métodos (public e protected) da classe Pessoa
3
Generalização e Especificação

Classe mais genérica

Classe mais específica

4
Generalização e Especificação
Nesse exemplo é correto afirmar que:

PessoaFisica é filha/subclasse/derivada de
Pessoa

PessoaJuridica é filha/subclasse/derivada de
Pessoa

Pessoa é pai/superclasse de PessoaFisica e


PessoaJuridica

5
Herança em java
A herança pode ser indicada pela palavra reservada extends e
deve ser coloca após o nome da classe
Classe Pessoa:
1. public class Pessoa {
2.
3. private String nome;
4. private String numeroDocumento;
5.
6. }

Classe PessoaFisica (filha de Pessoa):


1. public class PessoaFisica extends Pessoa{
2.
3. private String rg;
4. private Date dataNascimento;
5.
6. }
6
Herança em java
O exemplo abaixo mostra 2 classes que herdam de Pessoa
Classe Pessoa:
1. public class Pessoa {
2.
3. private String nome;
4. private String numeroDocumento;
5.
6. }

Classe PessoaFisica (filha de Pessoa):


1. public class PessoaFisica extends Pessoa{
2.
3. private String rg;
4. private Date dataNascimento;
5.
6. }

Classe PessoaJuridica (filha de Pessoa):


1. public class PessoaJuridica extends Pessoa{
2.
3. private String inscricaoEstadual;
4. private String inscricaoMunicipal;
5.
6. }
7
Herança em java

Importante!
Todas as classes são filhas de java.lang.Object

Apesar de não ser explicitado no código , todas as classes são


filhas de java.lang.Object.

8
Herança em Java
Ao instanciar uma classe é possível criar um objeto do tipo mais genérico
sendo um de um tipo mais específico, porém o contrário não é possível.

Não é possível o seguinte caso:

1. PessoaFisica pessoaFisica = new Pessoa():


2. PessoaJuridica pessoaJuridica = new Pessoa():

Já assim, é possível:

1. Pessoa pessoa1 = new PessoaFisica();


2. Pessoa pessoa2 = new PessoaJuridica();

9
Exercício - Herança
• Criar as 3 classes mostradas no diagrama com seus getters e setters
– Criar as classes no pacote br.com.curso.modelo
– Utilizar a palavra chave extends para definir a herança

Exemplo do uso do extends:


1. public class PessoaFisica extends Pessoa{
2.
3.
4. }

10
Herança - Verificando o tipo de instância de uma classe

Para se verificar se um objeto é instância de algum tipo, pode-se


utilizar a palavra chave instanceof:

Sintaxe:
//retorna true ou false
objeto instanceof Classe

11
Herança - Verificando o tipo de instância de uma classe

Exemplo de utilização do instanceof:


1. Pessoa pessoaFisica = new PessoaFisica();
2.
3. if(pessoaFisica instanceof PessoaFisica){
4. System.out.println("É Pessoa Fisica");
5. }

12
Herança - instanceof
O instanceof retorna true mesmo ao ser
comparado com a classe pai
1. Pessoa pessoaFisica = new PessoaFisica();
2. //true
3. if(pessoaFisica instanceof PessoaFisica){
4. System.out.println("É Pessoa Fisica");
5. }
6. //true
7. if(pessoaFisica instanceof Pessoa){
8. System.out.println("É Pessoa");
9. }

13
Exercício - instanceof
• Criar o pacote br.com.curso.heranca
• Criar a classe ExercicioInstanceOf no pacote br.com.curso.heranca
• Executar a classe e verificar o resultado
1. package br.com.curso.heranca;
2.
3. //imports
4.
5. public class ExercicioInstanceOf {
6.
7. public static void main(String[] args) {
8.
9. Pessoa pessoa = new PessoaFisica();
10.
11. System.out.println(pessoa instanceof Object);
12. System.out.println(pessoa instanceof Pessoa);
13. System.out.println(pessoa instanceof PessoaFisica);
14. System.out.println(pessoa instanceof PessoaJuridica);
15.
16. }
17. }

14
Sobrescrita de método
• Também conhecido como reescrita de
método
• Acontece quando a classe pai possui algum
método e este método é reescrito na classe
com o mesmo nome

15
Sobrescrita de Método
• A classe Pessoa, possui o método getDocumento() e as suas classes filhas
reescrevem esse método.

16
Sobrescrita de Método

Classe Pessoa com o método getDocumento():


1. public class Pessoa {
2. public String getDocumento(){
3. return "Nenhum";
4. }
5. }

Para reescrever o método a classe filha deve declarar a classe com o mesmo
tipo de retorno e com o mesmo nome:
1. public class PessoaFisica extends Pessoa{
2.
3. public String getDocumento(){
4. return "CPF";
5. }
6.
7. }

17
Sobrescrita de Método
Classe Pessoa com o método getDocumento():
1. public class Pessoa {
2. public String getDocumento(){
3. return "Nenhum";
4. }
5. }

Classe PessoaFisica reescrevendo o método getDocumento():


1. public class PessoaFisica extends Pessoa{
2. public String getDocumento(){
3. return "CPF";
4. }
5. }

Classe PessoaJuridica reescrevendo o método getDocumento():


1. public class PessoaJuridica extends Pessoa {
2. public String getDocumento() {
3. return "CNPJ";
4. }
5. }

18
Exercício - Sobrescrita de Método
• Criar o método getDocumento() na classe Pessoa, com o retornando a String
“Nenhum”
• Sobrescrever esse método nas classes PessoaFisica e PessoaJuridica retornando
“CPF” e “CNPJ”, respectivamente.
• Criar e exeutar a classe ExercicioSobrescrita no pacote br.com.curso.heranca com
o seguinte método main
1. package br.com.curso.heranca;
2.
3. //imports
4.
5. public class ExercicioSobrescrita {
6. public static void main(String[] args) {
7.
8. Pessoa pessoa1 = new PessoaFisica();
9. Pessoa pessoa2 = new PessoaJuridica();
10.
11. System.out.println(pessoa1.getDocumento());
12. System.out.println(pessoa2.getDocumento());
13.
14. }
15. }
19
Palavra chave super
• Para se acessar métodos e atributos da classe
pai, pode-se utilizar a palavra chave super
• Quando queremos acessar da própria classe
pode-se utilizar a palavra chave this

20
Palavra chave super
No exemplo abaixo a classe Usuario, filha de PessoaFisica,
sobrescreve o método getDocumento() e utiliza a palavra
chave super:

1. public class Usuario extends PessoaFisica{


2.
3. public String getDocumento() {
4. return super.getDocumento();
5. }
6.
7. }

Basicamente o getDocumento() de Usuario, retorna o mesmo


de sua classe pai (PessoaFisica)
21
Utilizando o super no Construtor

• A palavra chave super pode ser chamada também


no construtor, assim ao chamar o construtor da
classe filha, ela chama o construtor da classe pai.
• Utilizando o super é possível acessar os
construtores declarados na classe Pai
• A vantagem é aproveitar o código do construtor
da classe pai

22
Utilizando o super no Construtor
Exemplo utilizando as classes Pessoa e PessoaFisica:
1. public class Pessoa {
2.
3. private String nome;
4.
5. public Pessoa(String nome) {
6. this.nome = nome;
7. }
8. }

Construtor da classe PessoaFisica


1. public class PessoaFisica extends Pessoa{
2.
3. public PessoaFisica(String nome) {
4. super(nome);
5. }
6.
7. }

23
Utilizando o super no Construtor
O super ao ser chamado no construtor deve ser o primeiro comando a
ser chamado, caso contrário a classe apresenta erro de compilação

1. public class Usuario extends PessoaFisica{


2. public Usuario(String nome) {
3. System.out.println("Entrando no Construtor");
4. super(nome);
5. }
6. }

1. public class Usuario extends PessoaFisica{


2. public Usuario(String nome) {
3. super(nome);
4. System.out.println("Entrando no Construtor");
5. }
6. }

24
Exercício de Fixação - Herança
Considerando a classe Funcionario e Gerente:
1. public class Funcionario{
2. }

1. public class Gerente extends Funcionario{


2. }

Quais maneiras abaixo de instanciar o objeto funcionario apresenta erro?

a) Funcionario funcionario = new Gerente();

b) Funcionario funcionario = new Object();

c) Gerente funcionario = new Gerente();

d) Gerente funcionario = new Funcionario();

e) Object funcionario = new Gerente();

25
Exercício de Fixação - Herança
Considerando a classe Funcionario e Gerente:
1. public class Funcionario{
2. }

1. public class Gerente extends Funcionario{


2. }

Quais maneiras abaixo de instanciar o objeto funcionario apresenta erro?

a) Funcionario funcionario = new Gerente();

b) Funcionario funcionario = new Object();

c) Gerente funcionario = new Gerente();

d) Gerente funcionario = new Funcionario();

e) Object funcionario = new Gerente();

26
Exercício de Fixação - Herança
Considerando os códigos abaixo:
1. public class Funcionario{
2. }

1. public class Gerente extends Funcionario{


2. }

1. Funcionario funcionario = new Funcionario();


2. Funcionario gerente = new Gerente();

Qual(is) do(s) comando(s) abaixo retorna(m) falso?

a) funcionario instanceof Funcionario

b) funcionario instanceof Gerente

c) funcionario instanceof Object

d) gerente instanceof Funcionario

e) gerente instanceof Object


27
Exercício de Fixação - Herança
Considerando os códigos abaixo:
1. public class Funcionario{
2. }

1. public class Gerente extends Funcionario{


2. }

1. Funcionario funcionario = new Funcionario();


2. Funcionario gerente = new Gerente();

Qual(is) do(s) comando(s) abaixo retorna(m) falso?

a) funcionario instanceof Funcionario

b) funcionario instanceof Gerente

c) funcionario instanceof Object

d) gerente instanceof Funcionario

e) gerente instanceof Object


28
Exercício - Herança
• Criar as classes conforme mostrado no diagrama de classes abaixo no
pacote br.com.curso.modelo
• Criar seus respectivos getters e setters

29

Você também pode gostar