Java (lenguaje de programación)

Ajustar Compartir Imprimir Citar
Lenguaje de programación orientado a objetos

Java es un lenguaje de programación de alto nivel, basado en clases y orientado a objetos que está diseñado para tener la menor cantidad posible de dependencias de implementación. Es un lenguaje de programación de propósito general destinado a permitir a los programadores escribir una vez, ejecutar en cualquier lugar (WORA), lo que significa que el código Java compilado puede ejecutarse en todas las plataformas compatibles con Java sin necesidad de recompilar. Las aplicaciones Java generalmente se compilan en un código de bytes que se puede ejecutar en cualquier máquina virtual Java (JVM), independientemente de la arquitectura informática subyacente. La sintaxis de Java es similar a la de C y C++, pero tiene menos funciones de bajo nivel que cualquiera de ellos. El tiempo de ejecución de Java proporciona capacidades dinámicas (como la reflexión y la modificación del código de tiempo de ejecución) que normalmente no están disponibles en los lenguajes compilados tradicionales. A partir de 2019, Java fue uno de los lenguajes de programación más populares en uso según GitHub, particularmente para aplicaciones web cliente-servidor, con 9 millones de desarrolladores informados.

Java fue desarrollado originalmente por James Gosling en Sun Microsystems. Fue lanzado en mayo de 1995 como un componente central de Sun Microsystems' plataforma Java. Los compiladores Java, las máquinas virtuales y las bibliotecas de clases originales y de implementación de referencia fueron lanzados originalmente por Sun bajo licencias propietarias. En mayo de 2007, de conformidad con las especificaciones del Proceso de la comunidad Java, Sun había vuelto a otorgar licencias para la mayoría de sus tecnologías Java bajo la licencia exclusiva GPL-2.0. Oracle ofrece su propia máquina virtual HotSpot Java, sin embargo, la implementación de referencia oficial es OpenJDK JVM, que es un software de código abierto gratuito y utilizado por la mayoría de los desarrolladores y es la JVM predeterminada para casi todas las distribuciones de Linux.

A partir de septiembre de 2022, Java 19 es la última versión, mientras que Java 17, 11 y 8 son las versiones actuales de soporte a largo plazo (LTS).

Historia

Duke, la mascota Java
James Gosling, el creador de Java, en 2008
El gráfico del índice de popularidad del lenguaje de programación TIOBE de 2002 a 2022. Java estaba constantemente en la parte superior de mediados de 2015 a principios de 2020.

James Gosling, Mike Sheridan y Patrick Naughton iniciaron el proyecto del lenguaje Java en junio de 1991. Java se diseñó originalmente para la televisión interactiva, pero en ese momento era demasiado avanzado para la industria de la televisión digital por cable. Inicialmente, el idioma se llamó Roble por un roble que se encontraba fuera de la oficina de Gosling. Más tarde el proyecto pasó a llamarse Green y finalmente pasó a llamarse Java, de Java coffee, un tipo de café de Indonesia. Gosling diseñó Java con una sintaxis de estilo C/C++ que los programadores de sistemas y aplicaciones encontrarían familiar.

Sun Microsystems lanzó la primera implementación pública como Java 1.0 en 1996. Prometía escribir una vez, ejecutar en cualquier lugar (WORA), proporcionando tiempos de ejecución sin costo en plataformas populares. Bastante seguro y con seguridad configurable, permitía restricciones de acceso a la red y a los archivos. Los principales navegadores web pronto incorporaron la capacidad de ejecutar applets de Java dentro de las páginas web, y Java rápidamente se hizo popular. El compilador Java 1.0 fue reescrito en Java por Arthur van Hoff para cumplir estrictamente con la especificación del lenguaje Java 1.0. Con la llegada de Java 2 (lanzado inicialmente como J2SE 1.2 en diciembre de 1998 a 1999), las nuevas versiones tenían múltiples configuraciones creadas para diferentes tipos de plataformas. J2EE incluía tecnologías y API para aplicaciones empresariales que normalmente se ejecutan en entornos de servidor, mientras que J2ME presentaba API optimizadas para aplicaciones móviles. La versión de escritorio pasó a llamarse J2SE. En 2006, con fines de marketing, Sun renombró las nuevas versiones de J2 como Java EE, Java ME y Java SE, respectivamente.

