SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
Objetos, herança e polimorfismo

                    Maurício Linhares
O que é a herança?
}    É uma das propriedades básicas da orientação a objetos,
      aonde você define que uma classe herda os atributos e
      ações de uma outra classe;

}    Funciona como uma forma de evitar a repetição de
      código, em vez de espalhar o código em diversas classes,
      tudo o que é genérico fica em uma classe pai e todas as
      classes filhas herdam o código;

}    Todas as classes em Java herdam da classe pai chamada
      Object (o que quer dizer que todo mundo é um Object);
Um exemplo de herança




                    Animal




  Gato   Cachorro   Leão     Girafa   Hipopótamo
Os animais


}    Todos os nossos animais herdam da classe Animal, porque
      todos eles fazem coisas parecidas, como comer, andar,
      dormir e fazer barulhos;

}    Além dessas ações, a classe animal tem propriedades para
      designar peso, altura e a cor de sua pele (ou pelos);
Classe Animal
public class Animal {

    private int peso;
    private int altura;
    private String cor;

    public void comer() {
            System.out.println("Sou onívoro, como tudo!");
    }

    public void dormir() { System.out.println("Deitei e dormi");     }

    public void andar() { System.out.println("Estou andando por aí"); }

    public void fazerBarulho() { System.out.println(“Huf! Huf! Huf!"); }

}
Indo para os outros animais
}    Agora nós não precisamos mais implementar essas mesmas
      funcionalidades básicas nos nossos animais, todos eles vão
      herdar as qualidades da classe Animal;

}    Quando um dos nossos animais não estiver interessado na
      funcionalidade provida pela classe Animal ele vai poder alterar
      essa funcionalidade só para ele;

}    Os objetos que herdam de animal são versões especializadas
      do nosso animal;

}    Para informar que uma classe herda da outra nós usamos a
      palavra reservada “extends”;
Exemplo de animal especializado

public class Hipopotamo extends Animal {

                    O método comer foi sobrescrito


    public void comer() {
       System.out.println("Comendo plantas");
    }

}
Usando um hipopótamo
public class HipopotamoTest {

    public static void main(String[] args) {
            Animal hipopotamo = new Hipopotamo();

           hipopotamo.setCor("cinza");
           hipopotamo.setPeso(500);

           hipopotamo.comer();
           hipopotamo.andar();
           hipopotamo.dormir();

           System.out. println(
           "O meu hipopótamo pesa " + hipopotamo.getPeso() +
           " e é da cor " + hipopotamo.getCor());
    }

}
O que aconteceu?
}    Nós podemos chamar, no hipopótamo, todos os métodos
      que haviam sido definidos em animal, porque hipopótamo
      herda de Animal (ele é um animal);

}    A implementação utilizada é a que está na classe Animal, a
      não ser no método “comer()”, como a classe
      Hipopotamo sobrescreveu o método, agora a versão do
      método que é chamada é a do próprio Hipopotamo, e
      não mais a de Animal;
O que acontece com esse código?
public class AnimalTest {

    public static void main(String[] args) {

        Animal animal = new Animal();
        animal.comer();
        animal.andar();
        animal.dormir();

    }

}
Vejamos como seria implementado um
leão
public class Leao extends Animal {

    private boolean chefe;

    public void setChefe(boolean chefe) { this.chefe = chefe; }

    public boolean isChefe() { return chefe; }

    public void comer() {
            System.out.println("Comendo carne!");
    }

    public void fazerBarulho() {
            System.out.println("Roooooooooaaaaaaaaaaaarrrrrrrrrrr");
    }

}
O que o leão tem?
}    O leão sobrescreve dois métodos de Animal e ainda
      adiciona uma nova propriedade, a “chefe”, para indicar se
      esse leão é o chefe do bando;

}    Ao criar uma nova propriedade e sobrescrever os seus
      métodos, a classe Leao especializa os comportamentos
      definidos originalmente na classe Animal, mas continua
      podendo ser tratado como um animal;
Tratando um leão como um Animal
public class LeaoTest {

    public static void main(String[] args) {
        Animal animal = new Leao();

        animal.andar();
        animal.comer();
        animal.fazerBarulho();

    }

}
Organizando melhor a nossa árvore de
objetos



                                Animal



        Felinos                Canídeos                Peixes



 Leão             Gato   Cachorro        Lobo   Atum            Salmão
