Curiosidades sobre la herencia y los paquetes
jueves, febrero 19, 2009 at 9:09AM En TSS se han hecho eco de una entrada en un blog escrito por Jevgeni Kabanov donde se recoge, según el autor, el "Ultimate Java Puzzler", nombre inspirado en el famoso libro de Bloch y Gafter dedicado a recoger ejemplos de programas Java que al ejecutarse hacen cosas completamente diferentes de las que uno espera.
Es un poco polémico si esto puede considerarse un auténtico "Java Puzzler", ya que el comportamiento que Jevgeni describe en el blog no debería resultar sorprendente a alguien que tenga claro cómo funciona la visibilidad de los paquetes en Java. En el blog se describe el comportamiento de un conjunto de códigos simples donde una clase C1 tiene otra clase hija C2, la cual a su vez es padre de C3, y todas ellas sobreescriben un mismo método. Sin embargo, al invocar el método sobre una instancia de C3 el método concreto que se invoca depende de la visibilidad de los métodos, y de en qué paquetes estén colocadas las clases.
La intuición básica dice que siempre debería ser el método de C3 el que se invoque, pero bajo ciertas condiciones es el método puede no resultar visible al código cliente, mientras que los métodos de los padres si podrían ser visibles. Por otro lado, la propia C3 bajo ciertas condiciones no es capaz de sobreescribir los métodos de sus padres ya que no "puede verlos".
Sea o no un "Java Puzzler", la lectura resulta interesante, y a aquél que no tenga muy claro cómo funciona la visibilidad entre paquetes en Java puede resultarle muy esclarecedor. Por mi parte, la próxima vez que tenga que explicarle a alguien este tema, voy a tomar ideas prestadas de este blog.
j2se 
Reader Comments