En 1997, Sun Microsystems se acercó al organismo de estándares ISO/IEC JTC 1 y más tarde a Ecma International para formalizar Java, pero pronto se retiró del proceso. Java sigue siendo un estándar de facto, controlado a través del Proceso de la Comunidad Java. En un momento, Sun hizo que la mayoría de sus implementaciones de Java estuvieran disponibles sin cargo, a pesar de su estado de software propietario. Sun generó ingresos de Java a través de la venta de licencias para productos especializados como Java Enterprise System.

El 13 de noviembre de 2006, Sun lanzó gran parte de su máquina virtual Java (JVM) como software libre y de código abierto (FOSS), bajo los términos de la licencia exclusiva GPL-2.0. El 8 de mayo de 2007, Sun finalizó el proceso, poniendo a disposición todo el código central de su JVM bajo términos de distribución de código abierto/software libre, además de una pequeña parte del código del que Sun no tenía los derechos de autor.

El vicepresidente de Sun, Rich Green, dijo que el papel ideal de Sun con respecto a Java era el de evangelista. Tras la adquisición de Sun Microsystems por parte de Oracle Corporation en 2009–10, Oracle se ha descrito a sí mismo como el administrador de la tecnología Java con un compromiso incesante de fomentar una comunidad de participación y transparencia. Esto no impidió que Oracle presentara una demanda contra Google poco después por usar Java dentro del SDK de Android (consulte la sección Android).

El 2 de abril de 2010, James Gosling renunció a Oracle.

En enero de 2016, Oracle anunció que los entornos de tiempo de ejecución de Java basados en JDK 9 descontinuarían el complemento del navegador.

El software Java se ejecuta en todo, desde computadoras portátiles hasta centros de datos, desde consolas de juegos hasta supercomputadoras científicas.

Oracle (y otros) recomiendan enfáticamente desinstalar versiones obsoletas y no compatibles de Java, debido a problemas de seguridad no resueltos en versiones anteriores.

Principios

Había cinco objetivos principales en la creación del lenguaje Java:

  1. Debe ser simple, orientado al objeto y familiar.
  2. Debe ser robusto y seguro.
  3. Debe ser arquitectura-neutral y portátil.
  4. Debe ejecutarse con alto rendimiento.
  5. Debe ser interpretado, roscado y dinámico.

Versiones

A partir de septiembre del 2021, Java 8, 11 y 17 se admiten como versiones de soporte a largo plazo (LTS).

Oracle lanzó la última actualización pública de costo cero para la versión heredada de Java 8 LTS en enero de 2019 para uso comercial, aunque por lo demás seguirá siendo compatible con Java 8 con actualizaciones públicas para uso personal indefinidamente. Otros proveedores han comenzado a ofrecer compilaciones sin costo de OpenJDK 18 y 8, 11 y 17 que aún reciben seguridad y otras actualizaciones.

Versiones de lanzamiento principales de Java, junto con sus fechas de lanzamiento:

VersiónFecha
JDK Beta1995
JDK 1.023 de enero de 1996
JDK 1.119 de febrero de 1997
J2SE 1.28 de diciembre de 1998
J2SE 1.38 de mayo de 2000
J2SE 1.46 de febrero de 2002
J2SE 5.030 de septiembre de 2004
Java SE 611 de diciembre de 2006
Java SE 728 de julio de 2011
Java SE 8 (LTS)18 de marzo de 2014
Java SE 921 de septiembre de 2017
Java SE 1020 de marzo de 2018
Java SE 11 (LTS)25 de septiembre de 2018
Java SE 1219 de marzo de 2019
Java SE 1317 de septiembre de 2019
Java SE 1417 de marzo de 2020
Java SE 1515 de septiembre de 2020
Java SE 1616 de marzo de 2021
Java SE 17 (LTS)Septiembre 14, 2021
Java SE 1822 de marzo, 2022
Java SE 19 20 de septiembre de 2022

Ediciones