Sobrescrita de métodos
}    A sobrescrita de método acontece quando uma subclasse
      redefine um método encontrado originalmente em uma
      de suas superclasses;

}    Para sobrescrever um método é necessário redefini-lo
      com o mesmo nome, os mesmos parâmetros e o mesmo
      tipo de retorno (mesma assinatura);

}    Quando a máquina virtual vai escolher um método a ser
      chamado, ela procura sempre pelo mais especializado;
Despacho de métodos

Animal definiu o
método comer()        Animal

  Felino não
  redefiniu o
método comer()
                      Felino

Leão redefiniu o
método comer()        Leão
Exemplo de despacho de métodos
public class FelinoTest {

    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.comer();
        Felino felino = new Felino();
        felino.comer();
        Leao leao = new Leao();
        leao.comer();
    }

}
Sobrecarga de métodos
}    Acontece quando se define um método com o mesmo
      nome de um método da classe atual ou de uma
      superclasse, mas os parâmetros são alterados;

}    Pode ser utilizado para mudar os tipos que podem ser
      aceitos através de uma certa operação (como imprimir
      um número ou uma data);

}    Um dos exemplos mais comuns está lá no objeto
      System.out...
Exemplo de sobrecarga
public class PrintTest {

    public static void main(String[] args) {
       System.out.println(10);
       System.out.println(33.89);
       System.out.println("Qualquer coisa");
       System.out.println(new Date());
    }

}
Definindo métodos sobrecarregados
public class Imprimidor {


    private PrintStream saida = System.out;


    public void imprimir( double numero ) {
               this.saida.println( numero );
    }


    public void imprimir( int numero ) {
               this.saida.println( numero );
    }


    public void imprimir( float numero ) {
               this.saida.println( numero );
    }


    public void imprimir( String texto ) {
               this.saida.println( texto );
    }


}
Selecionando métodos sobrecarregados
}    A máquina virtual sempre escolhe o método que tiver o
      tipo mais próximo do passado como parâmetro na hora
      de imprimir;

}    se você passar um objeto Date, ela vai procurar por um
      método que imprima Dates, só depois ela vai buscar por
      um método que imprima uma das subclasses;

}    Um método que receba “Object” recebe qualquer coisa;
Classes abstratas
}    Classes abstratas são classes que existem apenas com o
      propósito de serem extendidas, elas não podem ser
      utilizadas diretamente;

}    Uma classe abstrata define a “base” de um certo
      conjunto de objetos, ela forma o elo comum entre todos
      eles;

}    Classes abstratas em Java são definidas através do uso da
      palavra reservada “abstract” antes da definição da classe;
Exemplo de classe abstrata
public abstract class Cliente {

    private String nome;

    private String email;

    private Endereco endereco;

    private Date clienteDesde;

    //métodos get-set
}
Usando uma classe abstrata
}    Todos os métodos e variáveis que não forem private
      ficam disponíveis para acesso direto pelas subclasses;

}    As subclasses herdam todos os comportamentos da
      classe abstrata e podem sobrescrever todos os que não
      estejam marcados como “final” (Métodos marcados
      como final não podem ser sobrescritos);

}    Mesmo que as variáveis de instância estejam privadas e
      invisíveis, elas podem ser acessadas pelas subclasses se
      houverem métodos get-set;
Uma subclasse
public class PessoaFisica extends Cliente {

    private Date nascidoEm;

    private String cpf;

    //métodos get-set

}
Outra subclasse
public class PessoaJuridica extends Cliente {

    private String cnpj;

    private String inscricaoEstadual;

    private String nomeDeFantasia;
    //métodos get-set
}
Definindo um mensageiro para clientes
public class Mensageiro {

    public void enviarEmailI( Cliente cliente ) {
        System.out.println(
               "Enviando um e-mail para -> " +
                cliente.getEmail() +
               " do tipo " +
               cliente.getClass().getCanonicalName() );
    }

}
Usando as classes abstratas
Mensageiro mensageiro = new Mensageiro();

PessoaFisica pessoaFisica = new PessoaFisica();
pessoaFisica.setEmail("jose@gmail.com");

PessoaJuridica pessoaJuridica = new PessoaJuridica();
pessoaJuridica.setEmail("comerciante@comercio.com");

