Consulta sobre clases Abstractas
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.
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.
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
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