Sun ha definido y admite cuatro ediciones de Java dirigidas a diferentes entornos de aplicaciones y segmentó muchas de sus API para que pertenezcan a una de las plataformas. Las plataformas son:

Las clases en las API de Java están organizadas en grupos separados llamados paquetes. Cada paquete contiene un conjunto de interfaces, clases, subpaquetes y excepciones relacionados.

Sun también proporcionó una edición llamada Personal Java que ha sido reemplazada por emparejamientos de perfil de configuración de Java ME basados en estándares posteriores.

Sistema de ejecución

JVM Java y código de bytes

Un objetivo de diseño de Java es la portabilidad, lo que significa que los programas escritos para la plataforma Java deben ejecutarse de manera similar en cualquier combinación de hardware y sistema operativo con soporte de tiempo de ejecución adecuado. Esto se logra compilando el código del lenguaje Java en una representación intermedia llamada código de bytes de Java, en lugar de directamente en el código de máquina específico de la arquitectura. Las instrucciones de código de bytes de Java son análogas al código de máquina, pero están diseñadas para ser ejecutadas por una máquina virtual (VM) escrita específicamente para el hardware del host. Los usuarios finales suelen utilizar un Java Runtime Environment (JRE) instalado en su dispositivo para aplicaciones Java independientes o un navegador web para subprogramas Java.

Las bibliotecas estándar proporcionan una forma genérica de acceder a funciones específicas del host, como gráficos, subprocesos y redes.

El uso de bytecode universal simplifica la portabilidad. Sin embargo, la sobrecarga de interpretar bytecode en instrucciones de máquina hizo que los programas interpretados casi siempre se ejecutaran más lentamente que los ejecutables nativos. Los compiladores Just-in-Time (JIT) que compilan códigos de bytes en código de máquina durante el tiempo de ejecución se introdujeron desde una etapa temprana. El compilador Hotspot de Java es en realidad dos compiladores en uno; y con GraalVM (incluido, por ejemplo, en Java 11, pero eliminado a partir de Java 16) que permite la compilación por niveles. Java en sí mismo es independiente de la plataforma y se adapta a la plataforma particular en la que se ejecutará mediante una máquina virtual Java (JVM), que traduce el código de bytes de Java al lenguaje de máquina de la plataforma.

Rendimiento

Los programas escritos en Java tienen la reputación de ser más lentos y requerir más memoria que los escritos en C++. Sin embargo, los programas Java' la velocidad de ejecución mejoró significativamente con la introducción de la compilación justo a tiempo en 1997/1998 para Java 1.1, la adición de funciones de lenguaje que admiten un mejor análisis de código (como clases internas, la clase StringBuilder, aserciones opcionales, etc.) y optimizaciones en la máquina virtual Java, como HotSpot, que se convirtió en la JVM predeterminada de Sun en 2000. Con Java 1.5, el rendimiento mejoró con la adición del paquete java.util.concurrent, que incluye implementaciones sin bloqueo de ConcurrentMaps y otros colecciones multinúcleo, y se mejoró aún más con Java 1.6.

No JVM

Algunas plataformas ofrecen soporte de hardware directo para Java; hay microcontroladores que pueden ejecutar el código de bytes de Java en el hardware en lugar de una máquina virtual de software de Java, y algunos procesadores basados en ARM podrían tener soporte de hardware para ejecutar el código de bytes de Java a través de su opción Jazelle, aunque el soporte se ha eliminado principalmente en las implementaciones actuales de ARM.

Gestión automática de memoria

Java utiliza un recolector de basura automático para administrar la memoria en el ciclo de vida del objeto. El programador determina cuándo se crean los objetos y el tiempo de ejecución de Java es responsable de recuperar la memoria una vez que los objetos ya no están en uso. Una vez que no quedan referencias a un objeto, la memoria inalcanzable se vuelve elegible para ser liberada automáticamente por el recolector de basura. Todavía puede ocurrir algo similar a una fuga de memoria si el código de un programador contiene una referencia a un objeto que ya no se necesita, generalmente cuando los objetos que ya no se necesitan se almacenan en contenedores que todavía están en uso. Si se llama a métodos para un objeto inexistente, se lanza una excepción de puntero nulo.