mensageiro.enviarEmailI(pessoaFisica);
mensageiro.enviarEmailI(pessoaJuridica);
O que não se pode fazer
Mensageiro mensageiro = new Mensageiro();

Cliente cliente = new Cliente(); //não pode
cliente.setEmail("jose@gmail.com");

mensageiro.enviarEmailI(cliente);
Quando usar classes abstratas?
}    Quando não fizer sentido ter objetos da classe base (não
      faz sentido ter um cliente que não é nem pessoa jurídica
      nem pessoa física);

}    Quando você quer obrigar a criação de subclasses e
      apenas subclasses possam ser utilizadas;

}    Quando você quer deixar a implementação de alguma
      coisa para as subclasses dos seus objetos, através de
      métodos abstratos;
Métodos abstratos
}    São métodos que são definidos em uma classe, mas não
      são implementados nela, apenas em suas subclasses;

}    Normalmente são criados para se definir um meio de
      acesso comum a uma ação que pode ser diferente para
      cada tipo de objeto;

}    Se uma classe tem um método abstrato, é obrigatório que
      ela também seja marcada como abstrata;
Exemplo de método abstrato
public abstract class Conta {

    private double saldo;

    public abstract double getLimite();

    public double getSaldo() {
        return saldo;
    }

}
Uma implementação do método
abstrato
public class Poupanca extends Conta {

    public double getLimite() {
       return this.getSaldo();
    }

}
Outra implementação...
public class ContaCorrente extends Conta {

    private double chequeEspecial;

    public double getLimite() {
          return this.chequeEspecial + this.getSaldo();
    }

    public double getChequeEspecial() { return chequeEspecial; }

    public void setChequeEspecial(double chequeEspecial) {
          this.chequeEspecial = chequeEspecial;
    }

}
Exercício
}    Crie a classe abstrata Polígono, essa classe deve ter o
      método abstrato getArea;

}    Crie as classes concretas Triangulo, Quadrado, Retangulo,
      Pentágono e Hexágono, implemente nessas classes os
      métodos que calculem a área total da forma geométrica
      de todas elas;

}    Algumas implementações podem ser herdadas, evite a
      repetição de código;

Mais conteúdo relacionado

Mais procurados

Aula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de ProjetoAula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de ProjetoVinícius de Paula
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfacesRafael Pinheiro
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a pooSedu
 
Java 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesJava 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesRegis Magalhães
 
Java: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoJava: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoArthur Emanuel
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)Armando Daniel
 
03 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.003 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.0César Augusto Pessôa
 
Logica Algoritmo 02 Algoritmo
Logica Algoritmo 02 AlgoritmoLogica Algoritmo 02 Algoritmo
Logica Algoritmo 02 AlgoritmoRegis Magalhães
 

Mais procurados (20)

Padrões MVC
Padrões MVCPadrões MVC
Padrões MVC
 
Aula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de ProjetoAula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de Projeto
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfaces
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Aula orientação a objetos
Aula orientação a objetosAula orientação a objetos
Aula orientação a objetos
 
Aula 4 - Estruturas condicionais
Aula 4 - Estruturas condicionaisAula 4 - Estruturas condicionais
Aula 4 - Estruturas condicionais
 
Gof design patterns
Gof design patternsGof design patterns
Gof design patterns
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a poo
 
Diagrama de Classes
Diagrama de ClassesDiagrama de Classes
Diagrama de Classes
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
Java 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesJava 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas Interfaces
 
JAVA - Herança
JAVA - HerançaJAVA - Herança
JAVA - Herança
 
Java: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoJava: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acesso
 
Padrões de Projeto
Padrões de ProjetoPadrões de Projeto
Padrões de Projeto
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)
 
03 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.003 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.0
 
Aula diagrama de classes
Aula diagrama de classesAula diagrama de classes
Aula diagrama de classes
 
POO - Aula 10 - Polimorfismo
POO - Aula 10 - PolimorfismoPOO - Aula 10 - Polimorfismo
POO - Aula 10 - Polimorfismo
 
Logica Algoritmo 02 Algoritmo
Logica Algoritmo 02 AlgoritmoLogica Algoritmo 02 Algoritmo
Logica Algoritmo 02 Algoritmo
 
UML
UMLUML
UML
 

