Java | |
---|---|
clase de idioma | lenguaje de programación multiparadigma ,y software JVM |
Apareció en | 1995 |
Autor | James Gosling y Sun Microsystems |
Desarrollador | Sun Microsystems y Oracle |
extensión de archivo | .java, .class, o .jar_.jad.jmod |
Liberar | Java SE 18.0.2.1 ( 18 de agosto de 2022 ) |
sido influenciado | C++ , C , Ada , Simula 67 , Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C# , UCSD Pascal , envoltorio , función variable , anotación Java , Nicklaus Wirth , Patrick Naughton [d] y foreach |
Licencia | GNU GPL [1] |
Sitio web | oracle.com/ru/java/ |
Archivos multimedia en Wikimedia Commons |
Java [aprox. 1] es un lenguaje de programación orientado a objetos de propósito general fuertemente tipado desarrollado por Sun Microsystems (posteriormente adquirido por Oracle ). El desarrollo es impulsado por una comunidad organizada a través del Proceso de la Comunidad de Java ; el lenguaje y las tecnologías subyacentes que lo implementan se distribuyen bajo la licencia GPL . Los derechos de marca registrada son propiedad de Oracle Corporation .
Las aplicaciones Java generalmente se traducen a un código de bytes especial , por lo que pueden ejecutarse en cualquier arquitectura de computadora para la cual haya una implementación de la Máquina Virtual Java . La fecha de lanzamiento oficial es el 23 de mayo de 1995. Ocupa un lugar destacado en las clasificaciones de popularidad de lenguajes de programación (segundo lugar en las clasificaciones IEEE Spectrum (2020) [2] y TIOBE (2021) [3] ).
El lenguaje originalmente se llamaba Oak ("Oak"), desarrollado por James Gosling para programar dispositivos electrónicos de consumo. Debido a que ya existía un lenguaje con ese nombre, se cambió el nombre de Oak a Java [4] . Debe su nombre a la marca de café Java, que a su vez recibió el nombre de la isla del mismo nombre ( Java ), por lo que el emblema oficial de la lengua muestra una taza de café caliente. Existe otra versión del origen del nombre del idioma, asociada a una alusión a una máquina de café como ejemplo de dispositivo doméstico para programar del cual se creó originalmente el idioma. De acuerdo con la etimología, en la literatura en ruso desde finales del siglo XX hasta los primeros años del siglo XXI, el nombre del idioma a menudo se traducía como Java y no se transcribía.
Como resultado del proyecto, el mundo vio un dispositivo fundamentalmente nuevo, la computadora personal de bolsillo Star7 [5] , que se adelantó a su tiempo por más de 10 años, pero debido al alto costo de $ 50, no pudo revolucionar el mundo de la tecnología y fue olvidado.
El dispositivo Star7 no fue popular, a diferencia del lenguaje de programación Java y su entorno. La siguiente etapa en la vida de la lengua fue el desarrollo de la televisión interactiva. En 1994 quedó claro que la televisión interactiva era un error.
Desde mediados de la década de 1990, el lenguaje se ha vuelto ampliamente utilizado para escribir aplicaciones de cliente y software de servidor . Al mismo tiempo, la tecnología de los applets de Java , aplicaciones gráficas de Java integradas en páginas web, ganó cierta popularidad; Con la llegada de las capacidades de página web dinámica en la década de 2000, la tecnología se volvió menos utilizada.
El desarrollo web utiliza Spring Framework ; la utilidad Javadoc se utiliza para la documentación .
Los programas de Java se traducen al código de bytes de Java , que es ejecutado por la Máquina Virtual de Java (JVM), un programa que procesa el código de bytes y pasa instrucciones al hardware como un intérprete .
La ventaja de esta forma de ejecutar programas es la total independencia del bytecode del sistema operativo y del hardware , lo que permite ejecutar aplicaciones Java en cualquier dispositivo para el que exista una máquina virtual correspondiente. Otra característica importante de la tecnología Java es un sistema de seguridad flexible, en el que la máquina virtual controla completamente la ejecución del programa. Cualquier operación que exceda los permisos establecidos del programa (como el intento de acceso no autorizado a los datos o la conexión a otra computadora) provoca un aborto inmediato.
A menudo, las desventajas del concepto de máquina virtual incluyen la degradación del rendimiento. Una serie de mejoras aumentaron ligeramente la velocidad de los programas Java:
Según el sitio shootout.alioth.debian.org, para siete tareas diferentes, el tiempo de ejecución en Java es en promedio de una vez y media a dos veces más largo que para C / C ++, en algunos casos Java es más rápido y en algunos casos es 7 veces más lento [6] . Por otro lado, para la mayoría de ellos, el consumo de memoria de una máquina Java era de 10 a 30 veces mayor que el de un programa C/C++. También cabe destacar un estudio realizado por Google , según el cual existe un rendimiento significativamente menor y un mayor consumo de memoria en casos de prueba en Java en comparación con programas similares en C++ [7] [8] [9] .
Las ideas detrás del concepto y varias implementaciones del entorno de máquina virtual de Java han inspirado a muchos entusiastas a ampliar la lista de lenguajes que podrían usarse para crear programas que se ejecutan en una máquina virtual [10] . Estas ideas también se expresan en la especificación de Common Language Infrastructure ( CLI ) que sustenta la plataforma .NET de Microsoft .
El desarrollo de Java comenzó en 1990, la primera versión oficial, Java 1.0, se lanzó solo el 21 de enero de 1996.
La segunda versión fue lanzada el 19 de febrero de 1997 [11] .
Fecha de lanzamiento 8 de diciembre de 1998 [12] . Zona de juegos con nombre en clave. En este caso, hay confusión. Se han publicado libros, por ejemplo, Beginning Java 2 de Ivor Horton (marzo de 1999), de hecho sobre J2SE 1.2 (anteriormente llamado Java 2). Sin embargo, hasta el día de hoy se publican tales libros, por ejemplo: H. M. Deitel, P. J. Deitel, S. I. Santry. Tecnologías de programación Java 2. Aplicaciones distribuidas (2011).
En un momento en que se sabe que Java 2 ha sido reemplazado históricamente por versiones posteriores, los títulos de estos libros son engañosos en cuanto a la versión de Java sobre la que realmente se escriben. Si se considera que J2SE 1.2 es Java 2, pero los autores de los libros de Java 2 aceptan JDK 7, esto genera una completa confusión.
Fecha de estreno 8 de mayo de 2000. Nombre en clave Kestrel.
Fecha de lanzamiento 6 de febrero de 2002. Nombre en clave Merlín.
La especificación Java 5.0 se lanzó el 30 de septiembre de 2004, con el nombre en código Tiger. Desde esta versión, la indexación oficial ha cambiado, en lugar de Java 1.5, es más correcto llamar a Java 5.0. La indexación interna de Sun sigue siendo la misma: 1.x. Los cambios menores ahora se incluyen sin cambiar la indexación, para esto se usa la palabra "Actualizar" o la letra "u", por ejemplo, Java Development Kit 5.0 Actualización 22. Se supone que las actualizaciones pueden incluir tanto correcciones de errores como pequeñas adiciones al API, JVM.
En esta versión, los desarrolladores han realizado una serie de adiciones fundamentales al lenguaje:
La versión fue lanzada el 11 de diciembre de 2006, con el nombre en código Mustang. Se ha cambiado la indexación oficial: en lugar de la 6.0 esperada, la versión aparece como 6. Se realizan cambios menores, como en Java 5.0, en las actualizaciones regulares de la versión, por ejemplo, Java Standard Edition Development Kit 6 Update 27. Los siguientes cambios ha sido hecho:
Fecha de estreno 8 de octubre de 2013.
JavaFX 2.2 está incluido en la actualización 6 de Java SE 7 [15] . A partir de la versión 11, el módulo se envía por separado del JDK [16] .
Fecha de lanzamiento 10 de octubre de 2013. Nombre en clave Micro Edición.
La versión fue lanzada el 28 de julio de 2011, con el nombre en clave Dolphin [17] . La versión final de Java Standard Edition 7 no incluyó todos los cambios planeados previamente. De acuerdo con el plan de desarrollo (plan "B") [18] , la inclusión de innovaciones se dividirá en dos partes: Java Standard Edition 7 (sin el cálculo lambda , el proyecto Jigsaw y parte de las mejoras del proyecto Coin [ 19] ) y Java Standard Edition 8 (todos los demás), prevista para finales de 2012.
En la nueva versión, denominada Java Standard Edition 7 (Java Platform, Standard Edition 7), además de corregir una gran cantidad de errores, se introdujeron varias innovaciones. Así, por ejemplo, no se utilizó el paquete propietario JDK , sino su implementación abierta OpenJDK como implementación de referencia de Java Standard Edition 7 , y el lanzamiento de la nueva versión de la plataforma se preparó en estrecha colaboración entre los ingenieros de Oracle y los miembros de la ecosistema global de Java, el comité JCP (Java Community Process) y por la comunidad OpenJDK . Todos los archivos binarios de implementación de referencia de Java Standard Edition 7 suministrados por Oracle se construyen sobre la base de código OpenJDK , y la implementación de referencia en sí es completamente de código abierto bajo la licencia GPLv2 con excepciones GNU ClassPath para permitir la vinculación dinámica a productos patentados. Otras innovaciones incluyen la integración de un conjunto de pequeñas mejoras del lenguaje Java desarrolladas por el proyecto Coin, soporte adicional para lenguajes de programación de escritura dinámica como Ruby , Python y JavaScript , soporte para cargar clases por URL , una pila XML actualizada que incluye JAXP. 1.4, JAXB 2.2a y JAX-WS 2.2 y otros [20] .
En los 5 días previos al lanzamiento de Java Standard Edition 7, se descubrieron varios errores graves en la optimización de bucle en caliente, que está habilitada de forma predeterminada y hace que la máquina virtual de Java se bloquee. Los especialistas de Oracle no pudieron corregir los errores encontrados en tan poco tiempo, pero prometieron que serían corregidos en la segunda actualización (Java 7 Update 2) y parcialmente en la primera [21] .
Lista de novedadesLa versión fue lanzada el 19 de marzo de 2014. Pulpo de nombre en clave.
Lista de novedadesDebido a las dificultades para implementar el sistema modular dentro del proyecto Jigsaw, el lanzamiento de la versión, originalmente programado para el 22 de septiembre de 2016, se pospuso varias veces: primero, la fecha se movió al 23 de marzo de 2017 , luego al 27 de julio de 2017 , y luego al 21 de julio de 2017. Septiembre de 2017 [25] [26] [27] .
La última fecha se ha convertido en la fecha de lanzamiento oficial de la versión [28] .
Lista de novedadesFecha de lanzamiento: 20 de marzo de 2018 [38] .
Lista de novedadesLa lista parcial oficial de funciones y el plan de lanzamiento se encuentra en el sitio web de OpenJDK .
La lista parcial oficial de funciones y el plan de lanzamiento se encuentra en el sitio web de OpenJDK . La fecha de lanzamiento es el 25 de septiembre de 2018.
Lista de novedadesDentro de Java, hay varias familias importantes de tecnologías:
Microsoft ha desarrollado su propia implementación de JVM llamada Microsoft Java Virtual Machine.(MSJVM) [58] , que se incluyó en varios sistemas operativos a partir de Windows 98 (también incluido en Internet Explorer desde la versión 3 y superior, lo que hizo posible usar MSJVM en Windows 95 y Windows NT 4 después de instalar IE3 + en estos SO).
MSJVM tenía diferencias significativas con Sun Java, rompiendo en muchos sentidos el concepto fundamental de portabilidad de programas entre diferentes plataformas:
La estrecha integración de Java con DCOM y Win32 ha puesto en duda el paradigma multiplataforma del lenguaje. Posteriormente, este fue el motivo de las demandas de Sun Microsystems contra Microsoft. El tribunal se puso del lado de Sun Microsystems. Finalmente, se llegó a un acuerdo entre las dos empresas sobre la posibilidad de ampliar el período de soporte oficial para los usuarios de la JVM no estándar de Microsoft hasta finales de 2007 [58] .
En 2005, Microsoft introdujo un lenguaje similar a Java J# para la plataforma .NET , que no corresponde a la especificación oficial del lenguaje Java y posteriormente fue excluido del kit de herramientas estándar para desarrolladores de Microsoft Visual Studio , comenzando con Visual Studio 2008 [59] .
El lenguaje Java se usa activamente para crear aplicaciones móviles para el sistema operativo Android. Al mismo tiempo, los programas se compilan en un código de bytes no estándar para que los use su máquina virtual Dalvik (a partir de Android 5.0 Lollipop , la máquina virtual ha sido reemplazada por ART ). Para tal compilación, se utiliza una herramienta adicional, a saber, Android SDK ( Software Development Kit ), desarrollado por Google .
El desarrollo de aplicaciones se puede realizar en Android Studio , NetBeans , Eclipse mediante el complemento de herramientas de desarrollo de Android (ADT) o IntelliJ IDEA . La versión de JDK debe ser 5.0 o superior.
El 8 de diciembre de 2014, Android Studio fue reconocido por Google como el entorno de desarrollo oficial para el sistema operativo Android.
Los siguientes proyectos exitosos se han implementado utilizando tecnologías Java ( J2EE ): RuneScape , Amazon [60] [61] , eBay [62] [63] , LinkedIn [64] , Yahoo! [65] .
Las siguientes empresas se centran principalmente en tecnologías Java ( J2EE- ): SAP , IBM , Oracle . En particular, Oracle Database DBMS incluye una JVM como su componente, lo que brinda la capacidad de programar directamente el DBMS en el lenguaje Java, incluidos, por ejemplo, los procedimientos almacenados [66] .
Los programas escritos en Java tienen la reputación de ser más lentos y ocupar más RAM que los escritos en C [6] . Sin embargo, la velocidad de ejecución de los programas escritos en lenguaje Java mejoró significativamente con el lanzamiento en 1997-1998 del llamado compilador JIT en la versión 1.1, además de otras características del lenguaje para soportar un mejor análisis de código (como clases internas, clase StringBuffer[doc 5] , cálculos lógicos simplificados, etc.). Además, se ha optimizado la máquina virtual Java; desde el año 2000, se utiliza para ello la máquina virtual HotSpot . A partir de febrero de 2012, el código Java 7 es aproximadamente 1,8 veces más lento que el código C [67] .
Algunas plataformas ofrecen soporte de ejecución de hardware para Java [68] . Por ejemplo, microcontroladores que ejecutan código Java en hardware en lugar de una JVM de software y procesadores basados en ARM que admiten la ejecución de bytecode de Java a través de la opción Jazelle.
Solo hay 8 tipos primitivos (escalares, simples) en Java : boolean, byte, char, short, int, long, float, double. También hay un noveno tipo primitivo auxiliar void; sin embargo, las variables y los campos de este tipo no se pueden declarar en el código, y el tipo en sí se usa solo para describir la clase que le corresponde, para usar en reflexión : por ejemplo, usando el Void[doc. 6] puede averiguar si un determinado método es del tipo void: Hello.class.getMethod("main", String[].class).getReturnType() == Void.TYPE.
Las longitudes y los rangos de valores de los tipos primitivos están definidos por el estándar, no por la implementación, y se enumeran en la tabla. El tipo char se hizo de dos bytes por conveniencia de localización (uno de los principios ideológicos de Java): cuando se formó el estándar, ya existía Unicode -16, pero no Unicode-32. Como no quedó ningún tipo de byte único como resultado, se agregó un nuevo byte de tipo y, en Java, a diferencia de otros lenguajes, no está sin firmar. Los tipos floaty doublepueden tener valores especiales y "no un número" ( NaN ). Para el tipo doble, se denotan por , , ; para tipo : lo mismo, pero con un prefijo en lugar de . También se estandarizan los valores mínimos y máximos aceptados por los tipos y . Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaNfloatFloatDoublefloatdouble
Tipo de | Longitud (en bytes) | Rango o conjunto de valores |
---|---|---|
booleano | 1 en arreglos, 4 en variables [69] | verdadero Falso |
byte | una | −128..127 |
carbonizarse | 2 | 0..2 16 −1, o 0..65535 |
corto | 2 | −2 15 ..2 15 −1, o −32768..32767 |
En t | cuatro | −2 31 ..2 31 −1, o −2147483648..2147483647 |
largo | ocho | −2 63 ..2 63 −1, o aproximadamente −9.2 10 18 ..9.2 10 18 |
flotar | cuatro | -(2-2 −23 ) 2 127 ..(2-2 −23 ) 2 127 , o aproximadamente −3.4 10 38 ..3.4 10 38 , y también , , NaN |
doble | ocho | -(2-2 −52 ) 2 1023 ..(2-2 −52 ) 2 1023 , o aproximadamente −1.8 10 308 ..1.8 10 308 , así como , , NaN |
Esta estandarización tan rígida era necesaria para que el lenguaje fuera independiente de la plataforma, que es uno de los requisitos ideológicos de Java. Sin embargo, aún persiste un pequeño problema con la independencia de la plataforma. Algunos procesadores utilizan registros de 10 bytes para el almacenamiento intermedio de resultados o mejoran la precisión de los cálculos de otras formas. Para hacer que Java sea lo más interoperable posible entre diferentes sistemas, en las primeras versiones se prohibió cualquier forma de mejorar la precisión de los cálculos. Sin embargo, esto resultó en un rendimiento más lento. Resultó que pocas personas necesitan el deterioro de la precisión en aras de la independencia de la plataforma, especialmente si tienen que pagar por ello ralentizando el trabajo de los programas. Después de numerosas protestas, esta prohibición fue cancelada, pero se agregó la palabra clave strictfp, que prohíbe aumentar la precisión.
Transformaciones en operaciones matemáticasEl lenguaje Java tiene las siguientes reglas:
Este método de conversión implícita de tipos incorporados coincide completamente con la conversión de tipos en C / C++ [70] .
El lenguaje Java solo tiene objetos creados dinámicamente. Las variables de tipo de objeto y los objetos en Java son entidades completamente diferentes. Las variables de un tipo de objeto son referencias , es decir, análogos de punteros a objetos creados dinámicamente. Esto se enfatiza mediante la sintaxis de la declaración de variables. Así que el código C++ podría verse así:
doble a [ 10 ][ 20 ] ; foo b ( 30 );Pero lo mismo en Java se verá muy diferente:
doble [][] a = nuevo doble [ 10 ][ 20 ] ; Foo b = nuevo Foo ( 30 );Durante las asignaciones, el paso a subrutinas y las comparaciones, las variables de objeto se comportan como punteros, es decir, las direcciones de los objetos se asignan, copian y comparan. Y al acceder a campos de datos o métodos de un objeto con una variable de objeto, no se requieren operaciones especiales de desreferenciación : el acceso se realiza como si la variable de objeto fuera el objeto mismo.
Las variables de objeto son variables de cualquier tipo, excepto primitivas. No hay punteros explícitos en Java. A diferencia de los punteros en C, C++ y otros lenguajes de programación, las referencias en Java son muy seguras debido a las estrictas restricciones de su uso.
Gracias a estas restricciones especialmente introducidas, la manipulación directa de la memoria a nivel de direcciones físicas es imposible en Java (aunque el valor de la referencia que apunta a nada está definido: null).
Si se necesita un puntero a un tipo primitivo, se utilizan clases contenedoras de tipos primitivos: Boolean, Byte, Character, Short, Integer, Long, Float, Double.
Duplicación de enlaces y clonaciónAl asignar, el objeto no se copia, ya que las variables de objeto son variables de referencia. Entonces, si escribes
Foo foo , bar ; ... barra = foo ;luego la dirección se copiará de variable fooa variable bar. Es decir, fooy barapuntará a la misma zona de memoria, es decir, al mismo objeto; intentar cambiar los campos del objeto al que hace referencia la variable foocambiará el objeto al que hace referencia la variable bary viceversa. Si es necesario obtener solo una copia más del objeto original, usan un método (función miembro, en la terminología de C ++) clone ()que crea una copia del objeto o (con menos frecuencia) un constructor de copias ( constructores en Java ). no puede ser virtual, por lo que el constructor de la clase antecesora copiará incorrectamente una instancia de una clase descendiente; el método de clonación invoca al constructor deseado y, por lo tanto, elude esta limitación).
Método clone()[doc. 7] requiere una clase para implementar una interfaz Cloneable[doc. 8] . Si una clase implementa la interfaz Cloneable, por defecto clone()copia todos los campos ( copia superficial ). Si desea clonar campos (así como sus campos, etc.) en lugar de copiarlos, debe anular el archivo clone(). Definir y usar un método clone()es a menudo una tarea no trivial [72] .
Inicialización de variablesTodas las variables requieren una definición explícita o se rellenan automáticamente con ceros (0, null, false). Así, desaparecen los heisenbugs asociados al uso accidental de memoria no inicializada, propios de lenguajes de bajo nivel como C.
Recogida de basuraEn el lenguaje Java, no es posible eliminar explícitamente un objeto de la memoria; en su lugar, se implementa la recolección de elementos no utilizados . Un truco tradicional para darle al recolector de basura una "pista" para desasignar memoria es establecer una variable en null null, lo que puede ser efectivo cuando necesita desasignar un objeto que ya no es necesario y al que se hace referencia en un objeto de larga duración [73 ] . Esto, sin embargo, no significa que el objeto reemplazado por el valor nullse eliminará de forma segura e inmediata, pero hay una garantía de que este objeto se eliminará en el futuro. Esta técnica solo elimina la referencia al objeto, es decir, desvincula el puntero del objeto en la memoria. En este caso, debe tenerse en cuenta que el recolector de basura no eliminará el objeto siempre que al menos una referencia de las variables u objetos utilizados apunte a él. También hay métodos para iniciar una recolección de basura forzada, pero no se garantiza que sean llamados por el tiempo de ejecución y no se recomiendan para un uso normal.
Java no es un lenguaje de procedimientos: cualquier función solo puede existir dentro de una clase. Esto es enfatizado por la terminología del lenguaje Java, donde no hay conceptos de "función" o "función miembro" ( función miembro en inglés ), sino solo un método . Las funciones estándar también se han convertido en métodos. Por ejemplo, en Java no hay función , pero hay un método de clase (que contiene, además de , métodos , y muchos otros). Los constructores en Java no se consideran métodos. No hay destructores en Java, y un método de ninguna manera debe considerarse análogo a un destructor. sin()Math.sin()Mathsin()cos()exp()sqrt()abs()finalize()
ConstructoresUn constructor es un método especial que necesariamente se llama cuando se crea un nuevo objeto, es decir, no se puede crear un objeto (una instancia de una clase) sin llamar al constructor de la clase. No siempre es conveniente inicializar todas las variables de una clase cuando se instancia, por lo que las variables de instancia a menudo se declaran dentro del cuerpo de un constructor, pero se inicializan como argumentos del constructor cuando se instancia la clase. A veces es más fácil tener algunos valores creados por defecto cuando se crea el objeto. En este caso, las variables se declaran e inicializan dentro del cuerpo del constructor.
Un constructor inicializa un objeto directamente en el momento de la creación. El nombre del constructor es el mismo que el nombre de la clase, incluido el caso, y la sintaxis de un constructor es similar a la de un método sin valor de retorno.
Gato int privado (); // así es como el método llamado Cat se parece a Cat (); // así es como se ve el constructor de la clase CatA diferencia de un método, un constructor nunca devuelve nada.
Un constructor define las acciones a realizar cuando se crea un objeto de una clase y es una parte importante de una clase. Como regla general, los programadores intentan especificar explícitamente un constructor. Si no hay un constructor explícito, Java creará automáticamente uno (vacío) para uso predeterminado.
Como ejemplo, considere una clase Boxque representa una descripción de una caja. El constructor de la clase simplemente establecerá las dimensiones iniciales de la caja.
classBox { int ancho ; _ // ancho de caja int altura ; // altura del cuadro int profundidad ; // profundidad de la caja // Caja de constructores ( int a , int b ) { ancho = a ; altura = b ; profundidad = 10 ; } // calcular el volumen de la caja int getVolume () { return ancho * alto * profundidad ; } } Métodos y campos estáticosJava (al igual que C++) utiliza campos estáticos y métodos estáticos ( método estático ; en la teoría de la programación también se denominan métodos de clase), que se especifican mediante la palabra clave . Los campos estáticos (variables de clase) tienen el mismo significado que en C++: cada uno de estos campos es propiedad de la clase, por lo que no necesita crear instancias de la clase correspondiente para acceder a los campos estáticos. static
Por ejemplo, funciones matemáticas implementadas en la clase Math[doc. 9] son solo métodos estáticos de esta clase. Por lo tanto, se pueden llamar directamente desde la clase sin crear una instancia de la misma, por ejemplo:
doble x = Matemáticas . pecado ( 1 );Está prohibido crear una instancia de una clase estática utilizando un constructor privado. Por ejemplo, crear una instancia de una clase Mathgenerará un error en tiempo de compilación:
Matemáticas m = nueva Matemáticas (); // Error: Math() tiene acceso privado en java.lang.Math double x = m . pecado ( 1 ); // El objeto no tendría método sin, ya que es estáticoDado que los métodos estáticos existen independientemente de los objetos (instancias de una clase), no tienen acceso a campos y métodos regulares (no estáticos) de la clase dada. En particular, al implementar un método estático, NO DEBE usar el identificador this.
La función de importación estática le permite llamar a funciones y constantes estáticas sin especificar una clase. Ejemplo sin importación estática:
doble x = Matemáticas . sin ( Math . tan ( Math . sqrt ( y )) + Math . piso ( 24.5 )) + Math . cos ( 42 * Matemáticas . PI );El mismo ejemplo, pero con importaciones estáticas:
importar java.lang.Math.* estático ; ... doble x = sin ( tan ( sqrt ( y )) + piso ( 24.5 )) + cos ( 42 * PI ); Finalización (final)La palabra clave final(final) tiene diferentes significados al describir un campo, método o clase.
En Java, los métodos que no se declaran explícitamente como static, finalo private, son virtuales en la terminología de C++: llamar a un método definido de manera diferente en la base y las clases heredadas siempre realiza una verificación en tiempo de ejecución.
Un método abstracto (modificador abstract) en Java es un método que tiene parámetros y un tipo de retorno, pero no tiene cuerpo. Un método abstracto se define en clases derivadas. El análogo de un método abstracto en C++ es una función virtual pura. Para que una clase pueda describir métodos abstractos, la clase misma también debe declararse abstracta. No se pueden crear objetos de clase abstracta.
InterfacesEl mayor grado de abstracción en Java es la interfaz (modificador interface). La interfaz contiene principalmente métodos abstractos que tienen un nivel de acceso público: descriptores abstracty publicni siquiera son necesarios para ellos. Sin embargo, desde Java 8 y 9, se introdujo la capacidad de uso en interfaces.
- Java 8: métodos estáticos ( static) y métodos predeterminados ( default);
- Java 9: métodos con nivel de acceso private.
Estos métodos contienen un cuerpo, lo que significa que no son abstractos, pero en una implementación específica de la interfaz, los defaultmétodos pueden anularse.
Una interfaz en Java no se considera una clase, aunque en realidad es una clase completamente abstracta. Una clase puede heredar/ extender ( extends) otra clase o implementar ( implements) una interfaz. Además, una interfaz puede heredar/extender ( extends) otra interfaz.
En Java, una clase no puede heredar de más de una clase, pero puede implementar múltiples interfaces. La herencia múltiple de interfaces no está prohibida, es decir, una interfaz se puede heredar de varias.
Las interfaces se pueden utilizar como tipos de parámetros de método. Las interfaces no se pueden instanciar.
Interfaces de marcadorJava tiene interfaces que no contienen métodos para la implementación, pero que la JVM maneja de una manera especial: Cloneable, Serializable, RandomAccess, Remote.
Plantillas en Java (genéricos)A partir de Java 5.0, apareció un mecanismo de programación genérico en el lenguaje : plantillas que se parecen mucho a las plantillas de C ++. Usando una sintaxis especial en la descripción de clases y métodos, puede especificar parámetros de tipo que se pueden usar dentro de la descripción como tipos de campos, parámetros y valores de retorno de métodos.
// Declaración de clase genérica class GenericClass < E > { E getFirst () { ... } void add ( E obj ) { ... } } // Usando una clase genérica en código GenericClass < String > obj = new GenericClass <> (); objeto _ añadir ( "qwerty" ); Cadena p = obj . obtenerPrimero ();Se permite la declaración genérica de clases, interfaces y métodos. Además, la sintaxis admite declaraciones de parámetros de tipo restringido: especificar una construcción de tipo en la declaración <T extends A & B & C...>requiere que el parámetro de tipo T implemente las interfaces A, B, C, etc.
A diferencia de las plantillas de C#, las plantillas de Java no son compatibles con el tiempo de ejecución: el compilador simplemente crea un código de bytes, en el que ya no hay plantillas. La implementación de plantillas en Java es fundamentalmente diferente de la implementación de mecanismos similares en C ++: el compilador no genera una variante separada de una clase o método de plantilla para cada caso de uso de una plantilla, sino que simplemente crea una implementación de código de bytes único que contiene las comprobaciones de tipos y conversiones necesarias. Esto lleva a una serie de restricciones en el uso de plantillas en programas Java.
Comprobando la pertenencia a una claseEn Java, puede verificar explícitamente a qué clase pertenece un objeto. La expresión foo instanceof Fooes igual truesi el objeto foopertenece a una clase Foooa su descendiente, o implementa una interfaz Foo(o, más generalmente, hereda una clase que implementa una interfaz que hereda Foo).
Además, la función getClass()[doc. 10] , definido para todos los objetos, produce un objeto de tipo Class<?>. Para cada clase, se crea como máximo un objeto del tipo que la describe Class, por lo que estos objetos se pueden comparar. Entonces, por ejemplo, foo.getClass() == bar.getClass()será verdadero si los objetos fooy barpertenecen a la misma clase.
Además, Class<?>se puede obtener un objeto de cualquier tipo así: Integer.class, Object.class.
La comparación directa de clases no siempre es el mejor medio para verificar la pertenencia a una clase. A menudo, se utiliza una función en su lugar isAssignableFrom(). Esta función se define en un objeto de tipo Classy toma un objeto de tipo como Class<?>parámetro. Por lo tanto, la llamada Foo.class.isAssignableFrom(Bar.class)regresará truesi Fooes un ancestro de la clase Bar. Dado que todos los objetos son descendientes de tipo Object, la llamada Object.class.isAssignableFrom()siempre regresará true.
En conjunto con las funciones mencionadas del tipo objeto Class, las funciones isInstance[doc. 11] (equivale a instanceof), así como cast()(convierte el parámetro en un objeto de la clase seleccionada).
El manejo de errores en Java es similar al manejo de errores en C++ excepto por la necesidad de un archivo finally. Esta diferencia se debe al hecho de que Java no puede adherirse al concepto de RAII debido a la presencia de un recolector de basura, y la liberación automática de recursos en el destructor puede ocurrir en un orden impredecible a intervalos arbitrarios.
El manejo de errores se realiza mediante los operadores try, catchy finally. El error lanzado es descrito por un objeto de cierta clase que hereda de Throwable[doc. 12] y correspondiente al tipo de error. Dentro del bloque tryhay un código que puede generar una excepción y el bloque catchdetecta los tipos de errores especificados por el programador. En este caso, puede especificar más de un bloque catchpara manejar diferentes clases de errores o capturas múltiples para manejar múltiples errores. El bloque es opcional, pero si está presente, se ejecuta independientemente de la ocurrencia de un error y tiene como objetivo liberar los recursos finallyasignados durante la operación del bloque .try
Desde Java 7 la interfaz AutoCloseable[doc. 13] , que le permite implementar clases que liberan recursos automáticamente. Los objetos de tales clases deben crearse entre paréntesis antes del try. Un ejemplo simple de desasignación automática de recursos es leer el contenido de un archivo:
importar java.io.* ; clase pública Principal { public static void main ( String [] args ) lanza IOException { if ( argumentos . longitud < 2 ) { sistema _ error _ println ( "No se especificó nombre de archivo." ); volver ; } Cadena nombre de archivo = argumentos [ 1 ] ; // El archivo abierto se cerrará automáticamente por error intente ( lector BufferedReader = nuevo BufferedReader ( nuevo FileReader ( nombre de archivo ))) { línea de cuerda ; for ( int n = 1 ; ( línea = lector . readLine ()) != null ; ++ n ) { sistema _ fuera _ println ( n + ": " + línea ); } } captura ( Excepción FileNotFound e ) { sistema _ error _ println ( "No se encontró el archivo especificado" ); } // finalmente { // lector.cerrar(); // cierre automático de recursos // } } }Java se adhiere al concepto de especificación obligatoria de las clases de error que puede arrojar un método. Esto se hace usando una palabra clave throwsdespués de la descripción del método. Si el método no especifica una clase de excepción (o su ancestro) que se pueda generar desde el método, se producirá un error de compilación. Se suponía que el concepto haría que el código se documentara a sí mismo, indicando qué excepciones puede lanzar un método en particular, pero en la práctica rara vez se justifica, porque debido a diversas circunstancias, un programador puede especificar una clase como una excepción para ser lanzada Exceptiono encerrar problemas. partes de un método en un bloque try... catchpara ignorar errores individuales, o - en el bloque try... finally, ocultando todos los posibles errores. La desventaja del concepto es también que el propio programador debe definir y prescribir las excepciones que el método puede arrojar [74] .
La idea de los espacios de nombres está plasmada en los paquetes de Java .
El nombre del paquete Java está en latín (minúsculas y mayúsculas) con números (no el primero de la línea) y un guión bajo (ni el primero ni el último), que no son instrucciones de idioma (nota if, null), separados por puntos .
Ejemplos de nombres correctos:
Ejemplos de nombres incorrectos:
Los paquetes contienen clases, interfaces, enumeraciones, anotaciones (etc.) cuyos nombres son latinos (minúsculas y mayúsculas) con números (no el primero de una línea). Solo puede haber una clase pública, interfaz (etc.) en un archivo. El nombre de la clase pública, interfaz (etc.) en el archivo debe coincidir con el nombre del archivo. Cada clase tiene su propio espacio de nombres para funciones, variables y subclases, subinterfaces (etc.), y puede obtener una subclase de una clase usando OuterClass.InnerClass, o puede usar OuterClass$InnerClass, por lo que no se recomienda usar el símbolo de dólar en el nombre de la clase.
Código de programa "¡Hola, mundo!" .
clase hola mundo { public static void main ( String [] args ) { sistema _ fuera _ println ( "¡Hola, mundo!" ); } } Un ejemplo de uso de genéricos importar java.util.List ; importar java.util.ArrayList ; public class Sample { public static void main ( String [] args ) { // Crear un objeto a partir de una plantilla. Lista < Cadena > cadenas = new ArrayList <> (); cuerdas _ agregar ( "Hola" ); cuerdas _ añadir ( "mundo" ); cuerdas _ añadir ( "!" ); for ( var cadena : cadenas ) { System . fuera _ imprimir ( cadena + "" ); } } } Un ejemplo del uso de la reflexión. importar java.lang.reflect.Field ; importar java.lang.reflect.Method ; clase TestClass { valor int privado ; public int getValue () { valor de retorno ; } public void setValue ( int valueIn ) { this . valor = valorEn ; } } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); for ( campo var : testClass . getClass (). getDeclaredFields ()) { System . fuera _ printf ( "nombre:%s, tipo:%s \n" , campo .getName (), campo .getType (). getCanonicalName ( ) ); } for ( método var : testClass . getClass (). getDeclaredMethods ()) { System . fuera _ printf ( "nombre:%s, tipo de retorno:%s \n" , método .getName (), método .getReturnType (). getCanonicalName ( ) ); } } } Ejemplo de anotación importar java.lang.annotation.ElementType ; importar java.lang.annotation.Retention ; importar java.lang.annotation.RetentionPolicy ; importar java.lang.annotation.Target ; @Retention ( RetentionPolicy . RUNTIME ) @Target ( ElementType . TYPE ) public @interface MyAnnotation { valor booleano público () predeterminado falso ; } @MyAnnotation ( valor = verdadero ) clase pública TestClass { } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); var miAnotación = testClass . obtenerClase (). getAnnotation ( MiAnotación . clase ); if ( miAnotación != nulo ) { System . fuera _ printf ( "valor:%s \n" , miAnotación . valor ()); } } } ![]() | ||||
---|---|---|---|---|
sitios temáticos | ||||
diccionarios y enciclopedias | ||||
|
Java | |
---|---|
Plataformas | |
Tecnologías solares | |
Tecnologías clave de terceros | |
Historia |
|
Propiedades del lenguaje | |
Lenguajes de secuencias de comandos |
|
Conferencias Java |
|
Lenguajes de programación | |
---|---|
|