Contenido de certificación
Buscar
Social
Ofertas laborales ES
« Genéricos y Colecciones. Parte 2: Colecciones | Main | Clases Envoltorio y Boxing »
viernes
nov112011

Orientación a Objetos (Object Orientation) II - Sobrescritura de métodos

Continuando con la revisión de todos los conceptos necesarios de orientación a objetos en Java para aplicarlos no sólo en dar el examen de certificación sino en el diario vivir empezamos con los siguientes temas relacionados (El post precedente de éste tema lo encuentras acá)

Overriding (Sobrescritura de métodos)
Cuando haces uso de herencia tienes la posibilidad de sobrescribir los métodos de la clase padre (si y solo si no están marcados como final); el uso de la sobrescritura es definir un comportamiento particular de un método en una subclase.

public class Animal {

	/**
	 * Metodo de la clase base
	 */
	public void doSound(){
		System.out.println("animal sound");
	}	
}

class Cat extends Animal {
	
	/**
	 * Metodo sobreescrito (override)
	 */
	@Override
	public void doSound() {
		System.out.println("meow");
	}	
		
}

Como se puede ver en el ejemplo anterior, la clase Cat hereda de Animal pero le da un comportamiento particular en el método doSound, lo cual es el objetivo del polimorfismo y la sobrescritura de métodos, que una subclase pueda definir un comportamiento propio.

Si ejecutamos el codigo

        public static void main(String[] args){
		new Cat().doSound();
	}

El resultado sera "meow" ya que el sobrescribir el método al momento de ejecutar el programa, la JVM ignora la implementacion de la superclase y ejecuta el método de la clase heredada que implementa su comportamiento propio.

Las reglas para la sobrescritura (overriding) de un método son las siguientes:

  • Debe tener los mismos parámetros que el método base, de lo contrario es una sobrecarga (overload)
  • El tipo de retorno debe ser el mismo o una subclase del tipo declarado en el método base
  • El nivel de acceso no puede ser menor al declarado en el método base
  • El nivel de acceso puede ser mayor al declarado en el método base
  • Los métodos de instancia solo pueden ser sobrescritos solo si son heredados por una subclase
  • Una subclase dentro del mismo paquete puede sobrescribir cualquier método que no este declarado como private o final
  • Una subclase fuera del paquete puede sobrescribir solo métodos public o protected que no esten marcados como final
  • El método sobrescrito puede lanzar cualquier runtime exception (unchecked exception) sin importar que el método base la haya declarado o no (Por ejemplo ClassCastException)
  • El método sobrescrito no puede lanzar checked exceptions que no sean subclase de la declarada en el método base (Si el metodo base lanza un IOException, el método sobrescrito puede lanzar cualquier cantidad de excepciones que sean subclases de IOException)
  • El método sobrescrito puede lanzar menos excepciones que el método base
  • No se puede sobrescribir un método marcado como final
  • No se puede sobrescribir un método static
  • Si un método no puede ser heredado, no puede ser sobrescrito (Métodos privados)

 

La sobrecarga de métodos es opcional, pero cuando heredamos de una clase abstracta ésta nos obliga a implementar todos sus métodos (Y aunque quizás no parezca sobrescritura, lo es), por lo cual podemos inferir que la implementación de una clase abstracta es tener uno o más métodos que deben sobrescritos si o si.

Ejecutando el metodo base

En algunos casos no queremos sobrescribir completamente lo que hace un método, sino mas bien agregar funcionalidad a lo que hace ya un método base, por lo que es necesario invocar el método de la superclase y luego agregar algo personalizado, para lograr este objetivo se hace a través de la palabra reservada super:

public class Animal {

	/**
	 * Metodo de la clase base
	 */
	public void doSound(){
		System.out.println("brrrr");
	}	
	
	public static void main(String[] args){
		new Cat().doSound();
	}	
}

class Cat extends Animal {
	
	/**
	 * Metodo sobrescrito (override)
	 */
	@Override
	public void doSound() {
		super.doSound();
		System.out.println("meow");
	}	
	
}

El resultado de ejecutar el código precedente es:
brrrr
meow

Para las preguntas de la certificación es importante recordar las reglas antes mencionadas para tener claras todas las variantes y no caer en las preguntas trampa del examen.

Preguntas típicas de examen respecto a esta materia.

 ¿Cuál sería la salida del siguiente programa?

package es.javahispano;

public class Animal {

    public String saluda() {
        return "Hola, ¡soy un animal!";
    }

    public static void main(String args[]) {
        Animal animal = new Animal();
        Gato gato = new Gato();
        Perro perro = new Perro();
        System.out.println(gato.saluda());
        System.out.println(perro.saluda());
        System.out.println(animal.saluda());
        System.out.println(((Animal)gato).saluda());
        System.out.println(((Animal)perro).saluda());        
    }

}

class Perro extends Animal {

    public String saluda() {
        return "Hola, ¡soy un perro!";
    }

}

class Gato extends Animal {

    public String saluda() {
        return "Hola, ¡soy un gato!";
    }
}

La respuesta es:

Hola, ¡soy un gato!
Hola, ¡soy un perro!
Hola, ¡soy un animal!
Hola, ¡soy un gato!
Hola, ¡soy un perro!

Porque en tiempo de ejecución, la JVM es capaz de conocer qué tipo de clase está en memoria en ese momento, y, consecuentemente, qué metodo llamar.

 Más cosas a tener en cuenta sobre preguntas relativas a esta cuestión

En esta parte, nos pueden caer preguntas como las siguientes:

  • Pregunta trampas.

Por ejemplo:

package sobreescritura;

public class Padre {

    private void hola(){
        System.out.println("Hola soy el padre");
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        Padre padre = new Padre();
        Hijo hijo = new Hijo();
        padre.hola();
        hijo.hola();
    }

}

class Hijo extends Padre{
    
    public void hola(){
        System.out.println("Hola soy el hijo");
    }
    
}

La pregunta es, ¿existe sobreescritura de métodos? La respuesta es que no, porque el método la clase hija no tiene noción del método de la clase padre, al ser este de caracter privado.

 

Reader Comments (1)

The cheap lebron 9 offers everything that new rose shoes needs to be one of the best guards

in the NBA.The signature shoe of Derrick Rose new kobe 7 shoes 2012 offers you an unbelievably lightweight shoe while providing

the stability you need to slash and dish your way through any opponents lineup.Be faster in the Derrick Rose Shoes from NBA All Star Shoesnew lebron 9 shoes 2012 Online Store.tincidunt vel, mollis in, eros. Ut ante magna, ornare eget, malesuada vitae, faucibus at,

justo. Duis tincidunt dolor vel sapien. Integer convallis tincidunt metus. Quisque elementum urna nec felis. new basketball shoes

2012 Pellentesque auctor eros in nibh. Phasellus adipiscing congue tortor. Etiam elementum sapien et dolor

mayo 26, 2012 | Unregistered Commentergf

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>