Foro de elhacker.net

Programación => Java => Mensaje iniciado por: bengy en 20 Marzo 2014, 02:40 am



Título: herencia en java
Publicado por: bengy en 20 Marzo 2014, 02:40 am
que diferencia existe en herencia y clase abstracta???



Título: Re: herencia en java
Publicado por: Mitsu en 20 Marzo 2014, 03:54 am
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
  1. public abstract class Animal {
  2.  
  3. // a diferencia de las interfaces una clase abstracta puede
  4. // contener variables de instancia y metodos no abstractos
  5. String nombre;
  6.  
  7. // las subclases deben implementar este metodo (especializacion)
  8. public abstract void accion();
  9.  
  10. public void setNombre(String nombre) {
  11. this.nombre = nombre;
  12. }
  13.  
  14. public String getNombre() { return nombre; }
  15.  
  16. }
Código
  1. public class Perro extends Animal {
  2.  
  3. // hereda String nombre
  4.  
  5. @Override
  6. public void accion() {
  7. System.out.println("Guarf, Guarf! Grrrrr");
  8. }
  9.  
  10. // hereda los setters y getters
  11. }
Código
  1. public class Gato extends Animal {
  2.  
  3. // hereda String nombre
  4.  
  5. @Override
  6. public void accion() {
  7. System.out.println("Miau, miau...");
  8. }
  9.  
  10. // hereda setters y getters
  11. }

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

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


Título: Re: herencia en java
Publicado por: bengy en 20 Marzo 2014, 05:33 am
si utilizo una clase concreta y la quiero heredar estaria bien ?  me explico con tu ejemplo:

Código:
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; }
 
}


Título: Re: herencia en java
Publicado por: Mitsu en 20 Marzo 2014, 05:48 am
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.