Consulta sobre clases Abstractas

molavec
28 de Diciembre del 2009
hola:

Tengo algunas dudas con respecto a este tipo de clases, pues muchas veces he visto que utilizan los métodos abstractos de forma directa sin realizar alguna implementación de esta.


Además, leí por ahí que una clase abstracta no podía tener métodos estáticos (último párrafo de este este texto[link: http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap1/abstr.html]). Sin embargo, los mismo paquetes de java tienen métodos estáticos en clases abstractas:

clase ServerSockeChannel[link:http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/ServerSocketChannel.html] tiene el método open como estático.

En particular, un ejemplo en donde ocupan esta clase sin extenderla se puede encontrar aquí[ link:http://www.javafaq.nu/java-example-code-380.html], más detallado y lo que me complica son estas líneas:

// Create a new channel: if port == 0, FileChannel on /dev/tty, else
// a SocketChannel from the first accept on the given port number

private static ByteChannel newChannel (int netPort)
throws Exception
{
if (netPort == 0) {
FileInputStream fis = new FileInputStream ("/dev/tty");
return (fis.getChannel());
} else {
[B] ServerSocketChannel ssc = ServerSocketChannel.open();[/B] //<--No se me hubiese ocurrido hacer eso jamás!!, pero como open() es estático debería funcionar.
[B] ssc.socket().bind (new InetSocketAddress (netPort));[/B] //<--El método socket es abstracto por lo que según yo no esta implementado y no podría devolver nada (a pesar que en la documentación dice que devuelve un objeto ServerSocket).

System.out.print ("Waiting for connection on port "
+ netPort + "...");
System.out.flush();

ByteChannel channel = ssc.accept();
ssc.close();
System.out.println ("Got it");

return (channel);
}
}



A pesar de los comentarios anteriores los probé y el programa se ejecuto sin problemas!!!


En una frase les digo: EXIJO UNA EXPLICACIÓN!!!

PD: no es la primera ves que veo que ocurre esto, pero en ningún tutorial, manual o libro de java lo explican. Es más, enfatizan en que se deben extender las clases antes de usar las.

kool_084
28 de Diciembre del 2009
Pues en realidad no es del todo cierto lo que dices, estas muy en lo correcto de que no debe funcionar si no esta instanciado, y asi es si no estuviera instanciado no funcionaria jamas, ahora el echo de hacer

ServerSocketChannel.open();

esta linea crea una instancia de ServerSocketChannel la cual ya tiene sobreescritos los metodos abstractos, aunque si vas navegando vas a seguir encontrandote metodos absatractos, en realidad explicarlo es un poco engorroso, normalmente esto no te lo van a decir en un manual o libro, esto se encuentra en la documentacion oficial de JAVA, como recomendacion para que aclares tu duda te recomendaria bajar la documentacion completa y detallada y repasar el/los casos que te cuasen confucion, espero te sirva de ayuda, Suerte