Programação Orientada a Objetos



     Sobrecarga e Sobreposição
            de Métodos



          Ludimila Monjardim Casagrande
                      2012
Sobrecarga de Métodos

     A sobrecarga de métodos, também conhecida
         como overloading, ocorre quando criamos dois
         ou mais métodos com o mesmo nome mas com
         uma lista de argumentos diferente.
     A sobrecarga está sendo aplicada, por exemplo,
         quando são declarados dois construtores para
         uma mesma classe, sendo um sem parâmetros
         e outro com parâmetros.



Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   2
Exemplo de Sobrecarga de Construtor
   public class Conta {
       private double saldo;
       public Conta () {
       }
       public Conta (double saldo) {
         this.saldo = saldo;
       }
   }

   Podemos, então, criar objetos dessa classe de dois modos:
   Conta c = new Conta(); ou
   Conta c = new Conta(100);  inicializando o saldo com algum valor


Sobrecarga e Sobreposição      ©2012 Ludimila Monjardim Casagrande     3
Sobrecarga de Métodos

     A sobrecarga também é aplicada para os outros
         métodos que não sejam construtores.
     Em algumas situações, é útil poder executar um
         método em uma classe passando mais ou
         menos argumentos, conforme a necessidade.
     Também pode ser necessário fazer a
         sobrecarga de um mesmo método, com o
         mesmo número de argumentos, porém variando
         os tipos desses argumentos.

Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   4
Exemplo de Sobrecarga de Método
   public class Conta {
     private double saldo;
     public String toString() {
        return " saldo = " + this.saldo;
     }
     public String toString(String prefixo) {
        return prefixo + ": " + toString();
     }
   }

   Exemplo de uso:
   Conta c = new Conta(100);
   c.toString(); ou
   c.toString(“Conta número X”);

Sobrecarga e Sobreposição     ©2012 Ludimila Monjardim Casagrande   5
Sobrecarga de Métodos

     Para que seja permitida a sobrecarga, os nomes
         dos métodos devem ser iguais mas as
         assinaturas devem ser diferentes.

     Duas assinaturas idênticas não são permitidas.
     A assinatura de um método é composta por seu
         nome e pelo número e tipos de argumentos que
         são passados para esse método,
         independentemente dos nomes das variáveis
         usadas na declaração do método.
Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   6
Exemplo
 public class Data {
     private int dia;
     private int mes;
     private int ano;
     public Data(int dia, int mes, int ano) {          Como todos os argumentos são do
       this.dia = dia;                                 mesmo tipo, somente a inversão do
                                                       nome das variáveis não é suficiente
       this.mes = mes;
                                                       para que esses dois construtores
       this.ano = ano;                                 sejam considerados diferentes.
     }
     public Data(int mes, int dia, int ano) {
       this.dia = dia;                                 Esse código, portanto, geraria um
       this.mes = mes;                                 erro de compilação “método
                                                       duplicado na classe Data”.
       this.ano = ano;
     }
 }
Sobrecarga e Sobreposição        ©2012 Ludimila Monjardim Casagrande                         7
Sobrecarga de Métodos

     O tipo de retorno do método não é considerado
         parte da assinatura.
     Sendo assim, não podemos ter dois métodos
         com o mesmo nome e com o mesmo número e
         tipos de argumentos, mas apenas com o tipo de
         retorno diferente.




Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   8
Exemplo

     Na classe Data declarada anteriormente não seria
         possível a declaração dos dois métodos abaixo, pois
         suas assinaturas são idênticas, eles só diferem quanto
         ao tipo de retorno, que não é considerado parte da
         assinatura do método:
             public String getData( ) {           public Date getData( ) {
               return toString( );                      Date d = new Date( );
             }                                          d.setDate(dia);
                                                        d.setMonth(mes);
                                                        d.setYear(ano);
                                                        return d;
                                                    }