Una de las ideas detrás del modelo de gestión de memoria automática de Java es que los programadores pueden ahorrarse la carga de tener que realizar una gestión de memoria manual. En algunos lenguajes, la memoria para la creación de objetos se asigna implícitamente en la pila o se asigna y desasigna explícitamente desde el montón. En este último caso, la responsabilidad de administrar la memoria reside en el programador. Si el programa no desasigna un objeto, se produce una fuga de memoria. Si el programa intenta acceder o desasignar memoria que ya ha sido desasignada, el resultado es indefinido y difícil de predecir, y es probable que el programa se vuelva inestable o se bloquee. Esto se puede remediar parcialmente mediante el uso de punteros inteligentes, pero estos agregan sobrecarga y complejidad. Tenga en cuenta que la recolección de basura no evita las fugas de memoria lógica, es decir, aquellas en las que todavía se hace referencia a la memoria pero nunca se usa.

La recolección de basura puede ocurrir en cualquier momento. Idealmente, ocurrirá cuando un programa esté inactivo. Se garantiza que se activará si no hay suficiente memoria libre en el montón para asignar un nuevo objeto; esto puede hacer que un programa se detenga momentáneamente. La gestión de memoria explícita no es posible en Java.

Java no es compatible con la aritmética de punteros de estilo C/C++, donde las direcciones de los objetos se pueden manipular aritméticamente (por ejemplo, sumando o restando un desplazamiento). Esto permite que el recolector de elementos no utilizados reubique los objetos a los que se hace referencia y garantiza la seguridad de los tipos.

Al igual que en C++ y algunos otros lenguajes orientados a objetos, las variables de los tipos de datos primitivos de Java se almacenan directamente en campos (para objetos) o en la pila (para métodos) en lugar de en el montón, como es comúnmente cierto para tipos de datos no primitivos (pero consulte el análisis de escape). Esta fue una decisión consciente de los diseñadores de Java por motivos de rendimiento.

Java contiene varios tipos de recolectores de basura. Desde Java 9, HotSpot utiliza Garbage First Garbage Collector (G1GC) de forma predeterminada. Sin embargo, también hay varios otros recolectores de elementos no utilizados que se pueden usar para administrar el montón. Para la mayoría de las aplicaciones en Java, G1GC es suficiente. Anteriormente, el recolector de basura paralelo se usaba en Java 8.

Haber resuelto el problema de administración de memoria no libera al programador de la carga de manejar adecuadamente otros tipos de recursos, como conexiones de red o base de datos, identificadores de archivos, etc., especialmente en presencia de excepciones.

Sintaxis

Gráfico de dependencia de las clases de Java Core (creado con jdeps y Gephi)

La sintaxis de Java está influenciada en gran medida por C++ y C. A diferencia de C++, que combina la sintaxis para la programación estructurada, genérica y orientada a objetos, Java se creó casi exclusivamente como un lenguaje orientado a objetos. Todo el código está escrito dentro de clases, y cada elemento de datos es un objeto, con la excepción de los tipos de datos primitivos (es decir, números enteros, números de punto flotante, valores booleanos y caracteres), que no son objetos por razones de rendimiento. Java reutiliza algunos aspectos populares de C++ (como el printf).

A diferencia de C++, Java no admite la sobrecarga de operadores ni la herencia múltiple para las clases, aunque sí admite la herencia múltiple para las interfaces.

Java usa comentarios similares a los de C++. Hay tres estilos diferentes de comentarios: un estilo de una sola línea marcado con dos barras inclinadas (//), un estilo de varias líneas abierto con /* y cerrado con * //code>, y el estilo de comentarios de Javadoc se abrió con /** y se cerró con */. El estilo de comentario Javadoc permite al usuario ejecutar el ejecutable Javadoc para crear documentación para el programa y puede ser leído por algunos entornos de desarrollo integrados (IDE) como Eclipse para permitir que los desarrolladores accedan a la documentación dentro del IDE.

Ejemplo de hola mundo

El programa tradicional Hello world se puede escribir en Java como:

público clase HolaWorldApp {} público estática vacío principal()String[] args) {} Sistema.Fuera..println()"¡Hola Mundo!"); // Imprime la cadena a la consola. }}

