Historia del Lenguaje Java
Sus Creadores
Ventajas
Desventajas
Maquina Virtual de Java
Tipos de datos
Control de Flujo
Palabras reservadas
Instanciar una clase
Inicializar un objeto
Eliminar objetos
Declarar clases
En 1990, la empresa Sun Microsystems, tras el abandono del proyecto NeWS (Network/extensible Window System), decide crear un pequeño grupo de programadores cuyo objetivo es desarrollar un nuevo lenguaje destinado al campo de la electrónica de consumo, especialmente electrodomésticos. Este proyecto se conocía como Green Project. A la cabeza del grupo se encontraba el programador James Goslin.
A diferencia de la mayoría de otros lenguajes de programación, los creadores de Java no tenían en mente la creación de un lenguaje para ser utilizado por desarrolladores de software. El desarrollo de este sistema en principio tenía que ser un lenguaje empleado para programar los componentes electrónicos de diversos electrodomésticos, como por ejemplo, aparatos de aire acondicionado. Inicialmente, el lenguaje creado por los ingenieros de Sun James Gosling, Patrick Naughton, Chris Warth, Ed Frank y Mike Sheridan, llevaba el nombre de "Oak", en honor a un árbol que se veía desde la ventana de su oficina. Al tiempo que Oak maduraba, la World Wide Web se encontraba en su período crítico de crecimiento y el equipo de desarrollo de Sun se dio cuenta de que Oak era perfectamente adecuado para la programación en Internet. Este nuevo lenguaje se creó como una extensión del C++, ya dominado por muchos programadores, y dieron un énfasis verdaderamente sorprendente en la programación orientada a objetos (OOP), que sin duda tiene que ser dominada para poder programar en Java.
Java hubiese quedado reducido a un lenguaje para programar los chips de diversos electrodomésticos si no hubiese sido por una fuerza emergente que empezó a dar sus primeros pasos, también a principios de los años 90: la World Wide Web (WWW). Esta red mundial, además de proporcionar información "estática" en forma de texto transmitido a través del protocolo HTML, también exigía la transmisión de programas portables independientes de la plataforma.
En 1993, tras un fracaso del proyecto, Sun se centra en el desarrollo de sistemas de televisión interactiva y en el lenguaje Oak. En esta época, aparece Mosaic y la World Wide Web comienza su transición al modo gráfico. Patrick Naughton, otro miembro del equipo, pone en libre distribución por la red el lenguaje Oak. Java estaba a punto de nacer.
Se crea la primera aplicación para un ordenador personal, un browser para HTML, que demostraría toda la potencia de este nuevo lenguaje. En el se podría visualizar el primer applet Java que se escribió: Duke, la mascota de Java, agitando la mano.
Debido a que el nombre de “Oak” era muy parecido al de otro producto, se decidió cambiarle el nombre a “Java” esto en enero de 1995.
Tras una supuesta estancia en una cafetería, James Goslin estableció el nombre definitivo para el lenguaje: Java, que es café en argot americano y el 23 de Mayo de 1995, Sun Microsystems anuncia formalmente la aparición del nuevo lenguaje de programación Java y de Hot Java, un navegador para éste desarrollado con el mismo lenguaje.
También en mayo de 1995 Sun le da licencia a Netscape para el uso de java en sus navegadores. A finales del 1995, Netscape y Sun anuncian Javascript, un lenguaje basado en java el cual fue diseñado para personas no programadoras. En los primeros seis meses de 1996 existían ya un gran número de compañías líderes, tanto de software como de hardware, con licencia de Sun de la tecnología Java. Entre ellas podríamos incluir Adobe, Asymetrix, Borland, IBM, Macromedia, Microsoft, Novell, Oracle, Spyglass y Symantec. Estas y otras licencias de Java, incorporan a Java en sus productos de escritorio, sistemas operativos y otras herramientas de desarrollo. Java es, por encima de todo, un lenguaje de programación. Pero sus características le están convirtiendo en la piedra angular de lo que puede ser la gran revolución en el mundo informático: acabar con el dominio de Microsoft y su sistema operativo Windows.
El lenguaje Java es un lenguaje lo bastante potente para desarrollar aplicaciones en cualquier ámbito, sin perder de vista que el contexto de Internet donde se ha desarrollado le dota de una potencia adicional.
A pesar de que mucha gente pueda creer que Java es un lenguaje para programar en Internet, nada más lejos de la realidad pues es un lenguaje de propósito general con el que se puede escribir desde un applet para una página Web hasta una aplicación financiera en modo texto sin ninguna conexión a Internet. Y así fue; en menos de ocho años, desde su creación en Sun Microsystems, Java se ha transformado en un lenguaje utilizado por millones de programadores en todo el mundo, gracias a su portabilidad, potencia, seguridad y estabilidad.
Bill Joy uno de los co-fundadores de Sun microsystems vio la oportunidad de que este proyecto entrara en el emergente Internet, su idea fue la de liberar java de forma gratuita, de tal forma que al regalarlo para uso no comercial, este se convertiría en estándar por el amplio uso.
El objetivo principal de Java, era conseguir un entorno de desarrollo de software que fuera independiente de la plataforma de ejecución. Inicio de esta pagina
Inicio de esta pagina
Pocos lenguajes de programación han despertado tanto interés como Java y, al mismo tiempo, son pocos los lenguajes que han contribuido a redefinir, en la misma medida que Java, el concepto de programa y aquello que los programadores pueden hacer. Mientras que la utilización de los programas creados con otros lenguajes se limita a cierta plataforma, Java es un lenguaje que no depende del tipo de plataforma que emplea. Si bien resulta necesario examinar todo el software que se recupera de Internet para verificar si puede trasmitir algún virus al sistema Cliente (o bien cabe confiar en la empresa que escribió dicho software). Java es un lenguaje que ha sido diseñado para escribir programas que puedan transferirse y ejecutarse con total seguridad.
Antes de que Java entrara en escena, el software se comercializaba en una caja, había que alojarlo permanentemente en el disco duro, ver que funcionara en la red y proceder a actualizarlo una y otra vez. Ahora bien, los programas creados en Java pueden simplemente hacer una breve y cordial visita al sistema Cliente desde la red. Una vez utilizados, abandonan el sistema. Siempre están actualizados y se comunican perfectamente con la red. Por si su independencia del tipo de plataforma que utilizan, así como sus interesantes presentaciones aplicadas a la red fueran poco, Java presenta los beneficios que supone la orientación a objetos y el encadenamiento múltiple. Estas características, permiten al código emular con mayor exactitud los problemas del mundo real que se desean resolver. Por otra parte el lenguaje es dinámico, los pequeños fragmentos de código Java se ensamblan en tiempo de ejecución en el programa y no en el momento en el que se escribe el código.
La ausencia del preprocesador: El preprocesador lleva acabo sustituciones globales en el código antes de pasarlo por el compilador. Esto hace que el compilador tenga que vérselas con una serie de elementos de código totalmente distintos a los escritorios originalmente, y la persona responsable de meter dicho código debe descubrir que es lo que esta haciendo el preprocesador. Los diseñadores de Java consideraron que el preprocesador transformaba demasiado el código, de modo que lo desecharon del proyecto
Sin archivos make ni enlace de librerías: Cuando se programa en C o en C++, a menudo uno de los retos mas importantes de un archivo make, un pequeño programa que indica al compilador como construir el archivo ejecutable. Por lo general, el código fuente esta distribuido en diversos archivos y requiere el uso de librerías de código que ya hayan sido compiladas.
El propósito del archivo make consiste en garantizar que la información adecuada llegue al preprocesador; el código fuente que no haya cambiado no sea compilado innecesariamente y que la librería este enlazada correctamente
Java se ocupa del propósito inicial del archivo make, eliminando el preprocesador. El segundo propósito se observa directamente en el compilador.
Java es un lenguaje dinámico. La maquina virtual de java enlaza los programas java en tiempo de ejecución, eliminando la necesidad de enlazarlos con las librerías en tiempo de compilación
Eliminación del acceso directo a memoria y de la aritmética de punteros: En C y en C++, un puntero es un entero que representa una dirección de la memoria en el ordenador, Cuando se utiliza los punteros en programas creados en C o en C++, se esta indicando al ordenador que localice la dirección de memoria especifica y que utilice su contenido.
He aquí parte de la herencia de C como lenguaje de programación de sistemas. En tareas de programación de bajo nivel para una plataforma especifica, este lenguaje resulta muy útil. Pero en la programación de alto nivel, esta practica de programación no es adecuada y suele generar confusiones en el código. Como este estilo de programación genera programas que ofrecen pocas garantías en materia de seguridad, se ha determinado que Java no tenga acceso directo a la memoria ni soporte la aritmética de punteros.
La orientación a objetos: Una de las ventajas que supone empezar desde el principio se traduce en el hecho de que Java ha sido creado inicialmente como lenguaje orientado a objetos. Teniendo en cuanta que la orientación a objetos es tal vez la tendencia mas popular en el desarrollo de software moderno.
Un lenguaje preparado para la red: Java fue creado desde el principio como un lenguaje pensado para la red. La maquina virtual de Java evita que los programas transferidos al ordenador lo destruyan, facilita la rápida transferencia de dichos programas y los ejecuta de modo que no dependan del sistema operativo subyacente.
Estas ventajas son inherentes al lenguaje Java. En la programación diaria no se toman en cuenta estos detalles. Pero teniendo en cuenta que Java ha sido creado para funcionar con la red, se tiene adelante una serie de funciones extensas, incluidas en la API, que permite la interacción con Internet. Mediante la utilización de las API se puede emplear elementos de un alto nivel de abstracción, como los localizadores de recursos uniformes (URL), o comunicarse a niveles muy bajos trasfiriendo simplemente paquetes de un lado a otro.
Java tiene la característica de que libera la memoria automáticamente, por lo cual uno no se tiene que preocupar por la perdida de esta. Inicio de esta pagina
Aunque una de las principales habilidades y ventaja es la portabilidad, el método que java utiliza para la creación de el código, es ineficiente. Cuando Java es compilado y pasado a código de bytes, un interprete llamado maquina virtual, especialmente diseñado para una arquitectura de hardware, corre el programa. ¿Por que es este un problema?, Java al tener que interpretar el código, es mas lento que C. El código compilado, muestra una serie de instrucciones que tienen que ver directamente con las instrucciones del procesador, entonces, un interprete debe primero traducir el código binario de java a el equivalente de las instrucciones de cada tipo de procesador. Obviamente, este proceso toma algo de tiempo y no importa el tamaño del programa este será mas lento que realizar la mima operación directamente en el código de la maquina.
¿Que tan importante es la diferencia de velocidad?, de acuerdo a PC Magazine, parece ser muy significativa, “Comparado con código nativo, La maquina virtual de Java es atrozmente lenta... Java aun no puede competir con el código nativo compilado de C++” (PC Magazine, abril, 1998). C++ ha sido ampliamente adoptado por los desarrolladores y no desearan cambiar el lenguaje si las aplicaciones que ellos desarrollan con java no están a la altura de los estándares de ellos y de los clientes. De cualquier manera , si la diferencia de velocidad es insignificante, los desarrolladores talvez desearían aprender y programar en Java por las significativas ventajas que el lenguaje ofrece. Inicio de esta pagina
Java es, entre otras cosas, un lenguaje orientado a objetos, encadenado y dinámico, pero esta no es la razón fundamental por la cual se le considera el mejor lenguaje para trabajar en la red. Lo maravilloso es la manera en que se ejecutan los programas creados en Java. Los programas Java se ejecutan en maquinas virtuales que habitan en el ordenador.
Un programa Java no tiene contacto con el ordenador en el que se ejecuta, sino que se relaciona con la maquina virtual. Esta configuración tiene una serie de implicaciones de gran importancia
En primer lugar, los programas en Java no dependen del tipo de plataforma que utilizan, en cierta forma se escribe para una sola plataforma: la maquina virtual.
La maquina virtual de Java decide lo que los programas Java pueden hacer y lo que no. Los programas escritos en lenguajes compilados, como C y C++, son ejecutados directamente por el sistema operativo. Por tanto, éstos tienen acceso directo a todos los recursos del sistema, incluyendo la memoria y el sistema de archivos.
Considerando que los programas creados en Java se ejecutan desde la maquina virtual, los creadores de dicha maquina deciden en ultima instancia que pude hacer cada programa y que no. El espacio creado para ejecutar los programas Java es el entorno de tiempo de ejecución. Esta maquina virtual actúa como un cortafuego entre el ordenador host (anfitrión) y el programa Java. Un programa Java nunca accede a los mecanismos de entrada y salida del ordenador, al sistema de archivos, ni a la memoria. Simplemente solicita a la maquina virtual que lo haga. Inicio de esta pagina
Java proporciona los tipos de datos que comúnmente se encuentran en los distintos lenguajes de programación, con la diferencia en que la representación interna de ellos no es un problema para el programador sino que el mismo lenguaje se encarga de ellos, para que se pueda intercambiar datos binarios generados por computadoras con diferente arquitectura.
Datos Numéricos:
*Enteros :
byte (8 Bits) short (16Bits) int (32 Bits) long (64 Bits)
Los números pueden ser expresados en base diez (10), hexadecimal (16) u octal (8),. Un número en formato decimal es simplemente un conjunto de dígitos que van desde el 0 al 9, nunca hay un cero a la izquierda. Un número en hexadecimal va precedido por 0x y luego la secuencia de dígitos permitidos en la notación hexadecimal : números del 0 al 9 y letras desde la A hasta la F. Para escribir un número en notación octal basta con escribir un cero a la izquierda del número, los dígitos permitidos en esta notación van desde el 0 al 7.
*Reales : Introducción a los Canales de I/O. El paquete java.io contiene dos clases, InputStream y OutputStream, de las que derivan la mayoría de las clases de este paquete. La clase InputStream es una superclase abstracta que proporciona un interface de programación mínimo y una implementación parcial del canal de entrada. La clase InputStream define métodos para leer bytes o arrays de bytes, marcar posiciones en el canal, saltar bytes de la entrada, conocer el número de bytes disponibles para ser leídos, y resetear la posición actual dentro del canal. Un canal de entrada se abre automáticamente cuando se crea. Se puede cerrar un canal explícitamente con el método close(), o puede dejarse que se cierre implícitamente cuando se recolecta la basura, lo que ocurre cuando el objeto deja de referenciarse. La clase Outputstream es una superclase abstracta que proporciona un interface de programación mínimo y una implementación parcial de los canales de salida. Un canal de salida se abre automáticamente cuando se crea. Se puede cerrar un canal explícitamente con el método close(), o se puede dejar que se cierre implícitamente cuando se recolecta la basura, lo que ocurre cuando el objeto deja de referenciarse. El paquete java.io contiene muchas subclases de InputStream y OutputStream que implementan funciones específicas de entrada y salida. Por ejemplo, FileInputStream y FileOutputStream son canales de entrada y salida que operan con ficheros en el sistema de ficheros nativo. Canales simples de I/O. Lo siguiente es una introducción a las clases no abstractas que descienden directamente desde InputStream y OutputStream: FileInputStream y FileOutputStream. Leen o escriben datos en un fichero del sistema de ficheros nativo.l PipedInputStream y PipedOutputStream. Implementan los componentes de entrada y salida de una tubería. Las tuberías se utilizan para canalizar la salida |n programa hacia la entrada de otro. Un PipedInputStream debe ser conectado a un PipedOutputStream y un PipedOutputStream debe ser conectado a un PipedInputStream. ByteArrayInputStream y ByteArrayOutputStream. Leen o escriben datos en un array de la memoria. SequenceInputStream. Concatena varios canales de entrada dentro de un solo canal de entrada. StringBufferInputStream. Permite a los programas leer desde un StringBuffer como si fuera un canal de entrada. Introducción a los Canales de I/O. El paquete java.io contiene dos clases, InputStream y OutputStream, de las que derivan la mayoría de las clases de este paquete. La clase InputStream es una superclase abstracta que proporciona un interface de programación mínimo y una implementación parcial del canal de entrada. La clase InputStream define métodos para leer bytes o arrays de bytes, marcar posiciones en el canal, saltar bytes de la entrada, conocer el número de bytes disponibles para ser leídos, y resetear la posición actual dentro del canal. Un canal de entrada se abre automáticamente cuando se crea. Se puede cerrar un canal explícitamente con el método close(), o puede dejarse que se cierre implícitamente cuando se recolecta la basura, lo que ocurre cuando el objeto deja de referenciarse. La clase Outputstream es una superclase abstracta que proporciona un interface de programación mínimo y una implementación parcial de los canales de salida. Un canal de salida se abre automáticamente cuando se crea. Se puede cerrar un canal explícitamente con el método close(), o se puede dejar que se cierre implícitamente cuando se recolecta la basura, lo que ocurre cuando el objeto deja de referenciarse. El paquete java.io contiene muchas subclases de InputStream y OutputStream que implementan funciones específicas de entrada y salida. Por ejemplo, FileInputStream y FileOutputStream son canales de entrada y salida que operan con ficheros en el sistema de ficheros nativo. Canales simples de I/O. Lo siguiente es una introducción a las clases no abstractas que descienden directamente desde InputStream y OutputStream: FileInputStream y FileOutputStream. Leen o escriben datos en un fichero del sistema de ficheros nativo.l PipedInputStream y PipedOutputStream. Implementan los componentes de entrada y salida de una tubería. Las tuberías se utilizan para canalizar la salida |n programa hacia la entrada de otro. Un PipedInputStream debe ser conectado a un PipedOutputStream y un PipedOutputStream debe ser conectado a un PipedInputStream. ByteArrayInputStream y ByteArrayOutputStream. Leen o escriben datos en un array de la memoria. SequenceInputStream. Concatena varios canales de entrada dentro de un solo canal de entrada. StringBufferInputStream. Permite a los programas leer desde un StringBuffer como si fuera un canal de entrada. Canales Filtrados. FilterInputStream y FilterOutputStream son subclases de InputStream y OutputStream respectivamente, y también son clases abstractas. Estas clases definen el interface para los canales filtrados que procesan los datos que están siendo leídos o escritos. Por ejemplo, los canales filtrados BufferedInputStream y BufferedOutputStream almacenan datos mientras los leen o escriben para aumentar su velocidad. DataInputStream y DataOutputStream Lee o escribe datos primitivos de Java en una máquina independiente del formato. BufferedInputStream y BufferedOutputStream Almacena datos mientras los lee o escribe para reducir el número de accesos requeridos a la fuente original. Los canales con buffer son más eficientes que los canales similares sin buffer. LineNumberInputStream Tiene en cuenta los números de línea mientras lee. PushbackInputStream Un canal de entrada con un buffer de un byte hacia atrás. Algunas veces cuando se leen bytes desde un canal es útil chequear el siguiente carácter para poder decir lo que hacer luego. Si se chequea un carácter del canal, se necesitará volver a ponerlo en su sitio para que pueda ser leído y procesado normalmente. PrintStream Un canal de salida con los métodos de impresión convenientes. Además de las clases streams, el paquete java.io contiene estas otras clases: File Representa un fichero en el sistema de ficheros nativo. Se puede crear un objeto File para un fichero en el sistema de ficheros nativo y luego pedirle al objeto la información que se necesite sobre el fichero(como su path completo). FileDescriptor Representa un manejador de fichero (o descriptor) para abrir un fichero o una conexión. RandomAccessFile Representa un fichero de acceso aleatorio. StreamTokenizer Divide el contenido de un canal en Token(partes). Los Tokens son la unidad más pequeña reconocida por el algoritmo de análisis de texto(como son palabras, símbolos, etc...). Un objeto StreamTokenize puede ser utilizado para analizar cualquier fichero de texto. Por ejemplo, podrías utilizarlo para dividir un fichero fuente de Java en nombres de variables, etc... o un fichero HTML en etiquetas de HTML. Y finalmente el paquete java.io define tres interfaces: DataInput y DataOutput Estos dos interfaces describen canales que pueden leer o escribir datos de tipos primitivos de Java en máquinas independientes del formato. DataInputStream, DataOutputStream y RandomAccessFile implementan estos interfaces. FilenameFilter El método list() de la clase File utiliza un objeto FilenameFilter para determinar los ficheros a listar en un directorio. Este interface acepta ficheros basándose en sus nombres. Se podría utilizar FileNameFilter para implementar una sencilla expresión de búsqueda al estilo de los comodines como fichero.*, etc.... Utilizar ficheros de acceso aleatorio. La clase RandomAccessFile implementa los interfaces DataInput y DataOutput y por lo tanto puede utilizarse tanto para leer como para escribir. RandomAccessFile es similar a FileInputStream y FileOutputStream en que se especifica un fichero del sistema de ficheros nativo para abrirlo cuando se crea. Se puede hacer esto con un nombre de fichero o un objeto File. Cuando se crea un RandomAccessFile se debe indicar si solo se va a leer el fichero o también se va a escribir en él. La siguiente línea de código java crea un RandomAccessFile para leer el fichero llamado farrago.txt: new RandomAccessFile("farrago.txt", "r"); Y esta otra abre el mismo fichero para leer y escribir: new RandomAccessFile("farrago.txt", "rw"); Después de haber abierto el fichero, se pueden utilizar los métodos comunes readXXX() o writeXXX() par arealizar la I/O sobre el fichero. RandomAccessFile soporta la noción de puntero de fichero. El puntero de fichero indica la posición acutal dentro del fichero. Cuando el fichero se crea por primera vez, el puntero de fichero es cero, indicando el principio del fichero. Las llamadas a los métodos readXXX() y writeXXX() ajustan el puntero de fichero el número de bytes leidos o escritos. Además de los métodos normales de I/O que mueven implícitamente el puntero de fichero cuanod ocurre una operación, RandomAccessfile contiene tres métodos que manipulan explícitamente el puntero de fichero. skipBytes() Mueve el puntero de fichero hacia delante el número de bytes especificado. seek() Posiciona el puntero de fichero justo en el byte especificado. GetFilePointer() Devuelve la posición actual del puntero de fichero. Interface Definición: Un interface es una colección de definiciones de métodos (sin implementaciones) y de valores constantes. Los interfaces se utilizan para definir un protocolo de comportamiento que puede ser implementado por cualquier clase del árbol de clases. Los interfaces son útiles para: * Capturar similitudes entre clases no relacionadas sin forzar una relación entre ellas. * Declarar métodos que una o varias clases necesitan implementar. * Revelar el interface de programación de un objeto sin recelar sus clases (los objetos de este tipo son llamados objetos anónimos y pueden ser útiles cuando compartas un paquete de clases con otros desarrolladores). En java, un interface es un tipo de dato de referencia, y por tanto, puede utilizarse en muchos de los sitios donde se pueda utilizar cualquier tipo (como en un argumento de métodos y una declaración de variables). Definir un Interface. Para crear un Interface se debe escribir tanto la declaración como el cuerpo del interface: declaraciondeInterface{ cuerpodeInterface } La declaración de interface declara varios atributos del interface, como su nombre o si se extiende desde otro interface. El cuerpo de interface contiene las constantes y las declaraciones de métodos del Interface. La declaración de interface. Como mínimo, una declaración de interface contiene la palabra clave interface y el nombre del interface que se va a crear: interface Contable{ ... } Nota: Por convención, los nombres de interfaces empiezan con una letra mayúscula al igual que las clases. Frecuentemente los nombres de interfaces terminan en "able" o "ible". Una declaración de interface puede tener otros dos componenetes: el especificador de acceso public y una lista de "superinterfaces". Un interface puede extender otros interfaces como una clase puede extender o subclasificar otra clase. Sin embargo, mientras que una clase sólo puede extender una superclase, los interfaces pueden extender de cualquier número de interfaces. Así, nua declaración completa de interface se parecería a esto: [public] interface Nombredeinterface [extends listadeSuperInterfaces]{ ... } El especificador de acceso public indica que el interface puede ser utilizado por todas las clases en cualquier paquete. Si el interface no se especifica como público, sólo será accesible para las clases definidas en el mismo paquete que el interface. La claúsula extends es similar a la utilizada en la declaración de una clase, sin embargo, un interface puede extender varios interfaces(mientras una clase sólo puede extender una), y un interface no puede extender clases. Esta lista de superinterfaces es una lista delimintada por comas de todos los interfaces extendidos por el nuevo interface. Un interface hereda todas las constantes y métodos de sus superinterfaces a menos que el interface oculte una constante con el mismo nombre o redeclare un método con una nueva declaración. El cuerpo de interface. El cuerpo del interface contiene las declaraciones de métodos para los métodos definidos en el interface, además de las declaraciones de los métodos, una interface puede contener declaraciones de constantes. Nota: Las declaraciones de miembros en un interface no permiten el uso de algunos modificadores y desaconsejan el uso de otros. No se podrán utilizar transient, volatile, o synchronized en una declaración de miembro en un interface. Tampoco se podrá utilizar los especificadores private y protected cuando se declaren miembros de un interface. Todos los valores constantes definidos en un interface son implícitamente públicos, estáticos y finales. El uso de estos modificadores en una declaración de constante en un interface está desaconsejado por falta de estilo. Similarmente, todos los métodos declarados en un interface son implícitamente públicos y abstractos.Este código define un nuevo interface llamado colección que contiene un valor constante y tres declaraciones de métodos: interface colección{ int MAXIMO = 500; void añadir(Object obj); void borrar(Object obj); Object buscar(Object obj); Int contadorActual(); } El interface anterior puede ser implementado por cualquier clase que reperesente una colección de obejtos como pueden ser pilas, vectores, enlaces, etc... Observa que cada declaración de método está seguida por un punto y coma (;) porque un interface no proporciona implementación para los métodos declarados dentro de él. Implementar un Interface. Para utilizar un interface se debe escribir una clase que lo mplemente. Una clase declara todos los interfaces que implementa en su declaración de la clase. Para declarar que una clase implementa uo o más interfaces, se utiliza la palabra clave implementes seguida por una lista delimitada por comas con los interfaces implementados por la clase. Por ejemplo, consideremos el interface colección presentado en la página anterior. Ahoraa supongamos qu queremos escribir una clase que implemente una pila FIFO (primero en entrar, primero en salir). Como una ppila FIFO contiene otros objetos tiene sentido que implemente el interface colección. La clase PilaFIFO declara que implementa el interface colección de esta forma: class PilaFIFO implements coleccion{ ... void añadir(Object obj){ ... } void borrar(Object obj){ ... } Object buscar(Object obj){ ... } Int contadorActual(){ ... } } así se garantiza que proporciona implementación para los métodos añadir(), borrar(), buscar() y contadorActual(). Por convención, la clausula implements sigue a la clausula extends si es que ésta existe. Observa que las firmas de los métodos del interface colección implementados en la clase PilaFIFO debe corresponder exactamente con las firmas de los métodos declarados en la interface colección. Utilizar un interface como un tipo. Como se mencionó anteriormente, cuando se define un nuevo interface, en esencia se está definiendo un tipo de referencia. Se pueden utilizar los nombres de interface en cualquier lugar donde se usaría un nombre de dato de tipos primitivos o un nombre de datos del tipo de referencia. Por ejemplo, supongamos que se ha escrito un programa de hoja de cálculo que contiene un conjunto tabular de celdas y cada una contiene un valor. Querríamos poder poner cadenas, fechas, enteros, ecuaciones, en cada una de las celdas de la hoja. Para hacer esto, las cadenas, las fechas, los enteros y las ecuaciones tienen que implementar el mismo conjunto de métodos. Una forma de conseguir esto es encontrar el ancestro común de las clases e implementar ahi los métodos necesarios. Sin embargo, esto no es una solución práctica porque el ancestro común más frecuente es Object. Una aproximación podría ser escribir una clase llamada ValordeCelda que representara los valores que pudiera contener una celda de la hoja de cálculo. Entonces se podrían crear distintas subclases de ValordeCelda para las cadenas, los enteros o las ecuaciones.