Sobrecarga e Sobreposição       ©2012 Ludimila Monjardim Casagrande             9
Sobrecarga de Métodos

     A decisão sobre qual método será chamado quando
         existirem dois ou mais métodos com o mesmo nome
         será feita pelo compilador, que verificará se os tipos
         passados como argumentos casam com alguma das
         assinaturas daquele método.
     Supondo que os argumentos sejam de tipos diferentes,
         a ordem em que aparecem também é relevante, isto é:
           public Data(int dia, String mes, long ano) 
           public Data(String mes, int dia, long ano)



Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   10
Exemplo
public class Data{                                   public static void main(String[] args){
  private int dia;
                                                            Data d1 = new Data(1, “maio", 2004);
  private String mes;
  private long ano;                                         Data d2 = new Data(“maio", 1, 2004);
  public Data(int dia, String mes, long ano){               System.out.println(d1);
    this.dia = dia;
                                                            System.out.println(d2);
    this.mes = mes;
    this.ano = ano;                                     }
  }                                                 }
  public Data(String mes, int dia, long ano){
    this.dia = dia;
    this.mes = mes;                                         Exemplo de sobrecarga válida.
    this.ano = ano;
  }
  public String toString(){
    return dia + " de " + mes + " de " + ano;
  }
Sobrecarga e Sobreposição      ©2012 Ludimila Monjardim Casagrande                             11
Sobrecarga de Métodos

     Ao verificar se há casamento entre os
         argumentos passados e as assinaturas dos
         métodos, o compilador considera todas as
         possibilidades de conversões implícitas.
     Sendo assim, se o valor do argumento passado
         for, por exemplo, do tipo char e o argumento
         declarado na assinatura do método é do tipo int,
         então, esse valor passado será aceito, pois é
         possível fazer uma conversão implícita de char
         para int.

Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   12
Conversões Implícitas Válidas

     As conversões implícitas válidas entre os tipos
         primitivos do Java são:



                        char
                                      int                long          float   double
     byte              short


                  Os elementos á direita da seta recebem os elementos à esquerda.




Sobrecarga e Sobreposição        ©2012 Ludimila Monjardim Casagrande                    13
Outras Conversões Implícitas Válidas

     Conversões implícitas válidas entre classes,
         subclasses, interfaces e sub-interfaces

                              TipoRecebido é uma               TipoRecebido é uma
                                    classe                          interface

                               TipoRecebido deve ser
         TipoReceptor é uma                                    TipoReceptor deve ser
                                  uma subclasse de
               classe                                                 Object
                                    TipoReceptor

                                 TipoRecebido deve             TipoRecebido deve ser
         TipoReceptor é uma
                                    implementar a               uma sub-interface de
              interface        interface TipoReceptor               TipoReceptor



Sobrecarga e Sobreposição     ©2012 Ludimila Monjardim Casagrande                      14
Tipos para o Exemplo
   public interface Figura {
        public double calcularArea( ) ;
   }

   public class Quadrado extends Object implements Figura {
        double lado;
        public Quadrado(double lado) {
            this.lado = lado;
        }

          public double calcularArea( ) {
             double area = 0;
             area = lado * lado;
             return area;
          }
   }

Sobrecarga e Sobreposição       ©2012 Ludimila Monjardim Casagrande   15
Exemplo de Conversões Implícitas
 public class Principal {
     public static void main(String[ ] args) {
             /* A variável o do tipo Object recebe qualquer objeto
              * que seja de um tipo que estenda Object */
             Object o = new Quadrado(4);

             /* A variável f do tipo Figura (que é uma interface)
              * recebe qualquer objeto que seja de um tipo que
              * implemente Figura */
             Figura f = new Quadrado(2);

             /* Uma variável do tipo Object recebe qualquer
              * variável cujo tipo seja uma interface */
             Object o1 = f;
       }
 }
Sobrecarga e Sobreposição         ©2012 Ludimila Monjardim Casagrande   16
Sobreposição de Métodos

     A sobreposição de métodos (ou overriding)
         ocorre quando há polimorfismo:
                                    Figura                      A implementação do método
                                                                calcularArea() das subclasses
                                                                sobrepõe a implementação
                                 calcularArea()                 do mesmo método na
                                                                superclasse.


                   Quadrado                           Círculo


                calcularArea()                    calcularArea()

Sobrecarga e Sobreposição           ©2012 Ludimila Monjardim Casagrande                         17
Exemplo de Polimorfismo
 public class Figura {
      public double calcularArea( ) {
          return 0;
      }
 }
 public class Quadrado extends Figura {
      double lado;
      public Quadrado(double lado) {
          this.lado = lado;
      }