Todos los archivos fuente deben tener el nombre de la clase pública que contienen, agregando el sufijo .java, por ejemplo, HelloWorldApp.java. Primero debe compilarse en bytecode, utilizando un compilador de Java, produciendo un archivo con el sufijo .class (HelloWorldApp.class, en este caso). Solo entonces se puede ejecutar o lanzar. El archivo fuente de Java solo puede contener una clase pública, pero puede contener varias clases con un modificador de acceso no público y cualquier cantidad de clases internas públicas. Cuando el archivo fuente contiene varias clases, es necesario hacer pública una clase (introducida por la palabra clave class) (precedida por public palabra clave) y nombre el archivo de origen con ese nombre de clase pública.

Una clase que no se declara pública puede almacenarse en cualquier archivo .java. El compilador generará un archivo de clase para cada clase definida en el archivo fuente. El nombre del archivo de clase es el nombre de la clase, con .class adjunto. Para la generación de archivos de clase, las clases anónimas se tratan como si su nombre fuera la concatenación del nombre de su clase adjunta, un $ y un número entero.

La palabra clave public indica que se puede llamar a un método desde el código de otras clases, o que una clase puede ser utilizada por clases fuera de la jerarquía de clases. La jerarquía de clases está relacionada con el nombre del directorio en el que se encuentra el archivo.java. Esto se denomina modificador de nivel de acceso. Otros modificadores de nivel de acceso incluyen las palabras clave privado (un método al que solo se puede acceder en la misma clase) y protegido (que permite acceder al código del mismo paquete). Si una pieza de código intenta acceder a métodos privados o métodos protegidos, la JVM lanzará una SecurityException

La palabra clave static delante de un método indica un método estático, que está asociado solo con la clase y no con ninguna instancia específica de esa clase. Solo se pueden invocar métodos estáticos sin una referencia a un objeto. Los métodos estáticos no pueden acceder a ningún miembro de clase que no sea también estático. Los métodos que no están designados como estáticos son métodos de instancia y requieren una instancia específica de una clase para funcionar.

La palabra clave void indica que el método principal no devuelve ningún valor a la persona que llama. Si un programa Java va a salir con un código de error, debe llamar a System.exit() explícitamente.

El nombre del método main no es una palabra clave en el lenguaje Java. Es simplemente el nombre del método que llama el lanzador de Java para pasar el control al programa. Las clases de Java que se ejecutan en entornos gestionados, como applets y Enterprise JavaBeans, no utilizan ni necesitan un método main(). Un programa Java puede contener varias clases que tienen métodos main, lo que significa que la máquina virtual debe saber explícitamente desde qué clase debe iniciarse.

El método principal debe aceptar una matriz de objetos String. Por convención, se hace referencia a él como args aunque se puede usar cualquier otro nombre de identificador legal. Desde Java 5, el método principal también puede usar argumentos variables, en forma de public static void main(String... args), lo que permite invocar el método principal con un número arbitrario de String. El efecto de esta declaración alternativa es semánticamente idéntico (al parámetro args que sigue siendo una matriz de objetos String), pero permite una sintaxis alternativa para crear y pasar la matriz.

El iniciador de Java inicia Java cargando una clase dada (especificada en la línea de comando o como un atributo en un JAR) e iniciando su método public static void main(String[]). Los programas independientes deben declarar este método explícitamente. El parámetro String[] args es una matriz de objetos String que contienen cualquier argumento pasado a la clase. Los parámetros a main a menudo se pasan por medio de una línea de comando.

La impresión es parte de una biblioteca estándar de Java: la clase System define un campo estático público llamado out. El objeto out es una instancia de la clase PrintStream y proporciona muchos métodos para imprimir datos de forma estándar, incluido println(String) que también agrega una nueva línea a la cadena pasada.

La cadena "¡Hola mundo!" se convierte automáticamente en un objeto String por el compilador.

Ejemplo con métodos

