style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Ayuda con clases abstractas

Primero que nada agradezco por todos los consejos que me dado.

Ya tenía ratito que no posteaba.

Asi que necesito saber como funcionan las clases abstractas, y quisiera ver la posibilidad de que recomendaran un buen libro para estudiar

las clases abstractas o de plano y quien me puede instruir en java.

Ya que la verdad ando muy mal.

Saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Ligas... aquí aquí aquí aquí

Nadie más contesto esto? :-O

Nadie más contesto esto? :-O

Las clases abstractas sirven para definir un comportamiento base y dejar que las subclases definan lo que "hace falta".

Lo contrario a lo abstracto es lo concreto, no? Como tales, las clases abstractas no pueden ser instanciadas. Es decir lo siguiente no es posible:

public abstract class  ClaseAbstracta {
}
...
ClaseAbstracta nueva = new ClaseAbstracta();

Por que no hay nada en concreto.

Cuando se hereda de una clase abstracta, se deben de implementar los métodos abstractos que esa clase defina ( de lo contrario la clase seguirá siendo abstracta )

public abstract class Saludador {
  public abstract void saluda();
}
class SaludaEnLineaDeComandos extends Saludador {
   public void saluda() {
      System.out.println("Hola"); // saluda en la linea de comandos
   }
}
class SaludaPorRed extends Saludador {
   public void saluda() {
      Socket socket = new Socket("javamexico.org", 80 );
      PrintStream out = new PrintStream(socket.getOutputStream());
      out.println("Hola javamexico");// por cierto hace que el servidor de java mexico nos maldiga ...
     // close resources etc.
    }
}
 

En el ejemplo anterior, la clase saludador, define la operación saluda, pero no dice como se implementa. Las dos subclases, son las encargadas de decir que hacer. Una escribe en la consola y la otra se conecta a un servidor y escribe ahí ( por cierto, eso no funciona de nada, pero ejemplifica).

Ahora, puesto así, no habría mucha diferencia entre una interfaz y una clase abstracta. Lo interesante viene cuando se pone mucho más código en la clase abstracta y se deja el detalle a las subclases. Las interfaces no pueden poner código pero lo siguiente si es válido:

class Dato {
...
}
public abstract class ValidarDatos {
   private List<Dato> datos;
   public void valida() {
       for( Dato dato : datos ) {
           if( dato.expiro() ) {
               dato.renueva();
           } else {
              dato.calculaAlgo();
           }
       }
       persiste( datos );
    }
    public abstract void persiste( List<Dato> datos );
}

Es este otro ejemplo, la clase "ValidarDatos" tiene el algoritmo general de como se valida un dato. Acá no es relevante para el ejemplo, simplemente digamos que los recorre todos y hace "algo" con ellos. Lo interesante es que al final, el validador los persiste, pero deja abierta la implementación de como persistir esos datos. Las subclases tienen que definir como persistir esos datos, por ejemplo escribiendolos al disco duro, a una base de datos, escribiendolos por la red, transformandolos primero en JSON, XML, o algun otro formato etc. etc. Pero la clase base, ya tiene, definido que hacer con lo importante ( los datos ). Con una interfaz no es posible hacer esto.

Para ver ejemplos del mundo real, se puede echar un ojo a AbtractList de Java que sirve para hacer una implementación de la clase List, sin tener que escribir tooooodo desde cero.

La desventaja ( que viendolo bien , no es una desventaja como tal, sino una característica ) es que, claro, solo se puede heredar de una clase, pero esa ya es otra historia.

Espero que esto te sirva.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">