        public double calcularArea( ) {
           double area = 0;
           area = lado * lado;
           return area;
        }
 }
Sobrecarga e Sobreposição      ©2012 Ludimila Monjardim Casagrande   18
Exemplo de Polimorfismo
  public class Circulo extends Figura {
         double raio;

         public Circulo (double raio) {
            this.raio = raio;
         }

         public double calcularArea( ) {
            double area = 0;
            area = 3.14 * raio * raio;
            return area;
         }
  }



Sobrecarga e Sobreposição      ©2012 Ludimila Monjardim Casagrande   19
Exemplo de Polimorfismo
  public class Main {

      public static void main(String[] args) {

         Figura f1 = new Quadrado(4);

         Figura f2 = new Circulo(2);

         System.out.println("Área da Figura 1 é: "
                            + f1.calcularArea( ) + "n“
                            + "Área da Figura 2 é: "
                            + f2.calcularArea( ));
        }
  }


Sobrecarga e Sobreposição      ©2012 Ludimila Monjardim Casagrande   20
Sobreposição de Métodos

      Existem algumas regras que devem ser
          respeitadas para que a sobreposição seja válida.
      Por exemplo, o método que sobrepõe não deve
          restringir o grau de acessibilidade do método
          sobreposto.

              private       default               protected       public


           um método private pode ser sobreposto por um default
                         e assim sucessivamente

Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande            21
Sobreposição de Métodos

     Para que haja sobreposição, as assinaturas dos
         métodos devem ser idênticas.
     Como o valor de retorno não é considerado parte da
         assinatura, ele pode variar desde que sejam respeitadas
         as regras de conversão entre tipos.
     Exemplo: O método (1) pode sobrescrever o método (2),
         mas o contrário não é verdade:
           public ArrayList teste(ArrayList l) (1)
           public List teste(ArrayList l)                   (2)



Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande    22
Exercícios de Revisão

    1. Para que serve uma interface?
    2. O que é uma classe abstrata?
    3. O que é um método abstrato?
    4. Qual é a diferença entre classes abstratas e
           interfaces?
    5. O que é polimorfismo?
    6. Todos os métodos de uma classe abstrata
           podem ser não abstratos?

Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   23
Exercícios de Revisão

    7. O que significa implementar uma interface? Em
           outras palavras, o que é necessário fazer
           quando uma classe concreta implementa uma
           interface?
    8. Quando uma classe concreta estende uma
           classe abstrata que não contém nenhum
           método abstrato, ela é obrigada a implementar
           algum método? Justifique.
    9. É possível instanciar uma interface? E uma
           classe abstrata?
Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   24
Exercícios de Revisão

    10. Quando uma subclasse implementa um
             método herdado da superclasse, o que está
             acontecendo: overloading ou overriding?
    11. É correto afirmar que uma classe pode
             estender uma interface?
    12. Um interface pode estender outra interface?
             Isto é, há herança entre interfaces?
    13. Há herança múltipla em Java?


Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   25
Bibliografia Sugerida

     Java: Como programar
         Autores: H. M. Deitel e P. J. Deitel
         Editora: Pearson – 6ª Edição

     Complete Java 2 Certification
         Study Guide
         Sybex




Sobrecarga e Sobreposição   ©2012 Ludimila Monjardim Casagrande   26

POO - 18 - Sobrecarga e Sobreposição de Métodos