// Este es un ejemplo de un comentario de línea única usando dos barras/* * Este es un ejemplo de un comentario de línea múltiple usando el corte y el asterisco. * Este tipo de comentario se puede utilizar para contener mucha información o desactivar * código, pero es muy importante recordar cerrar el comentario. */paquete fibsandlies;importación Java.util. Mapa;importación java.util.HashMap;* * Este es un ejemplo de un comentario Javadoc; Javadoc puede compilar documentación * de este texto. Los comentarios Javadoc deben preceder inmediatamente a la clase, método, * o campo documentado. * @author Wikipedia Voluntarios */público clase FibCalculator extensiones Fibonacci implementos Calculadora {} privado estática Mapa.Integer, Integer memoizados = nuevo HashMap(); /* * El método principal escrito como sigue es utilizado por el JVM como punto de partida * para el programa. */ público estática vacío principal()String[] args) {} memoizados.#()1, 1); memoizados.#()2, 1); Sistema.Fuera..println()fibonacci()12)); // Obtener el número 12 de Fibonacci e imprimir para consolar } * * Un ejemplo de un método escrito en Java, envuelto en una clase. * Dado un número no negativo FIBINDEX, regresa * el número Nth Fibonacci, donde N es igual a FIBINDEX. *  * @param fibIndex El índice del número Fibonacci * @return the Fibonacci number */ público estática int fibonacci()int fibIndex) {} si ()memoizados.contiene Clave()fibIndex) {} retorno memoizados.#()fibIndex); } int respuesta = fibonacci()fibIndex - 1) + fibonacci()fibIndex - 2); memoizados.#()fibIndex, respuesta); retorno respuesta; }}

Clases especiales

Applet

Los applets de Java eran programas integrados en otras aplicaciones, generalmente en una página web que se mostraba en un navegador web. La API del applet de Java ahora está obsoleta desde Java 9 en 2017.

Servlet

La tecnología de servlet de Java proporciona a los desarrolladores web un mecanismo simple y coherente para ampliar la funcionalidad de un servidor web y acceder a los sistemas comerciales existentes. Los servlets son componentes Java EE del lado del servidor que generan respuestas a las solicitudes de los clientes. La mayoría de las veces, esto significa generar páginas HTML en respuesta a solicitudes HTTP, aunque hay otras clases de servlet estándar disponibles, por ejemplo, para la comunicación WebSocket.

La API de servlet de Java ha sido reemplazada hasta cierto punto (pero todavía se usa bajo el capó) por dos tecnologías estándar de Java para servicios web:

Las implementaciones típicas de estas API en servidores de aplicaciones o contenedores de servlet utilizan un servlet estándar para manejar todas las interacciones con las solicitudes y respuestas HTTP que delegan en los métodos de servicio web para la lógica comercial real.

Páginas del servidor Java

JavaServer Pages (JSP) son componentes Java EE del lado del servidor que generan respuestas, generalmente páginas HTML, a las solicitudes HTTP de los clientes. Los JSP incrustan código Java en una página HTML utilizando los delimitadores especiales <% y %>. Un JSP se compila en un servlet Java, una aplicación Java por derecho propio, la primera vez que se accede a él. Después de eso, el servlet generado crea la respuesta.

Aplicación de oscilación

Swing es una biblioteca de interfaz gráfica de usuario para la plataforma Java SE. Es posible especificar una apariencia y sensación diferente a través del sistema de apariencia y sensación enchufable de Swing. Sun proporciona clones de Windows, GTK+ y Motif. Apple también proporciona una apariencia Aqua para macOS. Cuando se consideró que faltaban implementaciones anteriores de estas apariencias, Swing en Java SE 6 aborda este problema mediante el uso de más rutinas de dibujo de widgets GUI nativos de las plataformas subyacentes.

Aplicación JavaFX

JavaFX es una plataforma de software para crear y entregar aplicaciones de escritorio, así como aplicaciones web enriquecidas que pueden ejecutarse en una amplia variedad de dispositivos. JavaFX está destinado a reemplazar a Swing como la biblioteca GUI estándar para Java SE, pero desde JDK 11, JavaFX no ha estado en el JDK central y, en cambio, en un módulo separado. JavaFX tiene soporte para computadoras de escritorio y navegadores web en Microsoft Windows, Linux y macOS. JavaFX no tiene soporte para la apariencia y el funcionamiento del sistema operativo nativo.

