Introducción a Java (características)

Java tiene como características principales ser un lenguaje orientado a objetos, distribuido, interpretado, robusto, seguro, independiente de las arquitecturas, portable, eficaz, multihilo y dinámico.

Vamos a explicar detallamente cada una de estas características.

Características principales

La sintaxis de Java es similar a la del lenguaje C y C++, pero evita características semánticas que les hacen complejos, confusos e inseguros:

  • En Java sólo existen tres tipos primitivos: los numéricos (enteros y reales), el tipo carácter y el tipo booleano. Todos los numéricos están firmados.
  • En Java, las tablas y las cadenas de caracteres son objetos, lo que facilita su creación y su manipulación.
  • En Java, el programador no tiene que preocuparse de la gestión de la memoria. Un sistema llamado «el recolector de basura» (garbage collector), se encarga de dar la memoria necesaria a la hora de crear objetos y de liberarla cuando estos ya no se referencian en el dominio del programa (cuando ninguna variable apunta al objeto).
  • En Java, no hay ningún preprocesadores ni ficheros de encabezamiento. Las instrucciones define de C se sustituyen por constantes en Java y las instrucciones typedef de C, lo hacen por clases.
  • En C y C++, se definen estructuras y uniones para representar tipos de datos complejos. En Java, se crean instancias de clases para representar tipos de datos complejos.
  • En C++, una clase puede heredar de otras clases, lo que puede generar problemas de ambigüedad. Con el fin de evitar estos problemas, Java sólo autoriza la herencia simple pero aporta un mecanismo de simulación de herencia múltiple mediante implementación de una o varias interfaces.
  • En Java, no existe la famosa instrucción goto, simplemente porque aporta una complejidad a la lectura de los programas y porque a menudo se puede prescindir de esta instrucción escribiendo un código más limpio. Además, en C y C++ se suele utilizar el goto para salir de bucles anidados. En Java, se utilizarán las instrucciones break y continue que permiten salir de uno o varios niveles de anidamiento.
  • En Java, no se puede sobrecargar a los operadores para evitar problemas de incomprensión del programa. Se preferirá crear clases con métodos y variables de instancia.
  • Y para terminar, en Java, no hay punteros sino referencias a objetos o casillas de una tabla (referenciadas por su índice), simplemente porque la gestión de punteros es fuente de muchos errores en los programas C y C++.

Orientado a objetos

Salvo los tipos de datos primitivos, todo es objeto en Java. Y además, Java se ha provisto de clases incorporadas que encapsulan los tipos primitivos.Por lo tanto, Java es un lenguaje de programación orientado a objetos y diseñado según el modelo de otros lenguajes (C++, Eiffel, SmallTalk, Objective C, Cedar/Mesa, Ada, Perl), pero sin sus defectos.

Las ventajas de la programación orientada a objetos son: un mejor dominio de la complejidad (dividir un problema complejo en una sucesión de pequeños problemas), una reutilización más sencilla, y mayor facilidad de corrección y de evolución.

Java estándar está provista de un conjunto de clases que permiten crear y manipular todo tipo de objetos (interfaz gráfica, acceso a la red, gestión de entradas/salidas…).

Distribuido

Java implementa los protocolos de red estándares, lo que permite desarrollar aplicaciones cliente/servidor en arquitectura distribuida, con el fin de invocar tratamientos y/o recuperar datos de máquinas remotas.