Semelhante a Objetos, herança e polimorfismo em Java

Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Javadanrleywillian1
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaArthur Emanuel
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classesCarlos Melo
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Professor Samuel Ribeiro
 
Escopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - B
Escopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - BEscopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - B
Escopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - BPaulo Henrique Lerbach Rodrigues
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003elliando dias
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Polimorfismo si facol
Polimorfismo si facolPolimorfismo si facol
Polimorfismo si facolJosé André
 

Semelhante a Objetos, herança e polimorfismo em Java (20)

Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Java
 
Orientação a Objeto
Orientação a ObjetoOrientação a Objeto
Orientação a Objeto
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de Java
 
10 heranca
10   heranca10   heranca
10 heranca
 
Aula4
Aula4Aula4
Aula4
 
Grupo2
Grupo2Grupo2
Grupo2
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classes
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
 
Escopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - B
Escopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - BEscopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - B
Escopos e Modificadores - Preparatório Certificação - OCAJP7 - Aula 1 - B
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
java_avancado.pdf
java_avancado.pdfjava_avancado.pdf
java_avancado.pdf
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
v
vv
v
 
Java annotation
Java annotationJava annotation
Java annotation
 
Polimorfismo si facol
Polimorfismo si facolPolimorfismo si facol
Polimorfismo si facol
 
Lambda Expressions
Lambda ExpressionsLambda Expressions
Lambda Expressions
 

Mais de Maurício Linhares

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropMaurício Linhares
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemMaurício Linhares
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 
Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Maurício Linhares
 
Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010Maurício Linhares
 
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
Projeto e desenvolvimento de sistemas de informação   4 - computação em redeProjeto e desenvolvimento de sistemas de informação   4 - computação em rede
Projeto e desenvolvimento de sistemas de informação 4 - computação em redeMaurício Linhares
 

Mais de Maurício Linhares (20)

Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Curso java 02 - variáveis
Curso java   02 - variáveisCurso java   02 - variáveis
Curso java 02 - variáveis
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Feature Driven Development
Feature Driven DevelopmentFeature Driven Development
Feature Driven Development
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvem
 
Mercado hoje
Mercado hojeMercado hoje
Mercado hoje
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Revisão html e java script
Revisão html e java scriptRevisão html e java script
Revisão html e java script
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 
Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010Introdução ao desenvolvimento web - 2 - iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010
 
Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010Aulas de Java Avançado 1 - Faculdade iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010
 
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
Projeto e desenvolvimento de sistemas de informação   4 - computação em redeProjeto e desenvolvimento de sistemas de informação   4 - computação em rede
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
 
Extreme programming explicada
Extreme programming explicadaExtreme programming explicada
Extreme programming explicada
 
Jdbc e hibernate
Jdbc e hibernateJdbc e hibernate
Jdbc e hibernate
 