Genéricos

En 2004, se agregaron genéricos al lenguaje Java, como parte de J2SE 5.0. Antes de la introducción de los genéricos, cada declaración de variable tenía que ser de un tipo específico. Para las clases de contenedor, por ejemplo, esto es un problema porque no hay una manera fácil de crear un contenedor que acepte solo tipos específicos de objetos. El contenedor opera en todos los subtipos de una clase o interfaz, generalmente Object, o se debe crear una clase de contenedor diferente para cada clase contenida. Los genéricos permiten la comprobación de tipos en tiempo de compilación sin tener que crear muchas clases contenedoras, cada una de las cuales contiene un código casi idéntico. Además de habilitar un código más eficiente, se evita que ocurran ciertas excepciones en tiempo de ejecución al emitir errores en tiempo de compilación. Si Java evitara que ocurrieran todos los errores de tipo en tiempo de ejecución (ClassCastExceptions), sería seguro para el tipo.

En 2016, se demostró que el sistema de tipos de Java no era sólido, ya que es posible usar genéricos para construir clases y métodos que permitan asignar una instancia de una clase a una variable de otra clase no relacionada. El compilador acepta dicho código, pero falla en tiempo de ejecución con una excepción de conversión de clase.

Crítica

Las críticas dirigidas a Java incluyen la implementación de genéricos, la velocidad, el manejo de números sin signo, la implementación de aritmética de punto flotante y un historial de vulnerabilidades de seguridad en la implementación principal de Java VM HotSpot.

Bibliotecas de clases

La biblioteca de clases de Java es la biblioteca estándar, desarrollada para admitir el desarrollo de aplicaciones en Java. Está controlado por Oracle en cooperación con otros a través del programa Java Community Process. Las empresas o personas que participan en este proceso pueden influir en el diseño y desarrollo de las API. Este proceso ha sido objeto de controversia durante la década de 2010. La biblioteca de clases contiene características tales como:

Documentación

Javadoc es un completo sistema de documentación creado por Sun Microsystems. Proporciona a los desarrolladores un sistema organizado para documentar su código. Los comentarios de Javadoc tienen un asterisco adicional al principio, es decir, los delimitadores son /** y */, mientras que los comentarios normales de varias líneas en Java están delimitados por /* y */, y los comentarios de una sola línea comienzan con //.

Implementaciones

Oracle Corporation es el propietario actual de la implementación oficial de la plataforma Java SE, luego de la adquisición de Sun Microsystems el 27 de enero de 2010. Esta implementación se basa en la implementación original de Java por parte de Sun. La implementación de Oracle está disponible para Microsoft Windows (todavía funciona para XP, mientras que actualmente solo las versiones posteriores son oficialmente compatibles), macOS, Linux y Solaris. Debido a que Java carece de cualquier estandarización formal reconocida por Ecma International, ISO/IEC, ANSI u otras organizaciones de estándares de terceros, la implementación de Oracle es el estándar de facto.

La implementación de Oracle está empaquetada en dos distribuciones diferentes: Java Runtime Environment (JRE), que contiene las partes de la plataforma Java SE necesarias para ejecutar programas Java y está destinada a usuarios finales, y Java Development Kit (JDK), que está destinado a desarrolladores de software e incluye herramientas de desarrollo como el compilador de Java, Javadoc, Jar y un depurador. Oracle también ha lanzado GraalVM, un compilador e intérprete dinámico de Java de alto rendimiento.

OpenJDK es otra implementación notable de Java SE que tiene licencia GNU GPL. La implementación comenzó cuando Sun comenzó a publicar el código fuente de Java bajo la licencia GPL. A partir de Java SE 7, OpenJDK es la implementación oficial de referencia de Java.

El objetivo de Java es hacer que todas las implementaciones de Java sean compatibles. Históricamente, la licencia de marca registrada de Sun para el uso de la marca Java insiste en que todas las implementaciones sean compatibles. Esto dio lugar a una disputa legal con Microsoft después de que Sun afirmara que la implementación de Microsoft no era compatible con RMI o JNI y que había agregado funciones propias específicas de la plataforma. Sun demandó en 1997 y, en 2001, ganó un acuerdo de 20 millones de dólares, así como una orden judicial que hacía cumplir los términos de la licencia de Sun. Como resultado, Microsoft ya no distribuye Java con Windows.