Con este fin, Java estándar cuenta con dos APIs que permiten crear aplicaciones cliente/servidor distribuidas:

  • RMI (Remote Method Invocation) permite a los objetos Java comunicarse entre ellos tanto si se ejecutan en diferentes máquinas virtuales Java como si lo hacen en diferentes máquinas físicas.
  • CORBA (Common Object Request Broker Architecture), basado en el trabajo del OMG (http://www.omg.org) permite la comunicación entre objetos Java, C++, Lisp, Python, Smalltalk, COBOL, Ada, que se ejecutan en diferentes máquinas físicas.

Interpretado

Un programa Java no lo ejecuta sino que lo interpreta la máquina virtual o JVM (Java Virtual Machine). Esto hace que sea más lento. Sin embargo conlleva también sus ventajas, en particular el hecho de no tener que recompilar un programa Java de un sistema a otro porque basta, para cada uno de los sistemas, con tener su propia máquina virtual.Por el hecho de que Java es un lenguaje interpretado, no es necesario que editar los enlaces (obligatorio en C++) antes de ejecutar un programa. En Java, por lo tanto, sólo hay dos etapas, la compilación y la ejecución. La máquina virtual se encarga de la operación de edición de los enlaces en el momento de la ejecución del programa.

Robusto

Java es un lenguaje fuertemente tipado y estricto. Por ejemplo, la declaración de las variables debe ser obligatoriamente explícita en Java.

Se verifica el código (sintaxis, tipos) en el momento de la compilación y también de la ejecución, lo que permite reducir los errores y los problemas de incompatibilidad de versiones.

Además, Java se encarga totalmente de la gestión de los punteros y el programador no tiene manera de acceder a ello, lo que evita la sobreescritura accidental de datos en memoria y la manipulación de datos corruptos.

Seguro

Dado los campos de aplicación de Java, es muy importante que haya un mecanismo que vigile la seguridad de las aplicaciones y los sistemas. El motor de ejecución de Java (JRE) es el encargado de esta tarea.

El JRE se apoya en particular en el fichero de texto java.policy que contiene información relativa a la configuración de la seguridad.

En Java, el JRE es el encargado de gestionar el consumo de memoria de los objetos y no el compilador, como es el caso en C++.

Puesto que en Java no hay punteros sino referencias a objetos, el código compilado contiene identificadores sobre los objetos que luego el JRE traduce en direcciones de memoria: esta parte es totalmente opaca para los desarrolladores.

En el momento de la ejecución de un programa Java, el JRE utiliza un proceso llamado el ClassLoader que realiza la carga del ByteCode (o lenguaje binario intermedio) contenido en las clases Java. Luego se analiza el ByteCode con el fin de controlar que no generó creación o manipulación de punteros en memoria y que tampoco hubo violación de acceso.

Como Java es un lenguaje distribuido, se implementan los principales protocolos de acceso a la red (FTP, HTTP, Telnet…). Se puede, pues, configurar el JRE con el fin de controlar el acceso a la red de sus aplicaciones:

  • Prohibir todos los accesos.
  • Autorizar el acceso solamente a la máquina anfitriona de donde procede el código de aplicación. Es la configuración por defecto para los Applets Java.
  • Autorizar el acceso a máquinas en la red externa (más allá del firewall), en el caso en el cual el código de la aplicación también procede de una máquina anfitriona de la red externa.
  • Autorizar todos los accesos. Es la configuración por defecto para las aplicaciones de tipo cliente pesado.

Independiente de las arquitecturas

El compilador Java no produce un código específico para un tipo de arquitectura.De hecho, el compilador genera bytecode (lenguaje binario intermedio) que es independiente de cualquier arquitectura, de todo sistema operativo y de todo dispositivo de gestión de la interfaz gráfica de usuario (GUI).

La ventaja de este bytecode reside en su fácil interpretación o transformación dinámica en código nativo para aumentar el rendimiento.

Sólo es necesario con disponer de la máquina virtual específica de su plataforma para hacer funcionar un programa Java. Esta última se encarga de traducir el bytecode a código nativo.

Portable

Java es portable gracias a que se trata de un lenguaje interpretado.

Además, al contrario del lenguaje C y C++, los tipos de datos primitivos (numéricos, carácter y booleano) de Java tienen el mismo tamaño, sea cual sea la plataforma en la cual se ejecuta el código.

Las bibliotecas de clases estándares de Java facilitan la escritura del código luego que se puede desplegar en diferentes plataformas sin adaptación.

Eficaz

Incluso si un programa Java es interpretado, lo que es más lento que un programa nativo, Java pone en marcha un proceso de optimización de la interpretación del código, llamado JIT (Just In Time) o Hot Spot. Este proceso compila el bytecode Java en código nativo en tiempo de ejecución, lo que permite alcanzar el mismo rendimiento que un programa escrito en lenguaje C o C++.

Multitarea

Java permite desarrollar aplicaciones que ponen en marcha la ejecución simultánea de varios hilos (o procesos ligeros). Esto permite efectuar simultáneamente varias tareas, con el fin de aumentar la velocidad de las aplicaciones, ya sea compartiendo el tiempo del CPU, o repartiendo las tareas entre varios procesadores.

Dinámico

En Java, como dijimos, el programador no tiene que editar los vínculos (obligatorio en C y C++). Por lo tanto es posible modificar una o varias clases sin tener que efectuar una actualización de estas modificaciones para el conjunto del programa. La comprobación de la existencia de las clases se hace en el momento de la compilación y la llamada al código de estas clases sólo se hace en el momento de la ejecución del programa. Este proceso permite disponer de aplicaciones más ligeras de tamaño en memoria.

 

banner-java-basico-2

Taller de Desarrollo con Javascript

Regístrate en nuestra plataforma en linea para tener acceso completo y gratuito del taller

Registrarme

Taller de desarrollo de Pokedex con Android Studio

Regístrate en nuestra plataforma en linea para tener acceso completo y gratuito del taller

Registrarme