Tutorial Java Básico Herencia


La herencia se encuentra en todos lados en Java, utilizando esta característica de la Programación Orientada a Objetos podemos transmitir atributos y métodos de una clase a otra.

¿Cómo utilizar herencia en Java?

En Java no existe la multi herencia, de tal modo que solo es posible heredar de una sola clase, para hacerlo se debe hacer lo siguiente :

class ClassName extends ParentClass{}

Para hacer herencia en Java se utiliza la palabra reservada extends.

¿Cuándo utilizar herencia?

Uno de los errores más comunes de los desarrolladores es utilizar herencia en un par de clases donde no existe esa relación, entonces, ¿Cuándo utilizar herencia? Debemos utilizar herencia cuando entre un par de clases se cumple la relación ES-UN, veamos algunos ejemplos:

Mal uso

/**
 * @author maagapi
 *
 */
class NoteBook {
}

class Book extends NoteBook {
}

Este es uno de los errores más comunes, en este ejemplo tenemos la clase libro y cuaderno, podríamos pensar que un ambas tiene características similares y pensar que uno puede heredar del otro. Para resolver esta duda tenemos que aplicar la regla ES-UN.

  • Book ES-UN NoteBook : No un libro no es un cuaderno, por eso podemos decir que no existe herencia entre ambos.
/**
 * @author maagapi
 *
 */
class Car {
}

class Bus extends Car {
}

En este ejemplo podríamos tener una confusión similar ya que podríamos pensar que como ambos pueden tener llantas, color, etc. Puede uno heredar del otro, así que para resolver la duda aplicaremos de nuevo la regla ES-UN:

  • Un Bus es un Auto :No ambos son similares pero no podemos decir que un auto bus es un auto, para resolver este caso se podría crear una clase padre llamada LandVehicle, de este modo tanto auto bus como auto podrían heredar de vehículo terrestre.

Buen uso

/**
 * @author maagapi
 *
 */
class Animal {
}

class Dog extends Animal {
}

En este ejemplo se tienen dos clases, Animal es la clase padre y Perro es la clase hija, así que aplicaremos la regla ES-UN:

  • Un Perro es un Animal : La respuesta es si, de tal modo que se puede aplicar herencia sin ningún problema
class Number {
....
}

class Double extends Number {
....
}

Este es un ejemplo que viene en el api de Java, tenemos dos clases la clase Number y la clase Double, así que aplicaremos la regla:

  • Un double es un Number: La respuesta es si, de tal modo que Double puede heredar de Number.

Notas importantes sobre herencia

  • La herencia permite transmitir métodos y atributos de una clase a una sub clase.
  • Solo se heredan los métodos y atributos públicos, protected y default.
  • No se puede heredar de una clase final.
  • Es posible tener múltiples niveles de herencia.
  • Todas las clases en Java son sub clases de Object, aunque no hereden directamente de ella ya que si vamos hacia arriba en el árbol de herencia, eventualmente llegaremos a una clase que no herede de ninguna otra y esa hereda de Object.
  • El operador instanceof devolverá true cuando se utilice una referencia con su clase y todas sus clases padres para más información de instanceof ver Tutorial Java Básico Operador instanceof.

Los libros recomendados para este tema son:

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

Tutorial Java Básico Operador instanceof


La herencia se encuentra en todos lados en Java, en este post se hablará del operador instanceof, este es utilizado sobre referencias y determinará si una referencia apunta a un objeto es de un tipo en especial. Cuando se habla de herencia se habla del operador ES-UN, instanceof será la forma en la que seremos capaces de hacer esta evaluación en java.

Ejemplo


/**
 * @author maagapi
 *
 */
public class InstanceOfExample {
	public static void main(String[] args) {
		String cad = "Hello world !";
		System.out.println(cad instanceof String);
	}
}

Output:

true

Como se puede observar la salida es true, lo cual significa que la referencia cad apunta a un objeto de la clase String, con esto se puede decir que la variable cad ES-UN String.

Operador instanceof en la herencia

El operador instanceof se puede utilizar también para determinar si la referencia es de un super tipo, recordemos que este operador realizará la validación ES-UN

Ejemplo


/**
 * @author maagapi
 *
 */
public class InstanceOfExample {
	public static void main(String[] args) {
		String cad = "Hello world !";
		System.out.println(cad instanceof String);
		System.out.println(cad instanceof Object);
	}
}

Salida:

true
true

Si observamos la salida podremos ver que esta imprime verdadero para ambos casos, lo cual significa que la referencia cad ES-UN String pero también cad ES-UN Object.

Reglas importantes

A continuación se listan algunas de las reglas más importantes al utilizar el operador:

  • instanceof es una palabra reservada, por tanto no se debe utilizar como identificador en las aplicaciones.
  • solo es posible utilizarlo sobre referencias y clases que pertenecen al mismo árbol de herencia, de tal modo que si se trata de hacer lo siguiente resultará en un error de compilación:

/**
 * @author maagapi
 *
 */
public class InstanceOfExample {
	public static void main(String[] args) {
		String cad = "Hello world";
		System.out.println(cad instanceof Integer);
	}
}

Salida:

Incompatible conditional operand types String and Integer
  • Por esto solo es posible utilizar el operador con su clase correspondiente o con alguno de sus super tipos.
  • Si se aplica el operador instanceof a una referencia apuntando a null, sin importar la clase con la que se valide el resultado siempre será false.

Los libros recomendados para este tema son:

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com