Sobrecarga de métodos

  • La sobrecarga de métodos ocurre cuando existen varias firmas del método con el mismo nombre, pero distintos tipos de parámetro
  • Se permite también que haya diferentes modificadores de acceso, especificadores (como static), tipos de retorno, y listas de excepción.
  • Siempre es necesario que existan cambios en la lista de parámetros: tipo diferente, más tipos, o los mismos tipos en orden distinto:
    • public void coche(int Kilometros) {}
      public void coche(short Ruedas) {}
      public boolean coche() {return false;}
      public int coche(int Millas) {} // No compila, mismo parámetro que linea 1
  • En el caso de que un parámetro sea vararg, hay que recordar que se compila como un array, por lo que no se puede considerar sobrecarga de métodos:
    • public void coche(int[] dimensiones) {}
      public void coche(int... dimensiones) {} // No compila
  • Si se crea un método sobrecargado para un parámetro que incluya una clase wrapper (o envoltorio), Java utilizará en primer lugar aquella que no necesite hacer autoboxing del parámetro:
    • Ejemplo: suponiendo la llamada coche(3);
      • public void coche(int Millas) {}
        • Da prioridad a este método, porque no necesita hacer autoboxing para llamarlo
      • public void coche(Integer Millas) {}
        • Si sólo existiese este método, y no el anterior, lo llamaría realizando autoboxing
  • Tipos por referencia: Java escogerá la versión más específica para el objeto que se pasa como parámetro.
    • Ejemplo:
      • public void coche(Object o);
      • public void coche(String s);
        • Si el parámetro es ”Prueba”, escogerá el segundo método. Si el parámetro es 43, escogerá el primer método
  • Cuando se trabaja con datos primitivos, Java escogerá el método más específico
    • Ejemplo:
      • public void coche(int i);
      • public void coche(long l);
        • Si el parámetro es 123, llamará al primer método; si el parámetro es 123L, llamará al segundo método
  • El orden en el que Java prioriza los métodos sobrecargados es el siguiente:
    1. Coincidencia exacta por tipo
    2. Tipo primitivo más grande
    3. Tipo autobox
    4. Varargs
    • Si el compilador no encuentra un método coincidente, el compilador indica una situación de error:
      Error: no suitable method found for miMetodo(tipoDato)
    • En caso de que dos o más métodos sobrecargados puedan resolver la llamada, se genera una situación de ambigüedad, con el consiguiente error
      Error: reference to miMetodo(tipoDato) is ambigous
  • Precaución: Java únicamente realiza una única conversión de tipo para ajustarse al método más conveniente. Si no encuentra un método realizando una única conversión, lanza un error. Ejemplo:
    • public static void Dale(Long l) {}
      public static void Dale(Long... l) {}
      • La llamada Dale(4) daría un error de compilación, puesto que al tratarse de un int, primero realiza la conversión a long, y posteriormente debería realizar una segunda conversión a Long
      • La llamada Dale(4L) sería correcta
static), tipos de retorno, y listas de excepción.
  • Siempre es necesario que existan cambios en la lista de parámetros: tipo diferente, más tipos, o los mismos tipos en orden distinto:
    • public void coche(int Kilometros) {}
      public void coche(short Ruedas) {}
      public boolean coche() {return false;}
      public int coche(int Millas) {} // No compila, mismo parámetro que linea 1
  • En el caso de que un parámetro sea vararg, hay que recordar que se compila como un array, por lo que no se puede considerar sobrecarga de métodos:
    • public void coche(int[] dimensiones) {}
      public void coche(int." data-share-imageurl="" style="position:fixed;bottom:0px;left:0px;">