Objetos, herança e polimorfismo em Java

  • 1. Objetos, herança e polimorfismo Maurício Linhares
  • 2. O que é a herança? }  É uma das propriedades básicas da orientação a objetos, aonde você define que uma classe herda os atributos e ações de uma outra classe; }  Funciona como uma forma de evitar a repetição de código, em vez de espalhar o código em diversas classes, tudo o que é genérico fica em uma classe pai e todas as classes filhas herdam o código; }  Todas as classes em Java herdam da classe pai chamada Object (o que quer dizer que todo mundo é um Object);
  • 3. Um exemplo de herança Animal Gato Cachorro Leão Girafa Hipopótamo
  • 4. Os animais }  Todos os nossos animais herdam da classe Animal, porque todos eles fazem coisas parecidas, como comer, andar, dormir e fazer barulhos; }  Além dessas ações, a classe animal tem propriedades para designar peso, altura e a cor de sua pele (ou pelos);
  • 5. Classe Animal public class Animal { private int peso; private int altura; private String cor; public void comer() { System.out.println("Sou onívoro, como tudo!"); } public void dormir() { System.out.println("Deitei e dormi"); } public void andar() { System.out.println("Estou andando por aí"); } public void fazerBarulho() { System.out.println(“Huf! Huf! Huf!"); } }
  • 6. Indo para os outros animais }  Agora nós não precisamos mais implementar essas mesmas funcionalidades básicas nos nossos animais, todos eles vão herdar as qualidades da classe Animal; }  Quando um dos nossos animais não estiver interessado na funcionalidade provida pela classe Animal ele vai poder alterar essa funcionalidade só para ele; }  Os objetos que herdam de animal são versões especializadas do nosso animal; }  Para informar que uma classe herda da outra nós usamos a palavra reservada “extends”;
  • 7. Exemplo de animal especializado public class Hipopotamo extends Animal { O método comer foi sobrescrito public void comer() { System.out.println("Comendo plantas"); } }
  • 8. Usando um hipopótamo public class HipopotamoTest { public static void main(String[] args) { Animal hipopotamo = new Hipopotamo(); hipopotamo.setCor("cinza"); hipopotamo.setPeso(500); hipopotamo.comer(); hipopotamo.andar(); hipopotamo.dormir(); System.out. println( "O meu hipopótamo pesa " + hipopotamo.getPeso() + " e é da cor " + hipopotamo.getCor()); } }
  • 9. O que aconteceu? }  Nós podemos chamar, no hipopótamo, todos os métodos que haviam sido definidos em animal, porque hipopótamo herda de Animal (ele é um animal); }  A implementação utilizada é a que está na classe Animal, a não ser no método “comer()”, como a classe Hipopotamo sobrescreveu o método, agora a versão do método que é chamada é a do próprio Hipopotamo, e não mais a de Animal;
  • 10. O que acontece com esse código? public class AnimalTest { public static void main(String[] args) { Animal animal = new Animal(); animal.comer(); animal.andar(); animal.dormir(); } }
  • 11. Vejamos como seria implementado um leão public class Leao extends Animal { private boolean chefe; public void setChefe(boolean chefe) { this.chefe = chefe; } public boolean isChefe() { return chefe; } public void comer() { System.out.println("Comendo carne!"); } public void fazerBarulho() { System.out.println("Roooooooooaaaaaaaaaaaarrrrrrrrrrr"); } }
  • 12. O que o leão tem? }  O leão sobrescreve dois métodos de Animal e ainda adiciona uma nova propriedade, a “chefe”, para indicar se esse leão é o chefe do bando; }  Ao criar uma nova propriedade e sobrescrever os seus métodos, a classe Leao especializa os comportamentos definidos originalmente na classe Animal, mas continua podendo ser tratado como um animal;
  • 13. Tratando um leão como um Animal public class LeaoTest { public static void main(String[] args) { Animal animal = new Leao(); animal.andar(); animal.comer(); animal.fazerBarulho(); } }
  • 14. Organizando melhor a nossa árvore de objetos Animal Felinos Canídeos Peixes Leão Gato Cachorro Lobo Atum Salmão
  • 15. Sobrescrita de métodos }  A sobrescrita de método acontece quando uma subclasse redefine um método encontrado originalmente em uma de suas superclasses; }  Para sobrescrever um método é necessário redefini-lo com o mesmo nome, os mesmos parâmetros e o mesmo tipo de retorno (mesma assinatura); }  Quando a máquina virtual vai escolher um método a ser chamado, ela procura sempre pelo mais especializado;
  • 16. Despacho de métodos Animal definiu o método comer() Animal Felino não redefiniu o método comer() Felino Leão redefiniu o método comer() Leão
  • 17. Exemplo de despacho de métodos public class FelinoTest { public static void main(String[] args) { Animal animal = new Animal(); animal.comer(); Felino felino = new Felino(); felino.comer(); Leao leao = new Leao(); leao.comer(); } }
  • 18. Sobrecarga de métodos }  Acontece quando se define um método com o mesmo nome de um método da classe atual ou de uma superclasse, mas os parâmetros são alterados; }  Pode ser utilizado para mudar os tipos que podem ser aceitos através de uma certa operação (como imprimir um número ou uma data); }  Um dos exemplos mais comuns está lá no objeto System.out...
  • 19. Exemplo de sobrecarga public class PrintTest { public static void main(String[] args) { System.out.println(10); System.out.println(33.89); System.out.println("Qualquer coisa"); System.out.println(new Date()); } }
  • 20. Definindo métodos sobrecarregados public class Imprimidor { private PrintStream saida = System.out; public void imprimir( double numero ) { this.saida.println( numero ); } public void imprimir( int numero ) { this.saida.println( numero ); } public void imprimir( float numero ) { this.saida.println( numero ); } public void imprimir( String texto ) { this.saida.println( texto ); } }
  • 21. Selecionando métodos sobrecarregados }  A máquina virtual sempre escolhe o método que tiver o tipo mais próximo do passado como parâmetro na hora de imprimir; }  se você passar um objeto Date, ela vai procurar por um método que imprima Dates, só depois ela vai buscar por um método que imprima uma das subclasses; }  Um método que receba “Object” recebe qualquer coisa;
  • 22. Classes abstratas }  Classes abstratas são classes que existem apenas com o propósito de serem extendidas, elas não podem ser utilizadas diretamente; }  Uma classe abstrata define a “base” de um certo conjunto de objetos, ela forma o elo comum entre todos eles; }  Classes abstratas em Java são definidas através do uso da palavra reservada “abstract” antes da definição da classe;
  • 23. Exemplo de classe abstrata public abstract class Cliente { private String nome; private String email; private Endereco endereco; private Date clienteDesde; //métodos get-set }
  • 24. Usando uma classe abstrata }  Todos os métodos e variáveis que não forem private ficam disponíveis para acesso direto pelas subclasses; }  As subclasses herdam todos os comportamentos da classe abstrata e podem sobrescrever todos os que não estejam marcados como “final” (Métodos marcados como final não podem ser sobrescritos); }  Mesmo que as variáveis de instância estejam privadas e invisíveis, elas podem ser acessadas pelas subclasses se houverem métodos get-set;
  • 25. Uma subclasse public class PessoaFisica extends Cliente { private Date nascidoEm; private String cpf; //métodos get-set }
  • 26. Outra subclasse public class PessoaJuridica extends Cliente { private String cnpj; private String inscricaoEstadual; private String nomeDeFantasia; //métodos get-set }
  • 27. Definindo um mensageiro para clientes public class Mensageiro { public void enviarEmailI( Cliente cliente ) { System.out.println( "Enviando um e-mail para -> " + cliente.getEmail() + " do tipo " + cliente.getClass().getCanonicalName() ); } }
  • 28. Usando as classes abstratas Mensageiro mensageiro = new Mensageiro(); PessoaFisica pessoaFisica = new PessoaFisica(); pessoaFisica.setEmail("jose@gmail.com"); PessoaJuridica pessoaJuridica = new PessoaJuridica(); pessoaJuridica.setEmail("comerciante@comercio.com"); mensageiro.enviarEmailI(pessoaFisica); mensageiro.enviarEmailI(pessoaJuridica);
  • 29. O que não se pode fazer Mensageiro mensageiro = new Mensageiro(); Cliente cliente = new Cliente(); //não pode cliente.setEmail("jose@gmail.com"); mensageiro.enviarEmailI(cliente);
  • 30. Quando usar classes abstratas? }  Quando não fizer sentido ter objetos da classe base (não faz sentido ter um cliente que não é nem pessoa jurídica nem pessoa física); }  Quando você quer obrigar a criação de subclasses e apenas subclasses possam ser utilizadas; }  Quando você quer deixar a implementação de alguma coisa para as subclasses dos seus objetos, através de métodos abstratos;
  • 31. Métodos abstratos }  São métodos que são definidos em uma classe, mas não são implementados nela, apenas em suas subclasses; }  Normalmente são criados para se definir um meio de acesso comum a uma ação que pode ser diferente para cada tipo de objeto; }  Se uma classe tem um método abstrato, é obrigatório que ela também seja marcada como abstrata;
  • 32. Exemplo de método abstrato public abstract class Conta { private double saldo; public abstract double getLimite(); public double getSaldo() { return saldo; } }
  • 33. Uma implementação do método abstrato public class Poupanca extends Conta { public double getLimite() { return this.getSaldo(); } }
  • 34. Outra implementação... public class ContaCorrente extends Conta { private double chequeEspecial; public double getLimite() { return this.chequeEspecial + this.getSaldo(); } public double getChequeEspecial() { return chequeEspecial; } public void setChequeEspecial(double chequeEspecial) { this.chequeEspecial = chequeEspecial; } }
  • 35. Exercício }  Crie a classe abstrata Polígono, essa classe deve ter o método abstrato getArea; }  Crie as classes concretas Triangulo, Quadrado, Retangulo, Pentágono e Hexágono, implemente nessas classes os métodos que calculem a área total da forma geométrica de todas elas; }  Algumas implementações podem ser herdadas, evite a repetição de código;