Java independiente de la plataforma es esencial para Java EE, y se requiere una validación aún más rigurosa para certificar una implementación. Este entorno permite aplicaciones portátiles del lado del servidor.

Uso fuera de la plataforma Java

El lenguaje de programación Java requiere la presencia de una plataforma de software para que se ejecuten los programas compilados.

Oracle proporciona la plataforma Java para usar con Java. El SDK de Android es una plataforma de software alternativa, utilizada principalmente para desarrollar aplicaciones de Android con su propio sistema GUI.

Android

El lenguaje Java es un pilar clave en Android, un sistema operativo móvil de código abierto. Aunque Android, basado en el kernel de Linux, está escrito en gran parte en C, el SDK de Android usa el lenguaje Java como base para las aplicaciones de Android, pero no usa ninguna de sus GUI estándar, SE, ME u otros estándares establecidos de Java. El lenguaje de código de bytes admitido por el SDK de Android es incompatible con el código de bytes de Java y se ejecuta en su propia máquina virtual, optimizada para dispositivos con poca memoria, como teléfonos inteligentes y tabletas. Dependiendo de la versión de Android, el código de bytes es interpretado por la máquina virtual Dalvik o compilado en código nativo por Android Runtime.

Android no proporciona la biblioteca estándar completa de Java SE, aunque el SDK de Android incluye una implementación independiente de un gran subconjunto. Es compatible con Java 6 y algunas funciones de Java 7, y ofrece una implementación compatible con la biblioteca estándar (Apache Harmony).

Controversia

El uso de tecnología relacionada con Java en Android dio lugar a una disputa legal entre Oracle y Google. El 7 de mayo de 2012, un jurado de San Francisco determinó que si las API podían tener derechos de autor, entonces Google había infringido los derechos de autor de Oracle mediante el uso de Java en dispositivos Android. El juez de distrito William Alsup dictaminó el 31 de mayo de 2012 que las API no pueden tener derechos de autor, pero el Tribunal de Apelaciones del Circuito Federal de los Estados Unidos lo revocó en mayo de 2014. El 26 de mayo de 2016, el tribunal de distrito decidió a favor de Google., dictaminar la infracción de derechos de autor de la API de Java en Android constituye un uso justo. En marzo de 2018, este fallo fue anulado por la Corte de Apelaciones, que envió el caso de determinación de daños a la corte federal de San Francisco. Google presentó una petición de certiorari ante la Corte Suprema de los Estados Unidos en enero de 2019 para impugnar los dos fallos emitidos por la Corte de Apelaciones a favor de Oracle. El 5 de abril de 2021, el Tribunal dictaminó 6-2 a favor de Google, que su uso de las API de Java debe considerarse uso justo. Sin embargo, el tribunal se negó a dictaminar sobre la propiedad intelectual de las API y, en su lugar, decidió determinar su decisión considerando que la API de Java es susceptible de derechos de autor 'simplemente por el bien del argumento'.

Obras citadas

  • Gosling, James; Joy, Bill; Steele, Guy; Bracha, Gilad; Buckley, Alex (2014). Especificación del lenguaje Java® (PDF) (Java SE 8 ed.). Archivado (PDF) original el 21 de octubre de 2014. Retrieved 18 de noviembre, 2014.
  • Gosling, James; Joy, Bill; Steele, Guy L. Jr.; Bracha, Gilad (2005). La especificación de Java Language (3rd ed.). Addison-Wesley. ISBN 0-321-24678-0. Archivado desde el original el 14 de febrero de 2012. Retrieved 8 de febrero, 2019.
  • Lindholm, Tim; Yellin, Frank (1999). La especificación de la máquina virtual de Java (2a edición). Addison-Wesley. ISBN 0-201-43294-3. Archivado desde el original el 25 de septiembre de 2011. Retrieved 8 de febrero, 2019.