  • 1.
    Programação Orientada aObjetos Sobrecarga e Sobreposição de Métodos Ludimila Monjardim Casagrande 2012
  • 2.
    Sobrecarga de Métodos  A sobrecarga de métodos, também conhecida como overloading, ocorre quando criamos dois ou mais métodos com o mesmo nome mas com uma lista de argumentos diferente.  A sobrecarga está sendo aplicada, por exemplo, quando são declarados dois construtores para uma mesma classe, sendo um sem parâmetros e outro com parâmetros. Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 2
  • 3.
    Exemplo de Sobrecargade Construtor public class Conta { private double saldo; public Conta () { } public Conta (double saldo) { this.saldo = saldo; } } Podemos, então, criar objetos dessa classe de dois modos: Conta c = new Conta(); ou Conta c = new Conta(100);  inicializando o saldo com algum valor Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 3
  • 4.
    Sobrecarga de Métodos  A sobrecarga também é aplicada para os outros métodos que não sejam construtores.  Em algumas situações, é útil poder executar um método em uma classe passando mais ou menos argumentos, conforme a necessidade.  Também pode ser necessário fazer a sobrecarga de um mesmo método, com o mesmo número de argumentos, porém variando os tipos desses argumentos. Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 4
  • 5.
    Exemplo de Sobrecargade Método public class Conta { private double saldo; public String toString() { return " saldo = " + this.saldo; } public String toString(String prefixo) { return prefixo + ": " + toString(); } } Exemplo de uso: Conta c = new Conta(100); c.toString(); ou c.toString(“Conta número X”); Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 5
  • 6.
    Sobrecarga de Métodos  Para que seja permitida a sobrecarga, os nomes dos métodos devem ser iguais mas as assinaturas devem ser diferentes.  Duas assinaturas idênticas não são permitidas.  A assinatura de um método é composta por seu nome e pelo número e tipos de argumentos que são passados para esse método, independentemente dos nomes das variáveis usadas na declaração do método. Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 6
  • 7.
    Exemplo public classData { private int dia; private int mes; private int ano; public Data(int dia, int mes, int ano) { Como todos os argumentos são do this.dia = dia; mesmo tipo, somente a inversão do nome das variáveis não é suficiente this.mes = mes; para que esses dois construtores this.ano = ano; sejam considerados diferentes. } public Data(int mes, int dia, int ano) { this.dia = dia; Esse código, portanto, geraria um this.mes = mes; erro de compilação “método duplicado na classe Data”. this.ano = ano; } } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 7
  • 8.
    Sobrecarga de Métodos  O tipo de retorno do método não é considerado parte da assinatura.  Sendo assim, não podemos ter dois métodos com o mesmo nome e com o mesmo número e tipos de argumentos, mas apenas com o tipo de retorno diferente. Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 8
  • 9.
    Exemplo  Na classe Data declarada anteriormente não seria possível a declaração dos dois métodos abaixo, pois suas assinaturas são idênticas, eles só diferem quanto ao tipo de retorno, que não é considerado parte da assinatura do método: public String getData( ) { public Date getData( ) { return toString( ); Date d = new Date( ); } d.setDate(dia); d.setMonth(mes); d.setYear(ano); return d; } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 9
  • 10.
    Sobrecarga de Métodos  A decisão sobre qual método será chamado quando existirem dois ou mais métodos com o mesmo nome será feita pelo compilador, que verificará se os tipos passados como argumentos casam com alguma das assinaturas daquele método.  Supondo que os argumentos sejam de tipos diferentes, a ordem em que aparecem também é relevante, isto é:  public Data(int dia, String mes, long ano)   public Data(String mes, int dia, long ano) Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 10
  • 11.
    Exemplo public class Data{ public static void main(String[] args){ private int dia; Data d1 = new Data(1, “maio", 2004); private String mes; private long ano; Data d2 = new Data(“maio", 1, 2004); public Data(int dia, String mes, long ano){ System.out.println(d1); this.dia = dia; System.out.println(d2); this.mes = mes; this.ano = ano; } } } public Data(String mes, int dia, long ano){ this.dia = dia; this.mes = mes; Exemplo de sobrecarga válida. this.ano = ano; } public String toString(){ return dia + " de " + mes + " de " + ano; } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 11
  • 12.
    Sobrecarga de Métodos  Ao verificar se há casamento entre os argumentos passados e as assinaturas dos métodos, o compilador considera todas as possibilidades de conversões implícitas.  Sendo assim, se o valor do argumento passado for, por exemplo, do tipo char e o argumento declarado na assinatura do método é do tipo int, então, esse valor passado será aceito, pois é possível fazer uma conversão implícita de char para int. Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 12
  • 13.
    Conversões Implícitas Válidas  As conversões implícitas válidas entre os tipos primitivos do Java são: char int long float double byte short Os elementos á direita da seta recebem os elementos à esquerda. Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 13
  • 14.
    Outras Conversões ImplícitasVálidas  Conversões implícitas válidas entre classes, subclasses, interfaces e sub-interfaces TipoRecebido é uma TipoRecebido é uma classe interface TipoRecebido deve ser TipoReceptor é uma TipoReceptor deve ser uma subclasse de classe Object TipoReceptor TipoRecebido deve TipoRecebido deve ser TipoReceptor é uma implementar a uma sub-interface de interface interface TipoReceptor TipoReceptor Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 14
  • 15.
    Tipos para oExemplo public interface Figura { public double calcularArea( ) ; } public class Quadrado extends Object implements Figura { double lado; public Quadrado(double lado) { this.lado = lado; } public double calcularArea( ) { double area = 0; area = lado * lado; return area; } } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 15
  • 16.
    Exemplo de ConversõesImplícitas public class Principal { public static void main(String[ ] args) { /* A variável o do tipo Object recebe qualquer objeto * que seja de um tipo que estenda Object */ Object o = new Quadrado(4); /* A variável f do tipo Figura (que é uma interface) * recebe qualquer objeto que seja de um tipo que * implemente Figura */ Figura f = new Quadrado(2); /* Uma variável do tipo Object recebe qualquer * variável cujo tipo seja uma interface */ Object o1 = f; } } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 16
  • 17.
    Sobreposição de Métodos  A sobreposição de métodos (ou overriding) ocorre quando há polimorfismo: Figura A implementação do método calcularArea() das subclasses sobrepõe a implementação calcularArea() do mesmo método na superclasse. Quadrado Círculo calcularArea() calcularArea() Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 17
  • 18.
    Exemplo de Polimorfismo public class Figura { public double calcularArea( ) { return 0; } } public class Quadrado extends Figura { double lado; public Quadrado(double lado) { this.lado = lado; } public double calcularArea( ) { double area = 0; area = lado * lado; return area; } } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 18
  • 19.
    Exemplo de Polimorfismo public class Circulo extends Figura { double raio; public Circulo (double raio) { this.raio = raio; } public double calcularArea( ) { double area = 0; area = 3.14 * raio * raio; return area; } } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 19
  • 20.
    Exemplo de Polimorfismo public class Main { public static void main(String[] args) { Figura f1 = new Quadrado(4); Figura f2 = new Circulo(2); System.out.println("Área da Figura 1 é: " + f1.calcularArea( ) + "n“ + "Área da Figura 2 é: " + f2.calcularArea( )); } } Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 20
  • 21.
    Sobreposição de Métodos  Existem algumas regras que devem ser respeitadas para que a sobreposição seja válida.  Por exemplo, o método que sobrepõe não deve restringir o grau de acessibilidade do método sobreposto. private default protected public um método private pode ser sobreposto por um default e assim sucessivamente Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 21
  • 22.
    Sobreposição de Métodos  Para que haja sobreposição, as assinaturas dos métodos devem ser idênticas.  Como o valor de retorno não é considerado parte da assinatura, ele pode variar desde que sejam respeitadas as regras de conversão entre tipos.  Exemplo: O método (1) pode sobrescrever o método (2), mas o contrário não é verdade:  public ArrayList teste(ArrayList l) (1)  public List teste(ArrayList l) (2) Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 22
  • 23.
    Exercícios de Revisão 1. Para que serve uma interface? 2. O que é uma classe abstrata? 3. O que é um método abstrato? 4. Qual é a diferença entre classes abstratas e interfaces? 5. O que é polimorfismo? 6. Todos os métodos de uma classe abstrata podem ser não abstratos? Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 23
  • 24.
    Exercícios de Revisão 7. O que significa implementar uma interface? Em outras palavras, o que é necessário fazer quando uma classe concreta implementa uma interface? 8. Quando uma classe concreta estende uma classe abstrata que não contém nenhum método abstrato, ela é obrigada a implementar algum método? Justifique. 9. É possível instanciar uma interface? E uma classe abstrata? Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 24
  • 25.
    Exercícios de Revisão 10. Quando uma subclasse implementa um método herdado da superclasse, o que está acontecendo: overloading ou overriding? 11. É correto afirmar que uma classe pode estender uma interface? 12. Um interface pode estender outra interface? Isto é, há herança entre interfaces? 13. Há herança múltipla em Java? Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 25
  • 26.
    Bibliografia Sugerida  Java: Como programar Autores: H. M. Deitel e P. J. Deitel Editora: Pearson – 6ª Edição  Complete Java 2 Certification Study Guide Sybex Sobrecarga e Sobreposição ©2012 Ludimila Monjardim Casagrande 26