POO Overriding(Sobreescritura) vs Overloading(sobrecarga)


Del libro: SCJP Sun Certified Programmer for Java 6 Exam 310-065

Métodos Sobrecargados (Overloaded)

Métodos Sobrescritos (Overridden)

Argumento(s)

Debe cambiar

No debe cambiar

Tipo devuelto
(Return type)

No cambiar.

No cambiar excepto para ‘covariant returns’.

Excepciones

No cambiar.

Se puede reducer o eliminar

No se debe lanzar una nueva excepción o ampliar la existente.

Acceso

No cambiar

Se puede hacer más restrictiva

Invocación

El tipo de referencia determina que versión de sobrecarga (basada en los tipos de argumentos declarados) ha sido seleccionada. Ocurre en tiempo de compilación. El método invocado todavía es una invocación virtual del método, en tiempo de ejecución, pero el compilador sabe la firma del método que es invocado. Así, en tiempo de ejecución, el argumento emparejado ya se habrá llevado a cabo, no solo en la clase en la que el método reside

El tipo de objeto (el tipo de la instancia actual en la Heap) determina que método es seleccionado. Sucede en tiempo de ejecución.

Reglas a seguir para sobrescribir un método:
– La lista de argumentos debe coincidir con el método sobrescrito.
– El tipo devuelto debe ser el mismo, o un subtipo de.
– El acceso no puede ser más restrictivo que el método sobrescrito.
– El acceso puede ser menos restrictivo que el método sobrescrito.
– Las instancias de los métodos puede ser sobrescritos solamente si son herederos de la subclase.
– El método sobrescrito puede lanzar cualquier excepción ‘uncheked’ en tiempo de ejecución.
– El método sobrescrito no debe lanzar excepciones ‘checked’ que son nuevas o mas amplias que las declaradas.
– El método sobrescrito puede lanzar excepciones limitadas o menos excepciones.
– No sobrescribir métodos ‘final’.
– No sobrescribir métodos ‘static’.
– Si un método no puede ser heredado, no se puede sobrescribir.
Los métodos sobrecargados:
– Deben cambiar la lista de argumentos.
– Pueden cambiar el tipo devuelto.
– Pueden cambiar los modificadores de acceso.
– Pueden declarar nuevas excepciones o ampliar las existentes.
– Un método puede ser sobreescrito en la misma clase o en una subclase

Un ejemplo:


package com.codingdojo.pomodoro;
public class Animal {
protected static int cont = 0;
protected int patas;
protected String comida;
protected String sonido;

public Animal(int patas, String sonido) {
this.patas = patas;
this.sonido = sonido;
++cont;
}

public void come(String comida) {
this.comida = comida;
}

public int getCont() {
return cont;
}

public String toString() {
return "Un " + getClass().getName() + " come: " + comida + ", "+ "tiene " + patas + " patas" + ", " + "y " + sonido;
}
}

package com.codingdojo.pomodoro;
public class Horse extends Animal {
public Horse(int patas, String sonido) {
super(patas, sonido);
}

// sobrecarga(overload) de operadores
public void come(String apple, String eno, String salt) {
comida = apple + ", " + eno + ", " + salt;
}
}

package com.codingdojo.pomodoro;
public class Dog extends Animal {
public Dog(int patas, String sonido) {
super(patas, sonido);
}

}

package com.codingdojo.pomodoro;
public class Cat extends Animal {
public Cat(int patas, String sonido) {
super(patas, sonido);
}

// sobreescritura(overridding) de operadores
public void come(String leche) {
comida = "un poco de: " + leche;
}

}

package com.codingdojo.pomodoro;
import java.util.ArrayList;
import java.util.List;

public class AnimalTest {
public static void main(String[] args) {
Animal animal = new Animal(0, "--");
Horse horse = new Horse(4, "relincha");
Dog dog = new Dog(4, "ladra");
Cat cat = new Cat(4, "maulla");

List<Animal> list = new ArrayList<Animal>();
list.add(animal);
list.add(horse);
list.add(cat);
list.add(dog);

for (Animal animalito : list) {
if (animalito instanceof Horse) {
((Horse) animalito).come("manzanas", "eno", "sal");
}else if (animalito instanceof Dog) {
((Dog) animalito).come("pienso");
}else if (animalito instanceof Cat) {
((Cat) animalito).come("Leche");
}else {
animalito.come("lo que puede");
}

System.out.println(animalito.toString());
}

System.out.println("Numero de instacias de Animal: "+animal.getCont());
}
}

Salida de consola:

Un com.codingdojo.pomodoro.Animal come: lo que puede, tiene 0 patas, y --
Un com.codingdojo.pomodoro.Horse come: manzanas, eno, sal, tiene 4 patas, y relincha
Un com.codingdojo.pomodoro.Cat come: un poco de: Leche, tiene 4 patas, y maulla
Un com.codingdojo.pomodoro.Dog come: pienso, tiene 4 patas, y ladra
Numero de instacias de Animal: 4
Anuncios
POO Overriding(Sobreescritura) vs Overloading(sobrecarga)

2 comentarios en “POO Overriding(Sobreescritura) vs Overloading(sobrecarga)

    1. roberthh dijo:

      copia la tabla a word (completa selescciona a la Reglas……. del parrafo de abajo), y ya con eso podras verla completa, tiene que esta la hoja de word en horizontal suerte…. 🙂

Los comentarios están cerrados.