herencia en java

Iniciado por .rn3w., 20 Marzo 2014, 02:40 AM

0 Miembros y 1 Visitante están viendo este tema.

.rn3w.

que diferencia existe en herencia y clase abstracta???


Mitsu

Los dos son conceptos de la programación orientada a objetos. Una clase abstracta en Java no se puede instanciar, es por ésto que las clases abstractas, como su nombre lo indica, se usa para 'abstraer' una idea y plasmarla en una clase de forma general. Es por eso, que a las subclases de una clase, se dice que son 'especialistas', ya que ellas implementan los métodos de la clase abstracta y la hacen especialmente funcional para esta clase.

Ej:

Código (=java) [Seleccionar]

public abstract class Animal {

// a diferencia de las interfaces una clase abstracta puede
// contener variables de instancia y metodos no abstractos
String nombre;

// las subclases deben implementar este metodo (especializacion)
public abstract void accion();

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getNombre() { return nombre; }

}

Código (=java) [Seleccionar]

public class Perro extends Animal {

// hereda String nombre

@Override
public void accion() {
System.out.println("Guarf, Guarf! Grrrrr");
}

// hereda los setters y getters
}

Código (=java) [Seleccionar]

public class Gato extends Animal {

// hereda String nombre

@Override
public void accion() {
System.out.println("Miau, miau...");
}

// hereda setters y getters
}


Código (=java) [Seleccionar]

Animal animal = new Animal(); // ERROR. No se puede instanciar una clase abstracta
Animal animal = new Perro(); // OK. Un Perro es un animal, y Perro no es abstracto por lo esto es valido


Código (=java) [Seleccionar]

public void actuar(Animal animal) { // si Animal fuera una interface tambien funcionaria esto
// sea perro o gato, esto se determina en tiempo de ejecucion y llama al metodo accion() correspondiente
animal.accion();
}

.rn3w.

si utilizo una clase concreta y la quiero heredar estaria bien ?  me explico con tu ejemplo:


public class Animal {

// a diferencia de las interfaces una clase abstracta puede
// contener variables de instancia y metodos no abstractos
String nombre;


public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getNombre() { return nombre; }

}

Mitsu

#3
Cualquier clase puedes heredarla, independientemente que sea abstracta o no. Sin embargo, es necesario que antes crear esa clase, tengas en cuenta si es necesario que se instancie ésta clase. Como te dije, una superclase por lo general es una abstracción muy general y las subclases son las que especializan esa abstracción. Así que no tiene mucho sentido instanciar una superclase, aunque quizás en algunos casos si el programador así lo requiere con un fin específico, puede hacerse.

PD: Si tu duda ya fue despejada, por favor marca el tema como solucionado.

Saludos.