La herencia es una de las características más importantes de la POO. Si definimos una serie de atributos y métodos para una clase, al crear la subclase, todos estos atributos y métodos siguen siendo válidos.
Es como crear una clase Pajaros que es subclase Animal. Luego se crea la clase Gorrion que es subclase de Pajaros. Entonce hereda todos sus atributos y métodos.
Una clase abstract es aquella que no va a tener instancias de forma directa, aunque si habŕa instancias de la subclases. Por ejemplo si creas la clase Animal como abstracta no se podrán crear objetos de la clase Animal (Animal mascota = new Animal() ).
Para crear en java una subclase de otra clase existente se utiliza la palabra reservada extends. Ver ejemplo animal, con subclases gato, pingüino y ave.
Si crearemos un gato desde programa principal de esta forma:
Gato gato = new Gato();
Entonce el constructor se llamaria así:
public Gato(){
super(Sexo.Hembra);
raza =”siamés”;
}
Pero si creamos el gato de esta forma:
Gato gato = new Gato(Sexo.Macho, “siberiano”);
El constructor se llamaria de este modo:
public Gato(Sexo s, String r){
super(s);
raza = r;
}
El método super() hace llamada al método equivalente de la superclase.
Un método puede redefinir una subclase. Por ejemplo el método vuela que está definida en la clase Ave se vuelve a definir en la clase Pinguino. En esto casos indicaremos que sobreescribiremos un método mediante la etiqueta @Override. Si no escribiremos esta etiqueta, la sobreescritura del método se realizará de todas formas ya que @Override solo indica una intención.
Ejemplo:
@Override
public void vuela(){
System.out.println(“No puedo volar”);
} //el metodo vuela definido para la clase ave se sobreescribe para la clase pingüino, ya que no puede volar
Polimorfismo es la capacidad que tienen los objetos de distintos tipos (distintas calses) de responder al mismo método.
En determinadas ocasiones nos puede interesar tener atributos de clase (variable de clase) y métodos de clase. Cuando se define una variable de clase solo existe una copia del atributo para toda la clase y no una para cada objeto. Esto es util cuando se quiere llevar la cuenta global de algún parameto. Los métodos de clase se aplican a la clse y no a instancias concretas.
Veamos un ejemplo donde hay una variable de clase kilometrajeTotal. Si bien un coche tiene un atributo km donde se van acumulando los km que va recorriendo, en la variable de clase kilometrajeTotal se lleva al cuenta de los km que han recorrido todos los coches:
public class Coche{
//atributo de clase
private static int kilometrajeTotal = 0;
//método de clase
public static int getkilometrajeTotal(){
return kilometrajeTotal;
}
private String marca;
private String modelo;
private int km;
public Coche(String marca, String modelo){
marca = marca;
modelo = modelo;
km = 0;
}
public int getkm(){
return km;
}
public void recorre(int km){
km += km;
kilometrajeTotal += km;
}
}
Como hemos comentado el atributo kilometrajeTotal almacena el total de km recorrido por los coches, por este se decalara como static.