Java se creó
como una dispositivo de programación para ser usada en un programa de set-top-box en una pequeña operación denominada the Green Project en Sun Microsystems en el año 1991. El equipo (Green Team), compuesto por trece personas y dirigido por James Gosling, trabajó mientras 18 meses en Sand Hill Road en Menlo Park en su desarrollo. El lenguaje se denominó inicialmente Oak (por un roble que había afuera de la oficina de Gosling), despues pasó a denominarse Green tras encontrar que Oak era ya una
marca comercial registrada para adaptadores de fichas gráficas y finalmente se renombró a Java. El término Java fuesese acuñado en una cafetería frecuentada por algunos de los miembros del equipo. Pero no está diáfano si es un acrónimo o no, aunque determinadas fuesesentes señalan que podría tratarse de las iniciales de sus creadores: James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. Otros abogan por el próximo acrónimo, Just Another Vague Acronym (?sólo otro acrónimo ambiguo más?). La hipótesis que más fueseserza tiene es la que Java debe su nombre a un tipo de café disponible en la cafetería cercana, de ahí que el icono de
java sea una taza de café caliente. Un chico signo que da fueseserza a esta creencia es que los 4 primeros bytes (el número mágico) de los ficheros .class que genera el compilador, son en hexadecimal, 0xCAFEBABE. A pesar de todas estas creencias, el nombre fuesese sacado al parecer de una lista aleatoria de palabras.1 Los metas de Gosling eran implementar una máquina virtual y un lenguaje con una articula y sintaxis parecida a C++. Entre junio y julio de 1994, tras una sesión maratoniana de tres días
entre John Gaga, James Gosling, Patrick Naughton, Wayne Rosing y Eric Schmidt, el equipo reorientó la plataforma hacia la Web. Sintieron que la llegada del navegador web Mosaic, propiciaría que Internet se convirtiese en un recurso interactivo,
como el que pensaban era la televisión por cable. Naughton creó entonces un prototipo de navegador, WebRunner, que más tarde sería conocido
como HotJava. En 1994, se les hizo una demostración de HotJava y la plataforma Java a los ejecutivos de Sun. Java 1.0a pudo descargarse por primera vez en 1994, pero hubo que esperar al 23 de mayo de 1995, mientras las conferencias de SunWorld, a que vieran la luz pública Java y HotJava, el navegador Web. El acontecimiento fuesese anunciado por John Gage, el Director Científico de Sun Microsystems. El acto estuvo acompañado por una pequeña sorpresa adicional, el
aviso por fracción de Marc Andreessen, Vicepresidente Ejecutivo de Netscape, de que Java sería soportado en sus navegadores. El 9 de enero del año siguiente, 1996, Sun fundó el grupo empresarial JavaSoft para que se encargase del
desarrollo tecnológico. [1] Dos semanas más tarde la primera versión de Java fuesese publicada. La promesa inicial de Gosling era Write Once, Run Anywhere (Escríbelo una vez, ejecútalo en cualquier lugar), proporcionando un lenguaje independiente de la platamanera y un ámbito de ejecución (la JVM) ligero y gratuito para las platamaneras más populares de manera que los binarios (bytecode) de las aplicaciones Java pudiesen ejecutarse en cualquier platamanera. El ámbito de ejecución era relativamente seguro y los principales navegadores web pronto incorporaron la probabilidad de ejecutar applets Java incrustadas en las páginas web. Java ha experimentado numerosos cambios desde la versión primigenia, JDK 1.0, así
como un enorme aumento en el número de
clases y paquetes que
componen la biblioteca estándar2 . Desde J2SE 1.4, la evolución del lenguaje ha sido regulada por el JCP (Java Community Process), que usa Java Specification Requests (JSRs) para proponer y especificar cambios en la plataforma Java. El lenguaje en sí mismo está especificado en la Java Language Specification (JLS), o Especificación del Lenguaje Java. Los cambios en los JLS son gestionados en JSR 901. JDK 1.0 (23 de enero de 1996) ? Primer lanzamiento: comunicado de prensa JDK 1.1 (19 de febrero de 1997) ? Principales adiciones incluidas: comunicado de prensa una reestructuración intensiva del
modelo de eventos AWT (Abstract Windowing Toolkit) clases internas (inner classes) JavaBeans JDBC (Java Data
base Connectivity), para la integración de fundamentos de datos RMI (Remote Method Invocation) J2SE 1.2 (8 de diciembre de 1998) ? Nombre clave Playground. Esta y las próximos versiones fueron recogidas debajo la denominación Java 2 y el nombre ?J2SE? (Java 2 Platform, Standard Edition), reemplazó a JDK para
diferenciar la plataforma fundamento de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition). Otras mejoras añadidas incluían: comunicado de prensa la palabra reservada (keyword) strictfp reflexión en la programación la API gráfica ( Swing) fuese integrada en las clases escenciales la máquina virtual (JVM) de Sun fuese equipada con un compilador JIT (Just in Time) por primera vez Java Plug-in Java IDL, una implementación de IDL (Lenguaje de Descripción de Interfaz) para la interoperabilidad con CORBA Colecciones (Collections) J2SE 1.3 (8 de mayo de 2000) ? Nombre clave Kestrel. Los cambios más notables fueron:comunicado de prensa lista completa de cambios la incorporación de la máquina virtual de HotSpot JVM (la JVM de HotSpot fuese lanzada inicialmente en abril de 1999, para la JVM de J2SE 1.2) RMI fuese cambiado para que se basara en CORBA JavaSound se incluyó el Java Naming and Directory Interface (JNDI) en el paquete de bibliotecas principales (anteriormente disponible
como una extensión) Java Platform Debugger Architecture (JPDA) J2SE 1.4 (6 de febrero de 2002) ? Nombre Clave Merlin. Este fuese el primer lanzamiento de la plataforma Java extendido debajo el Proceso de la Comunidad Java
como JSR 59. Los cambios más notables fueseron: comunicado de prensalista completa de cambios Palabra reservada assert (Especificado en JSR 41.) Expresiones regulares modeladas al
estilo de las expresiones regulares Perl Encadenación de
excepciones Permite a una excepción encapsular la excepción de debajo nivel original. non-blocking NIO (New Input/Output) (Especificado en JSR 51.) Logging API (Specified in JSR 47.) API I/O para la lectura y escritura de imágenes en formatos
como JPEG o PNG Parser XML formado y procesador XSLT (JAXP) (Especificado en JSR 5 y JSR 63.) Seguridad integrada y extensiones criptográficas (JCE, JSSE, JAAS) Java Web Start incluido (El primer lanzamiento sucedió en marzo de 2001 para J2SE 1.3) (Especificado en JSR 56.) J2SE 5.0 (30 de septiembre de 2004) ? Nombre clave: Tiger. (Originalmente numerado 1.5, esta notación aún es usada internamente.[2]) Extendido debajo JSR 176, Tiger añadió un número importante de nuevas características comunicado de prensa Plantillas (genéricos) ? provee conversión de
tipos (type safety) en tiempo de compilación para
colecciones y elimina la necesidad de la mayoría de conversión de
tipos (type casting). (Especificado por JSR 14.) Meta
datos ? también llamados anotaciones, faculta a estructuras del lenguaje
como las clases o los métodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. (Especificado por JSR 175.) Autoboxing/unboxing ? Conversiones automáticas
entre tipos primitivos (Como los int) y clases de envoltura primitivas (Como Integer). (Especificado por JSR 201.) Enumeraciones ? la palabra reservada enum crea una typesafe, lista ordenada de valores (
como Dia.LUNES, Dia.MARTES, etc.). Anteriormente, esto solo permitía ser llevado a cabo por persistentes enteras o clases construidas manualmente (enum pattern). (Especificado por JSR 201.) Varargs (número de argumentos variable) ? El último parámetro de un método puede ser declarado con el nombre del tipo seguido por tres puntos (e.. void drawtext(String... lines)). En la llamada al método, puede usarse cualquier número de parámetros de ese tipo, que serán almacenados en un array para pasarlos al método. Bucle for mejorado ? La sintaxis para el bucle for se ha desarrollado con una sintaxis especial para iterar
sobre cada miembro de un array o
sobre cualquier
clase que implemente Iterable,
como la
clase estándar Collection, de la próximo forma: void displayWidgets (Iterable widgets) { for (Widget w : widgets) { w.display(); Este
ejemplo itera sobre el
objeto Iterable widgets, asignando, en orden, cada uno de los fundamentos a la variable w, y llamando al método display() de cada uno de ellos. (Especificado por JSR 201.) | Java SE 6 (11 de diciembre de 2006) ? Nombre clave Mustang. Estuvo en desarrollo debajo la JSR 270. En esta versión, Sun cambió el nombre ?J2SE? por Java SE y eliminó el ?.0″ del número de versión.[3]. Está disponible en . Los cambios más significativos introducidos en esta versión son: Incluye un nuevo marco de esfuerzo y APIs que hacen probable la mezcla de Java con lenguajes dinámicos
como PHP, Python, Ruby y JavaScript. Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java. Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP. Mejoras en la interfaz gráfica y en el rendimiento. Java SE 7 ? Nombre clave Dolphin. En el año 2006 aún se encontraba en las primeras etapas de planificación. Su lanzamiento fuese en julio de 2011. Soporte para XML dentro del propio lenguaje. Un nuevo concepto de superpaquete. Soporte para closures. Introducción de anotaciones estándar para detectar fallos en el software. No oficiales: NIO2. Java Module System. Java Kernel. Nueva API para el empleo de Días y Fechas, la cual reemplazara las antiguas clases Date y Calendar. Probabilidad de operar con clases BigDecimal usando operandos. Además de los cambios en el lenguaje, con el paso de los años se han efectuado muchos más cambios dramáticos en la biblioteca de clases de Java (Java class library) que ha crecido de unos escasos cientos de clases en JDK 1.0 hasta más de tres mil en J2SE 5.0. APIs completamente nuevas, como Swing y Java2D, han sido introducidas y muchos de los métodos y clases originales de JDK 1.0 están obsoletas. En el 2005 se
calcula en 4,5 millones el número de desarrolladores y 2.500 millones de
herramientas habilitados con tecnología Java. Características JAVA: Las características principales que nos proporciona Java respecto a cualquier otro lenguaje de programación, son Es SIMPLE Java proporciona toda la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de éstos. C++ es un lenguaje que adolece de falta de seguridad, pero C y C++ son lenguajes más difundidos, por ello Java se diseñó para ser semejante a C++ y así facilitar un veloz y sencillo aprendizaje. Java elimina muchas de las características de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y agregar características muy útiles como el garbage collector (reciclador de
memoria dinámica). No es indispensable preocuparse de liberar memoria, el reciclador se encarga de ello y como es un thread de baja prioridad,
cuando entra en acción, faculta liberar bloques de memoria muy grandes, lo que reduce la fragmentación de la memoria. Java reduce en un 50% los yerros más
comunes de programación con lenguajes como C y C++ al descartar muchas de las características de éstos,
entre las que destacan: aritmética de punteros no tienen lugar referencias registros (struct) definición de tipos (typedef) macros (#define) necesidad de liberar memoria (free) Aunque, en realidad, lo que hace es descartar las
palabras reservadas (struct, typedef), ya que las clases son algo parecido. Además, el intérprete completo de Java que hay en este momento es muy pequeño, unicamente ocupa 215 Kb de RAM Es ORIENTADO A OBJETOS Java implementa la tecnología escencial de C++ con determinadas mejoras y elimina determinadas cosas para mantener el meta de la simplicidad del lenguaje. Java labora con sus datos como
objetos y con
interfaces a esos objetos. Soporta las tres características particulares del paradigma de la orientación a objetos: encapsulación,
herencia y polimorfismo. Las plantillas de
objetos son llamadas, como en C++, clases y sus copias, instancias . Estas instancias, como en C++, requieren ser construidas y destruidas en lugares de memoria. Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolución dinámica de métodos. Esta característica deriva del lenguaje Objective C, propietario del sistema operativo Next. En C++ se suele laborar con librerías dinámicas (DLLs) que obligan a recompilar la aplicación cuando se retocan las
funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz específica llamada RTTI ( RunTime Type Identification ) que determina la interacción entre
objetos excluyendo
variables de instancias o implementación de métodos. Las clases en Java tienen una representación en el runtime que faculta a los programadores interrogar por el tipo de clase y unir dinámicamente la clase con el fruto de la búsqueda Es DISTRIBUIDO Java se ha construido con amplias capacidades de interconexión TCP/IP. Existen librerías de rutinas para alcanzar e interactuar con protocolos como htt ftp . Esto faculta a los programadores alcanzar a la información a través de la red con tanta facilidad como a los archivos locales. La realidad es que Java en sí no es distribuido, sino que ofrece las librerías y dispositivos para que los
proyectos puedan ser distribuidos, es decir, que se corran en algúnas máquinas, interactuando Es ROBUSTO Java realiza verificaciones en busca de dificultades tanto en tiempo de compilación como en tiempo de ejecución. La comprobación de tipos en Java ayuda a detectar errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la manifiesto explícita de métodos, reduciendo así las probabilidades de error. Maneja la memoria para descartar las preocupaciones por fracción del programador de la liberación o corrupción de memoria. También implementa los arrays auténticos , en vez de listas enlazadas de punteros, con comprobación de límites, para eludir la probabilidad de sobreescribir o corromper memoria fruto de punteros que señalan a zonas equivocadas. Estas características reducen drásticamente el tiempo de desarrollo de aplicaciones en Java. Además, para asegurar el funcionamiento de la aplicación, realiza una verificación de los byte-codes , que son el fruto de la compilación de un proyecto Java. Es un código de máquina virtual que es interpretado por el intérprete Java. No es el código máquina directamente entendible por el hardware, pero ya ha pasado todas las fases del compilador: análisis de instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecución de órdenes. Java proporciona, pues: Comprobación de punteros Comprobación de límites de arrays Excepciones Verificación de byte-codes Es de ARQUITECTURA NEUTRAL Para establecer Java como fracción integral de la red, el compilador Java compila su código a un fichero objeto de
formato independiente de la
arquitectura de la máquina en que se ejecutará. Cualquier máquina que tenga el sistema de ejecución ( run-time ) puede ejecutar ese código objeto, sin importar en modo sdeterminados la máquina en que ha sido generado. Actualmente tienen lugar sis
temas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas Es SEGURO La seguridad en Java tiene dos facetas. En el lenguaje, características como los punteros o el casting implícito que hacen los compiladores de C y C++ se eliminan para advertir el entrada i
legal a la memoria. Cuando se usa Java para crear un navegador, se combinan las características del lenguaje con protecciones de sentido general aplicadas al propio navegador. El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los yerros de alineación . Los programadores de C emplean punteros en conjunción con
operaciones aritméticas. Esto le faculta al programador que un puntero referencie a un espacio conocido de la memoria y pueda sumar (o restar) determinado valor, para mencionarse a otro espacio de la memoria. Si otros programadores conocen nuestras estructuras de datos
pueden extraer información confidencial de vuestro sistema. Con un lenguaje como C, se pueden beber números enteros aleatorios y convertirlos en punteros para despues alcanzar a la memoria: printf( "Escribe un valor entero: " ); scanf( "%u",&puntero ); printf( "Cadena de memoria: %sn",puntero ); Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya . Se muestra un proyecto como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se visualiza el contenido de un directorio con el comando ls . Si un proyectodor deja un comando destructivo debajo esta referencia, se puede correr el riesgo de ejecutar código malicioso, aunque el comando siga haciendo la funcionalidad que se le supone, después de arrojar su carga destructiva. Por ejemplo, después de que el caballo de Troya haya enviado por correo el /etc/shadow a su creador, ejecuta la funcionalidad de ls persentando el contenido del directorio. Se notará un retardo, pero nada inusual. El código Java pasa muchos tests antes de ejecutarse en una máquina. El código se pasa a través de un verificador de byte-codes que comprueba el formato de los pedazos de código y aplica un probador de teoremas para detectar pedazos de código ilegal -código que falsea punteros, viola derechos de entrada sobre objetos o intenta cambiar el tipo o clase de un objeto-. Si los byte-codes pasan la verificación sin
generar ningún mensaje de error, entonces conocemos que: El código no produce desbordamiento de operandos en la pila El tipo de los parámetros de todos los códigos de operación son conocidos y adecuados No ha sucedido ninguna conversión ilegal de datos, tal como convertir enteros en punteros El entrada a los
campos de un objeto se sabe que es legal: public, private, protected No hay ningún intento de violar las normas de entrada y seguridad creadas El Cargador de Clases también ayuda a Java a mantener su seguridad, separando el lugar de nombres del sistema de archivos local, del de los recursos procedentes de la red. Esto limita cualquier aplicación del tipo Caballo de Troya , ya que las clases se buscan primero entre las locales y despues entre las procedentes del exterior. Las clases im
portadas de la red se almacenan en un lugar de nombres privado, vinculado con el origen. Cuando una clase del lugar de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y despues en el lugar de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida. En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interacción de ciertos virus. Java no posee una semántica específica para adaptar la pila de proyecto, la memoria abierta o
utilizar objetos y métodos de un proyecto sin los privilegios del kernel del sistema operativo. Además, para eludir transformaciónes por fracción de los crackers de la red, implementa un método ultraseguro de autentificación por clave pública. El Cargador de Clases puede
comprobar una firma digital antes de hacer una instancia de un objeto. Por tanto, ningún objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilación, con el nivel de detalle y de privilegio que sea necesario. Dada, pues la concepción del lenguaje y si todos los fundamentos se mantienen dentro del estándar marcado por Sun, no hay peligro. Java imposibilita, también, abrir ningún fichero de la máquina local (siempre que se realizan
operaciones con archivos, éstas laboran sobre el disco duro de la máquina de donde partió el applet), no faculta ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar vuestra máquina para hacer peticiones o hacer operaciones con otra. Además, los intérpretes que incorporan los navegadores de la Web son aún más restrictivos. Debajo estas cláusulas (y dentro de la filosofía de que el único ordenador seguro es el que está apagado, desenchufado, dentro de una cámara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejército), se puede analizar que Java es un lenguaje seguro y que los applets están libres de virus. Respecto a la seguridad del código fuente, no ya del lenguaje, JDK ofrece un desemsamblador de byte-code, que faculta que cualquier proyecto pueda ser convertido a código fuente, lo que para el proyectodor implica una vulnerabilidad total a su código. Utilizando javap no se obtiene el código fuente original, pero sí desmonta el proyecto mostrando el algoritmo que se utiliza, que es lo realmente interesante. La protección de los proyectodores ante esto es utilizar llamadas a proyectos nativos,
externos (incluso en C o C++) de manera que no sea descompilable todo el código; aunque así se pierda portabilidad. Esta es otra de las cuestiones que Java tiene zarcillos Es PORTABLE Más allá de la portabilidad escencial por ser de arquitectura independiente, Java implementa otros estándares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros y además, enteros de 32 bits en complemento a 2. Además, Java construye sus interfaces de
usuario a través de un sistema abstracto de ventanas de manera que las ventanas puedan ser implantadas en ámbitos Unix, Pc o Mac Es INTERPRETADO El intérprete Java (sistema run-time) puede ejecutar directamente el código objeto. Enlazar (linkar) un proyecto, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarán más tiempo desarrollando y menos esperando por el ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todavía no hay compiladores particulares de Java para las variadas plataformas, Java es más lento que otros lenguajes de proyectoción, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier proyecto tradicional. Se dice que Java es de 10 a 30 veces más lento que C, y que tampoco tienen lugar en Java programas de mayor envergadura como en otros lenguajes. La realidad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programación, y una ingente porción de folletos electrónicos que supuran fanatismo en favor y en contra de los diferentes lenguajes contendientes con Java. Lo que se suele abandonar de lado en todo esto, es que primero habría que determinar hasta que
punto Java, un lenguaje en pleno desarrollo y todavía sin definición definitiva, está maduro como lenguaje de programación para ser comparado con otros; como por
ejemplo con Smalltalk, que lleva más de 20 años en cancha. La realidad es que Java para
obtener ser un lenguaje independiente del sistema operativo y del procesador que incorpore la máquina utilizada, es tanto interpretado como compilado. Y esto no es ningún contrasentido, me explico, el código fuente escrito con cualquier editor se compila generando el byte-code. Este código intermedio es de muy debajo nivel, pero sin conseguir las instrucciones máquina particulares de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicación. Ese mismo código es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time, que sí es completamente dependiente de la máquina y del sistema operativo, que interpreta dinámicamente el byte-code y agrega el 20% de instrucciones que faltaban para su ejecución. Con este sistema es sencillo crear aplicaciones multiplataforma, pero para ejecutarlas es indispensable que exista el run-time correspondiente al sistema operativo utilizado Es MULTITHREADED Al ser multithreaded (multihilvanado, en mala traducción), Java faculta muchas actividades simultáneas en un programa. Los
threads (a veces llamados, procesos ligeros), son básicamente pequeños procesos o piezas independientes de un mayor proceso. Al estar los threads contruidos en el lenguaje, son más fáciles de
usar y más robustos que sus homólogos en C o C++. El beneficio de ser miltithreaded consiste en un mejor
rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real está limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), aún supera a los ámbitos de flujo único de proyecto (single-threaded) tanto en facilidad de desarrollo como en rendimiento. Cualquiera que haya utilizado la tecnología de navegación concurrente, sabe lo frustrante que puede ser esperar por una mayor imagen que se está trayendo. En Java, las imágenes se pueden ir trayendo en un thread independiente, permitiendo que el
usuario pueda alcanzar a la información en la página sin tener que esperar por el navegador Es DINAMICO Java se beneficia todo lo probable de la tecnología enfocada a objetos. Java no intenta conectar todos los módulos que comprenden una aplicación hasta el tiempo de ejecución. Las librería nuevas o actualizadas no paralizarán las aplicaciones actuales (siempre que mantengan el API anterior). Ejemplo: // Hola.java public class Hola() //Declara una clase llamada Hola, que es descendiente de la clase Object { //Entre llaves se declaran los
atributos y métodos de la clase public static void main(String[] args) //public: indica que el método main()es público //void: indica que la función main() no devuelve ningún valor //El método main()debe aceptar siempre como parámetro un vector de strings { System.out.println("Hola, mundo!"); //Esta línea indica que se va a ejecutar el método println(), encargado de presentar //un valor a través de la salida estándar (en vuestro caso, un String) //Este método pertenece al atributo out