Bienvenidos a otro capítulo de este Curso Gratis de Java para Hackers – Características de Java. Comparte este articulo y síguenos para recibir más capítulos, guías y cursos gratis.

Índice

¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?

Java es un lenguaje de programación orientado a objetos diseñado con el propósito de tener la menor cantidad de dependencias de implementación posible. Su objetivo es permitir a los desarrolladores escribir una vez y ejecutar en cualquier lugar (WORA) para que el código Java pueda ejecutarse en cualquier plataforma que admita Java sin necesidad de volver a compilarlo. 

Java se lanzó inicialmente en 1995 y ahora se utiliza para desarrollar aplicaciones potentes y robustas para dispositivos móviles, web y de escritorio.

El objetivo clave del diseño de Java fue introducir un lenguaje de programación simple, seguro y portátil. Las diversas características de Java incluyen seguridad, solidez, independencia de plataforma, simplicidad y la lista continúa. 

No es de extrañar que sea una opción popular para desarrollar aplicaciones de nivel empresarial. 

El lenguaje de programación Java se desarrolló inicialmente para funcionar en sistemas integrados, decodificadores y televisores. Entonces por requisitos, inicialmente fue diseñado para funcionar en variadas plataformas. Durante varios años, Java evolucionó hasta convertirse en uno de los lenguajes más populares utilizados para desarrollar aplicaciones basadas en Internet. Java es un lenguaje rico en funciones y con cada nueva versión, evoluciona continuamente. Se utiliza ampliamente en miles de millones de dispositivos.

Características de JAVA

Java es un lenguaje utilizado por millones de desarrolladores, y esto es gracias a las prestaciones características de este. El lenguaje Java se creó con cinco objetivos principales:

1- Ser fácil de usar y tomar las mejores características de lenguajes como C y C++

2- Usar el paradigma orientado a objetos en su totalidad

3- Permitir la ejecución de un programa en múltiples plataformas

4- Incluir por defecto soporte para trabajar en red

5- Ser seguro para su ejecución en sistemas remotos

El lenguaje de programación Java fue desarrollado originalmente por Sun Microsystems, iniciado por James Gosling y lanzado en 1995 como componente central de la plataforma Java de Sun Microsystems (Java 1.0 [J2SE]).

La última versión de Java Standard Edition es Java SE 8. Con el avance de Java y su amplia popularidad, se crearon múltiples configuraciones para adaptarse a varios tipos de plataformas. Por ejemplo: J2EE para aplicaciones empresariales, J2ME para aplicaciones móviles.

Las nuevas versiones J2 pasaron a llamarse Java SE, Java EE y Java ME respectivamente. Se garantiza que Java se escribe una vez y se ejecuta en cualquier lugar.

Java es un lenguaje rico en funciones. Java evoluciona continuamente con cada actualización y las actualizaciones se realizan cada seis meses. Las siguientes son algunas de las características principales del lenguaje Java:

Orientado a objetos :

Java utiliza el paradigma orientado a objetos. El paradigma orientado a objetos es el paradigma predominante en la actualidad, y sin ahondar mucho en detalles, ya que sería absurdo comentar las características del paradigma que haga que Java se destaque sin haber explicado todavía este paradigma, podemos decir que permite construir grandes sistemas de una forma modularizada de manera que sean fáciles de gestionar y manejar, mejorando su calidad y reduciendo el número de proyectos fallidos. Además, este paradigma permite la reutilización de código entre diferentes proyectos, lo que hace mucho más simple la implementación de ciertos módulos ya programados anteriormente en un nuevo sistema.

Java es un lenguaje puro orientado a objetos y todo en Java es un objeto. Java admite principios de OOPS como herencia, encapsulación, polimorfismo, clases, etc. El propio Java también se puede ampliar basándose en un modelo de objetos.

Todos los conceptos relacionados al Paradigma Orientado a Objetos son tomados por el lenguaje Java y puestos en práctica.  En Java, encontramos aplicaciones prácticas para los conceptos de objetos, clases, atributos, métodos, abstracción, encapsulamiento, herencia, polimorfismo, etc. Java implementa la tecnología básica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos objetos.

Soporta las tres características propias 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++, necesitan ser construidas y destruidas en espacios 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.

Java Vs C

En C++ se suele trabajar 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 define 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 permite a los programadores interrogar por el tipo de clase y enlazar dinámicamente la clase con el resultado de la búsqueda. ¿Por qué puse “de” objetos y no “orientado a” objetos? Para destacar que, al contrario de otros lenguajes como C++, no es un lenguaje modificado para poder trabajar con objetos, sino que es un lenguaje creado para trabajar con objetos desde cero. De hecho, TODO lo que hay en Java son objetos.

¿Qué es un objeto? Bueno, se puede decir que todo puede verse como un objeto. Pero seamos más claros. Un objeto, desde nuestro punto de vista, puede verse como una pieza de software que cumple con ciertas características: encapsulamiento y herencia.

Encapsulamiento

significa que el objeto es auto-contenido, o sea que la misma definición del objeto incluye tanto los datos que éste usa (atributos) como los procedimientos (métodos) que actúan sobre los mismos. Cuando se utiliza programación orientada a objetos, se definen clases (que definen objetos genéricos) y la forma en que los objetos interactúan entre ellos, a través de mensajes. Al crear un objeto de una clase dada, se dice que se crea una instancia de la clase, o un objeto propiamente dicho.

Por ejemplo, una clase podría ser “autos”, y un auto dado es una instancia de la clase. La ventaja de esto es que como no hay programas que actúen modificando al objeto, éste se mantiene en cierto modo independiente del resto de la aplicación. Si es necesario modificar el objeto (por ejemplo, para darle más capacidades), esto se puede hacer sin tocar el resto de la aplicación… lo que ahorra mucho tiempo de desarrollo y debugging!

En Java, inclusive, ¡ni siquiera existen las variables globales! (Aunque parezca difícil de aceptar, esto es una gran ventaja desde el punto de vista del desarrollo).

herencia,

simplemente significa que se pueden crear nuevas clases que hereden de otras preexistentes; esto simplifica la programación, porque las clases hijas incorporan automáticamente los métodos de las madres.

Por ejemplo, nuestra clase “auto” podría heredar de otra más general, “vehículo”, y simplemente redefinir los métodos para el caso particular de los automóviles… lo que significa que, con una buena biblioteca de clases, se puede reutilizar mucho código inclusive sin saber lo que tiene adentro.

Un ejemplo simple

Para ir teniendo una idea, vamos a poner un ejemplo de una clase Java:

public class Muestra extends Frame {
// atributos de la clase
	Button si;
	Button no;
	// métodos de la clase:
	public Muestra () {
		Label comentario = new Label("Presione un botón", Label.CENTER);
		si = new Button("Sí");
		no = new Button("No");
		add("North", comentario);
		add("East", si);
		add("West", no);
}}

Esta clase no está muy completa así, pero da una idea… Es una clase heredera de la clase Frame (un tipo de ventana) que tiene un par de botones y un texto. Contiene dos atributos (“si” y “no”), que son dos objetos del tipo Button, y un único método llamado Muestra (igual que la clase, por lo que es lo que se llama un constructor).

Programación orientada a objetos (POO)

La programación orientada a objetos significa organizar el programa o software como una colección de diferentes tipos de objetos que incorporan tanto datos como comportamiento. Los OOP de Java simplifican el desarrollo y el mantenimiento de software mediante algunas reglas. 

Java es un lenguaje de programación orientado a objetos y todo en Java se conoce como objeto. Los principales conceptos de la programación orientada a objetos son:

  • Objeto
  • Clase
  • Herencia
  • Abstracción
  • Encapsulación
  • Polimorfismo

Ejemplo:

A continuación se muestra un ejemplo que muestra la encapsulación, la herencia y el polimorfismo:

class Animal {
    protected String name;
    public Animal(String name) {
        this.name = name;
    }

public void makeSound() {
        System.out.println(“Animal sound”);
    }
}

class Dog extends Animal {
    public Dog(String name) {
       super(name);
    }

@Override
    public void makeSound() {
        System.out.println(“Woof!”);
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(“Tom”);
        animal.makeSound();  // Output: Woof!
    }
}

En este ejemplo, Animal es la clase base, Dog es una subclase que hereda de Animal y el polimorfismo se logra llamando al método makeSound en el objeto animal.

Independiente de la plataforma:

El código Java es independiente de la plataforma. Un código Java no se compila en un código específico de la máquina, sino en un código de bytes independiente de la plataforma. Este código de bytes lo ejecuta JVM , que ejecuta el código en la plataforma subyacente. Esta capacidad convierte a Java en un lenguaje de escritura única y ejecución en cualquier lugar.

a diferencia de muchos otros lenguajes de programación, incluidos C y C++, cuando se compila Java, no se compila en una máquina específica de la plataforma, sino en un código de bytes independiente de la plataforma. Este código de bytes se distribuye a través de la web y lo interpreta la máquina virtual (JVM) en cualquier plataforma en la que se esté ejecutando.

Multiplataforma

Como ya hemos nombrado montones de veces una de las características clave del lenguaje es que sus programas sean multiplataforma. Esto permite que un programa sea ejecutado casi en cualquier dispositivo y es muy útil en relación a aplicaciones en red, ya que un mismo programa podría ejecutarlo en una computadora con Windows y en un Servidor con Linux, sin tener que escribirlo dos veces, o sea, una vez por cada plataforma.

El compilador de Java convierte el código fuente en código de bytes y luego la JVM ejecuta el código de bytes que genera el compilador. Este código de bytes recién generado puede ejecutarse en cualquier plataforma, incluidos Linux, Windows o macOS. 

Entonces, si compilamos un programa en Windows, podemos ejecutarlo fácilmente en Linux y viceversa. Aunque cada sistema operativo tiene una JVM diferente, la salida producida por todos es la misma después de la ejecución del código de bytes. Por eso se conoce a Java como un lenguaje independiente de la plataforma. 

Una de las características importantes de Java es que es independiente de la plataforma, ya que se diferencia de otros lenguajes de programación, como C y C++. Estos lenguajes se compilan en máquinas de plataformas específicas, mientras que Java sigue el enfoque de “escribir una vez, ejecutar en cualquier lugar”. 

Aquí, una plataforma se refiere a un entorno de software o hardware para ejecutar un programa. Las plataformas son de dos tipos: basadas en software y basadas en hardware. Java es una plataforma basada en software. 

Un aspecto que diferencia a Java de otras plataformas es que esta plataforma basada en software se ejecuta sobre otras plataformas basadas en hardware.

Sus dos componentes son:

  • Entorno de ejecución
  • API (interfaz de programación de aplicaciones)

El compilador convierte el código fuente en código de bytes después de la compilación de Java . Luego, la JVM ejecuta el código de bytes que generó el compilador. Este código de bytes es independiente de la plataforma, ya que puede ejecutarse en múltiples plataformas, es decir, escribir una vez, ejecutar en cualquier lugar (WORA). 

Puede ejecutar código Java en cualquier plataforma, incluidas Windows, Linux, etc. Esto significa que si compila un programa en Linux, puede ejecutarse en Windows y viceversa. 

Aunque existe una JVM diferente en cada sistema operativo, la salida tras la ejecución del código de bytes en todos ellos es la misma. Por lo tanto, hacer de Java un lenguaje independiente de la plataforma.

Escribe una vez y ejecuta en cualquier lugar (WORA)

Esta es seguramente una de las mejores características de Java, ya que especifica que un programa Java se puede ejecutar fácilmente en un procesador independientemente de su proveedor y arquitectura. 

Las aplicaciones Java generan un archivo .class que corresponde a nuestras aplicaciones pero que comprende código en formato binario. Además, proporciona una facilidad arquitectónica neutral porque el código de bytes no depende de ninguna arquitectura de máquina. Por lo tanto, se utiliza en toda la industria de TI a nivel mundial. 

Entonces, las aplicaciones Java generan un archivo .class correspondiente al programa o aplicación pero tienen código en formato binario. Es arquitectónicamente neutral ya que el código de bytes es independiente de cualquier arquitectura de máquina. Debe escribir código una vez en Java y puede ejecutarlo en cualquier lugar o en cualquier máquina. Por lo tanto, Java es ampliamente utilizado por empresas de TI de todo el mundo.

Fácil de aprender:

Soporte para trabajar en red

Otra característica importante de Java es el soporte que ofrece para trabajar en red. Para eso se abstrajeron las características y detalles específicos en referencia a los aspectos técnicos de redes de comunicaciones. Con el objetivo de simplificar la tarea del programador a la hora de trabajar con redes a bajo nivel, Java proporciona formas básicas de trabajar en red mediante Sockets URL

En base a esto se desprende la característica de que Java proporciona librerías herramientas para que los programas puedan ser distribuidos, y que gracias a la capacidad que tiene para realizar conexiones con protocolos TCP, UDP, HTTP y FTP, permite el acceso de la información a través de la red con tanta facilidad de cómo se accede a los datos de un archivo.

Java hereda características de C y C++ y los desarrolladores pueden aprender Java fácilmente si conocen alguno de los lenguajes C o C++. Incluso para alguien nuevo en los lenguajes informáticos, Java es muy fácil de aprender desde cero.

Java está diseñado para que sea fácil de aprender. Si comprende el concepto básico de programación orientada a objetos Java, será fácil de dominar.

para comenzar a utilizar el lenguaje de programación no es necesario realizar estudios complejos y extensos del lenguaje. ofrece toda la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de éstos.

Java vs C

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 parecido a C++ y así facilitar un rápido y fácil aprendizaje. elimina muchas de las características de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y añadir características muy útiles como el garbage collector (reciclador de memoria dinámica).

No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello y como es un thread de baja prioridad, cuando entra en acción, permite liberar bloques de memoria muy grandes, lo que reduce la fragmentación de la memoria. reduce en un 50% los errores más comunes de programación con lenguajes como C y C++ al eliminar muchas de las características de éstos, entre las que destacan:

  •      aritmética de punteros
  •      no existen referencias
  •      registros (struct)
  •      definición de tipos (typedef)
  •      macros (#define)
  •      necesidad de liberar memoria (free)

Aunque, en realidad, lo que hace es eliminar las palabras reservadas (struct, typedef), ya que las clases son algo parecido.

Las aplicaciones que se crean en grandes empresas deben ser más efectivas que eficientes; es decir, conseguir que el programa funcione y el trabajo salga adelante es más importante que el que lo haga eficientemente. Esto no es una crítica, es una realidad de la programación corporativa.

Fácil es mejor

Al ser un lenguaje más simple que cualquiera de los que ahora están en el cajón de los programadores, Java permite a éstos concentrarse en la mecánica de la aplicación, en vez de pasarse horas y horas incorporando APIs para el control de las ventanas, controlando minuciosamente la memoria, sincronizando los ficheros de cabecera y corrigiendo los agónicos mensajes del linker.

Java tiene su propio toolkit para interfaces, maneja por sí mismo la memoria que utilice la aplicación, no permite ficheros de cabecera separados (en aplicaciones puramente Java) y solamente usa enlace dinámico. Muchas de las implementaciones de Java actuales son puros intérpretes. Los byte-codes son interpretados por el sistema run-time de Java, la Máquina Virtual Java (JVM), sobre el ordenador del usuario.

Aunque ya hay ciertos proveedores que ofrecen compiladores nativos Just-In-Time (JIT). Si la Máquina Virtual Java dispone de un compilador instalado, las secciones (clases) del byte-code de la aplicación se compilarán hacia la arquitectura nativa del ordenador del usuario. Los programas Java en ese momento rivalizarán con el rendimiento de programas en C++. Los compiladores JIT no se utilizan en la forma tradicional de un compilador; los programadores no compilan y distribuyen binarios Java a los usuarios.

La compilación JIT tiene lugar a partir del byte-code Java, en el sistema del usuario, como una parte (opcional) del entorno run-time local de Java. Muchas veces, los programadores corporativos, ansiosos por exprimir al máximo la eficiencia de su aplicación, empiezan a hacerlo demasiado pronto en el ciclo de vida de la aplicación. Java permite algunas técnicas innovadoras de optimización.

Ejemplo

Por ejemplo, Java es inherentemente multithreaded, a la vez que ofrece posibilidades de multithread como la clase Thread y mecanismos muy sencillos de usar de sincronización; Java en sí utiliza threads. Los desarrolladores de compiladores inteligentes pueden utilizar esta característica de Java para lanzar un thread que compruebe la forma en que se está utilizando la aplicación.

Más específicamente, este thread podría detectar qué métodos de una clase se están usando con más frecuencia e invocar a sucesivos niveles de optimización en tiempo de ejecución de la aplicación. Cuanto más tiempo esté corriendo la aplicación o el applet, los métodos estarán cada vez más optimizados. Si un compilador JIT está embebido en el entorno run-time de Java, el programador no se preocupa de hacer que la aplicación se ejecute óptimamente.

Siempre he pensado que en los Sistemas Operativos tendría que aplicarse esta filosofía; un optimizador progresivo es un paso más hacia esta idea.

Java Vs C++

el lenguaje de programación Java es muy parecido al de C++. Java toma muchos conceptos de C++ y elimina algunos otros que aportan mayor complejidad. Si la empresa está llena de programadores de C++ con alguna experiencia en el manejo de librería gráficas, aprenderán rápidamente lo esencial de Java.

Si el equipo de ingenieros no conoce C++, pero maneja cualquier otro lenguaje de programación orientada a objetos, les llevará pocas semanas dominar la base de Java. Lo que sí que no es cierto es que haya que aprender C++ antes de aprender Java.

Si los ingenieros de la empresa no conocen ningún lenguaje orientado a objetos, sí que tienen que aprender los fundamentos de esta tecnología antes de nada, y luego aplicarlos a la programación con Java. El análisis y diseño orientado a objetos debe ser comprendido antes de intentar nada con Java. Los programadores de Java sin un fondo de conocimientos de OOA/D producirán código pobre. Además, los libros sobre Java crecen como la espuma.

Facilidad de uso

Java se creó porque C y C++ que eran los lenguajes que utilizaban a mediados de los años 80, no eran totalmente convincentes para abordar temas de seguridad, pero en esa época, eran los lenguajes más utilizados, incluso hoy en día siguen siendo los lenguajes más utilizados, por lo cual todo el mundo que sabía programar sabia C o C++, es por esto que se basaron en la sintaxis de estos lenguajes, y de esta manera hacer que a cualquier persona que quisiera aprender Java le resulte fácil.

Además de esto Java elimina las funcionalidades menos utilizadas por estos lenguajes y también las más confusas, haciendo que programar en Java resulte más simple desligando al programador de ciertas tareas tediosas que de otro modo tenían que realizar a mano. Por ejemplo una de las características más destacadas que se ha eliminado es la del manejo de punteros, mientras que en C este manejo lo realizaba el programador, en Java lo administra el propio lenguaje.

Java se encuentra entre los lenguajes más simples, ya que no presenta características complejas, como herencia múltiple, punteros, asignación de memoria explícita y sobrecarga de operadores. Se genera fácilmente y es fácil de entender. Cualquiera que esté familiarizado con la programación orientada a objetos básica puede aprender Java sin muchos problemas.

Simplicidad

Java es bastante simple ya que no hay características complejas como herencia múltiple, punteros, asignación de memoria explícita y sobrecarga de operadores. Tiene una sintaxis simple y limpia y es fácil de aprender. La simplicidad es una de las características principales del lenguaje Java y se debe a las siguientes razones:

  • Ha eliminado varias funciones complicadas y poco utilizadas.
  • Está basado en C++, lo que facilita el aprendizaje de los programadores después de C++.
  • Como Java tiene recolección automática de basura, no es necesario hacer esfuerzos para eliminar objetos sin referencia.

Ejemplo:

Aquí hay un ejemplo simple de un programa que calcula la suma de dos números:

public class SumCalculator {
    public static void main(String[] args) {
        int a = 5;
        int b = 10;
        int sum = a + b;
        System.out.println("Sum: " + sum);
    }
}

Este programa muestra la simplicidad de la sintaxis de Java y las operaciones aritméticas básicas.

Seguro:

Java es seguro por arquitectura. No es necesario que un desarrollador interactúe directamente con la memoria subyacente o el sistema operativo. Java proporciona recolección automática de basura para que los desarrolladores no tengan que preocuparse por pérdidas de memoria, administración, etc.

la función segura de Java permite desarrollar sistemas libres de virus y manipulaciones. Las técnicas de autenticación se basan en el cifrado de clave pública.

Una aplicación Java no puede ser accedida desde el exterior debido a que se restringe el acceso de código desautorizado que pueda manipular el sistema. 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 prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las características del lenguaje con protecciones de sentido común aplicadas al propio navegador.

El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los errores de alineación. Los programadores de C utilizan punteros en conjunción con operaciones aritméticas. Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y pueda sumar (o restar) algún valor, para referirse a otro lugar de la memoria.

Si otros programadores conocen nuestras estructuras de datos pueden extraer información confidencial de nuestro sistema. Con un lenguaje como C, se pueden tomar números enteros aleatorios y convertirlos en punteros para luego acceder a la memoria:

    printf( “Escribe un valor entero: ” );

    scanf( “%u”,&puntero );

    printf( “Cadena de memoria: %s\n”,puntero );

El Caballo de Troya.

Se presenta un programa 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 programador deja un comando destructivo bajo 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 lanzar 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 fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal -código que falsea punteros, viola derechos de acceso 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 sabemos 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 correctos.
  • No ha ocurrido ninguna conversión ilegal de datos, tal como convertir enteros en punteros.
  • El acceso a los campos de un objeto se sabe que es legal: public, private, protected.
  • No hay ningún intento de violar las reglas de acceso y seguridad establecidas

El Cargador de Clases

El Cargador de Clases también ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros 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 luego entre las procedentes del exterior. Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen.

Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio 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 modificar la pila de programa, la memoria libre o utilizar objetos y métodos de un programa sin los privilegios del kernel del sistema operativo.

Además, para evitar modificaciones por parte de los crackers de la red, implementa un método ultraseguro de autentificación por clave pública. El Cargador de Clases puede verificar una firma digital antes de realizar 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.

Java y los virus

Dada, pues la concepción del lenguaje y si todos los elementos se mantienen dentro del estándar marcado por Oracle, no hay peligro. Java imposibilita, también, abrir ningún fichero de la máquina local (siempre que se realizan operaciones con archivos, éstas trabajan sobre el disco duro de la máquina de donde partió el applet), no permite ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra máquina para hacer peticiones o realizar operaciones con otra.

Además, los intérpretes que incorporan los navegadores de la Web son aún más restrictivos. Bajo estas condiciones (y dentro de la filosofía de que el único ordenador seguro es el que está apagado), se puede considerar 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 proporciona un desemsamblador de byte-code, que permite que cualquier programa pueda ser convertido a código fuente, lo que para el programador significa una vulnerabilidad total a su código. Utilizando javap no se obtiene el código fuente original, pero sí desmonta el programa mostrando el algoritmo que se utiliza, que es lo realmente interesante.

La protección de los programadores ante esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea descompilable todo el código; aunque así se pierda portabilidad. Esta es otra de las cuestiones que Java tiene pendientes.

Seguridad

Una característica completamente controversial es la seguridad de Java. Java se destaca, en teoría, por ser un lenguaje extremadamente seguro. En primer lugar se eliminan los punteros y el casting implícito de tipos que realiza el compilador de C y C++. Esto evita accesos ilegales a memoria.

Si se pudiera acceder a cualquier posición de memoria como se hace con los punteros de C, se podría acceder a alguna posición de memoria conocida y extraer datos que pudieran ser confidenciales, o bien alterarlos.  Incluso otra falencia en C y C++ es la fácil inserción de un troyano en sus programas, haciendo que la persona que haya hecho pasar este programa malicioso tenga acceso a todos los archivos del sistema. En Java, esto se soluciona mediante varias pruebas que se realizan antes de que el programa sea ejecutado en un dispositivo.

verificador de ByteCode

El código se pasa a través de un verificador de ByteCode que comprueba el formato de los fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal. El Cargador de clases también ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local del de los recursos procedentes de la red lo que imposibilita que una clase suplante a una ya predefinida.

Por tanto, un programa en java no accede a zonas delicadas de memoria o de sistemas de almacenamiento, e implementa además, por si se quisiera acceder a algún archivo del sistema, un método ultra seguro de autentificación por clave pública.

Esto quiere decir que permitirá solo la ejecución de programas que estén firmados digitalmente por una entidad certificadora conocida, y en otro caso, preguntará si realmente desea ejecutar el programa, siendo que al no estar firmado, las consecuencias de lo que pueda pasar con el mismo corren bajo su propio riesgo, un sistema parecido al que usa MacOS para mantener su sistema libre de aplicaciones maliciosas.

Además de imposibilitar abrir ficheros de la máquina local, Java evita que se puedan ejecutar aplicaciones nativas de una plataforma e impide que se utilicen otras computadoras como puente, es decir, que nadie puede utilizar nuestra computadora para hacer peticiones o realizar operaciones con otra. Es común que un fallo de seguridad en los navegadores y en cómo se hace la implementación de los applets en ellos, un tema recurrente que se da desde los orígenes de este lenguaje del que ya hablamos en el apartado de la historia de Java

Por lo tanto ¿Java es inseguro?

Si bien Java está encerrado en lo que se conoce como un SandBox que en español se define como entorno aislado, concepto que refiere al hecho de evitar que el programa pueda acceder a otras zonas de memoriadiscorecursos de red, etc, sabemos que Java puede saltarse las restricciones si la aplicación esta certificada por una entidad válida o también puede haber un fallo de diseño del propio lenguaje que lo permita.

No, pero por desgracia los complementos en los navegadores fallan. Si Java fuera un lenguaje inseguro no sería utilizado por empresas como Netflix, Twitter, Facebook, Amazon, Uber, Google, Android, Ebay, y un largo etcétera.

Seguridad del código de fuente

En las herramientas que nos brinda el JDK, existe la herramienta Javap que sirve para desensamblar archivos .class. Esto quiere decir que el programa que pueda llegar a desarrollar puede ser desensamblado por cualquier persona. Podríamos bajar algún juego por ejemplo de GameLoftempresa Francesa conocida por desarrollar una gran cantidad de aplicaciones para celulares especialmente hechas en Java, desensamblarlo y ver todo su código.

¿Hay alguna manera de asegurar mi código para evitar que cualquier persona tenga acceso al mismo?

La respuesta es mas o menos. Una forma de aislar completamente mi código es hacer que mi programa adopte la forma de cliente-servidor. Donde todo el código importante lo tendríamos en el servidor, y el código del cliente solo servirá para comunicarse con la aplicación del servidor. De esta manera se puede alejar las manos de cualquiera de nuestro código, con el costo de que para ejecutar la aplicación se debe contar si o si con una conexión a Internet.

Otra forma sería cifrar los archivos de clase, teniendo en cuenta que antes de la ejecución del programa necesitaremos descifrar los mismos, dejando un trabajo bastante fácil a los crackers. Un tercer método consistiría convertir nuestro programa a código nativo, lo que quitaría la característica al programa de ser multiplataforma, y que aunque con éste método dificultaremos más la tarea de decompilar el programa, no la evitaríamos totalmente.

Piensen solo en que videojuegos desarrollados por super compañías multimillonarias son crackeados tiempo después de su lanzamiento. Otro método consiste en lo que se llama Ofuscación del código. La Ofuscación de código consiste en modificar el código para que su comprensión sea muy difícil y al mismo tiempo cumpla la misma función que el código original. La ofuscación perfecta es imposible pero puede complicarle bastante la vida a quien esté analizando nuestro programa.

Programa ofuscado en C que implementa una calculadora científica.

Altamente seguro

El lenguaje Java es conocido por su seguridad y se utiliza para desarrollar sistemas libres de virus. Hay varios factores que lo convierten en un idioma seguro. Algunos de ellos son:

  • No hay punteros explícitos, por lo que nadie puede acceder a matrices fuera de límites. Si intenta acceder a ellos, mostrará una excepción ArrayIndexOutOfBound. Por lo tanto, varios fallos de seguridad, como el desbordamiento del búfer y la corrupción de la pila, son imposibles de explorar en Java. 
  • El cargador de clases de Java es parte de Java Runtime Environment (JRE), y se utiliza para cargar clases en la máquina virtual Java (JVM) . Separa los paquetes para clases de sistemas de archivos locales de los importados desde fuentes de red, lo que mejora la seguridad.
  • Java se ejecuta dentro de una zona de pruebas de máquina virtual.
  • Su entorno es independiente del entorno del sistema operativo, lo que lo hace más seguro.
  • El administrador de seguridad puede identificar el recurso al que puede acceder una clase.
  • El verificador de código de bytes de Java comprueba los fragmentos de código en busca de código ilegal que viole los derechos de acceso a los objetos. 
  • Además de proporcionar estos valores predeterminados, existe seguridad adicional a través de JAAS, SSL, criptografía , etc. 

Ejemplo:

Por ejemplo, el verificador de código de bytes de Java garantiza que el código cargado por la JVM no viole las restricciones de seguridad ni acceda a recursos no autorizados.

Ejecución de la zona de pruebas

Los programas en Java se ejecutan en un espacio diferente, por lo que los usuarios pueden ejecutar sus aplicaciones sin ningún efecto en el sistema subyacente utilizando el verificador de código de bytes. También aumenta la seguridad al verificar el código en busca de violaciones de acceso. 

Neutral desde la arquitectura:

El código de bytes de Java se puede ejecutar en cualquier tipo de procesador. JRE maneja automáticamente la ejecución del código en diferentes tipos de procesadores.

El compilador Java genera un formato de archivo de objeto de arquitectura neutral, lo que hace que el código compilado sea ejecutable en muchos procesadores, con la presencia del sistema de tiempo de ejecución Java.

Para establecer Java como parte 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 alguno la máquina en que ha sido generado.

El código fuente Java se “compila” a un código de bytes de alto nivel independiente de la máquina. Este código (byte-codes) está diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema run-time, que sí es dependiente de la máquina. En una representación en que tuviésemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genérica, obtendríamos una figura como la siguiente:

En ella podemos ver que lo verdaderamente dependiente del sistema es la Máquina Virtual Java (JVM) y las librerías fundamentales, que también nos permitirían acceder directamente al hardware de la máquina. Además, habrá APIs de Java que también entren en contacto directo con el hardware y serán dependientes de la máquina.

Ejemplo de este tipo de APIs podemos citar:

  •      Java 2D: gráficos 2D y manipulación de imágenes
  •      Java Media Framework : Elementos críticos en el tiempo: audio, video…
  •      Java Animation: Animación de objetos en 2D
  •      Java Telephony: Integración con telefonía
  •      Java Share: Interacción entre aplicaciones multiusuario
  •      Java 3D: Gráficos 3D y su manipulación

Java no tiene características que dependan de la implementación, lo que lo hace arquitectónicamente neutral. Por ejemplo, el tamaño del tipo de datos primitivo es fijo. 

En lenguaje C , el tipo de datos int ocupa una memoria de 2 bytes para la arquitectura de 32 bits y 4 bytes de memoria para la arquitectura de 64 bits. Sin embargo, en Java, se ocupan 4 bytes de memoria para la arquitectura de 32 y 64 bits. 

Portátil:

Un código Java escrito en una máquina con Windows se puede ejecutar sin ningún cambio de código en MacOS y viceversa. No es necesario realizar ningún cambio en el código específico del sistema operativo.

Ser neutral en cuanto a arquitectura y no tener aspectos de la especificación que dependan de la implementación hace que Java sea portátil. El compilador en Java está escrito en ANSI C con un límite de portabilidad limpio, que es un subconjunto POSIX.

la plataforma Java ha sido diseñada para que pueda soportar aplicaciones que puedan funcionar sobre sistemas con distintas características a lo largo de una red. Más allá de la portabilidad básica 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 forma que las ventanas puedan ser implantadas en entornos Unix, Pc o Mac.

Dinamismo entre equipos

En una empresa de relativo tamaño hay una pléyade diferente de ordenadores. Probablemente nos encontremos con estaciones de trabajo Sun para el desarrollo de software, hordas de PCs para cada empleado, algún Mac en el departamento de documentación, una estación de trabajo HP en administración y una estación SGI en la sala de demos. Desarrollar aplicaciones corporativas para un grupo tan diferente de plataformas en excesivamente complejo y caro.

Hasta ahora era complicado convencer a los programadores de cada arquitectura que utilizasen un API común para reducir el coste de las aplicaciones. Con un entorno run-time de Java portado a cada una de las arquitecturas de las plataformas presentes en la empresa y una buena librería de clases (“packages” en Java), los programadores pueden entenderse y encontrar muy interesante trabajar con Java. Esta posibilidad hará tender a los programadores hacia Java, justo donde otros intentos anteriores con entornos universales han fracasado.

Estos APIs eran simplemente inadecuados, no orientados a redes y, verdaderamente, pesados. Una vez que los programas estén escritos en Java, otro lado interesante del asunto es que los programadores también son portables. El grupo de programadores de la empresa puede ahora enfrentarse a un desarrollo para cualquiera de las plataformas. La parte del cliente y del servidor de una aplicación estarán ahora escritas en el mismo lenguaje.

Ejemplo:

Ya no será necesario tener un grupo que desarrolle para cada sistema y arquitectura; ahora todos ellos podrán estar juntos y formar el grupo de software de la empresa.

Puede llevar el código de bytes de Java a cualquier plataforma, lo que lo convierte en un lenguaje de programación portátil. Cualquier código escrito en Java en una máquina se puede ejecutar en otras máquinas. Además, no necesita ninguna implementación. 

Digamos que tiene un programa Java que imprime “¡Hola, mundo!”. El código será el mismo independientemente de la plataforma.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(“Hello, World!”);
    }
}

Ahora puedes compilar y ejecutar este programa en diferentes plataformas, como Windows, Linux, Mac, etc.

Robusto:

Java es un lenguaje muy robusto con comprobaciones de errores en tiempo de compilación muy estrictas, verificación de tipos estricta y manejo de excepciones en tiempo de ejecución. Java se esfuerza por eliminar situaciones propensas a errores enfatizando principalmente en la verificación de errores en tiempo de compilación y en tiempo de ejecución.

El lenguaje Java está diseñado para crear aplicaciones robustas y confiables. Java provee un compilador que se encarga de evaluar nuestro código en búsqueda de errores o situaciones anormales. El intérprete a su vez tiene el control absoluto de la aplicación evitando que la misma acceda a componentes de hardware o realice accesos directos a la memoria. Java realiza verificaciones en busca de problemas 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 declaración explícita de métodos, reduciendo así las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte 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 evitar la posibilidad de sobre escribir o corromper memoria resultado de punteros que señalan a zonas equivocadas. Estas características reducen drásticamente el tiempo de desarrollo de aplicaciones en Java.

Manejo de excepciones

Además, para asegurar el funcionamiento de la aplicación, realiza una verificación de los byte-codes, que son el resultado de la compilación de un programa 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 es un lenguaje robusto, lo que significa que es confiable. Está diseñado específicamente de una manera que pone mucho esfuerzo en verificar los errores lo antes posible. 

Por lo tanto, el compilador de Java puede detectar incluso errores que son difíciles de identificar en otros lenguajes de programación. Algunas características que hacen de Java un lenguaje de programación sólido son el manejo de excepciones , el recolector de basura y la asignación de memoria. 

Justamente por la forma en que está diseñado, Java no permite el manejo directo del hardware ni de la memoria (inclusive no permite modificar valores de punteros, por ejemplo); de modo que se puede decir que es virtualmente imposible colgar un programa Java. El intérprete siempre tiene el control.

Inclusive el compilador es suficientemente inteligente como para no permitir un montón de cosas que podrían traer problemas, como usar variables sin inicializarlas, modificar valores de punteros directamente, acceder a métodos o variables en forma incorrecta, utilizar herencia múltiple, etc. Además, Java implementa mecanismos de seguridad que limitan el acceso a recursos de las máquinas donde se ejecuta, especialmente en el caso de los Applets (que son aplicaciones que se cargan desde un servidor y se ejecutan en el cliente).

Robusto por naturaleza

También está diseñado específicamente para trabajar sobre una red, de modo que incorpora objetos que permiten acceder a archivos en forma remota (via URL por ejemplo). Además, con el JDK (Java Development Kit) vienen incorporadas muchas herramientas, entre ellas un generador automático de documentación que, con un poco de atención al poner los comentarios en las clases, crea inclusive toda la documentación de las mismas en formato HTML!

Un lenguaje robusto refiere a un lenguaje fuerte, y particularmente en informática refiere a la capacidad de un sistema informático de hacer frente a los errores durante la ejecución, así también como el buen manejo de excepciones, entendiendo por esto a capturar y resolver errores imprevistos en tiempo de ejecución.

Java realiza verificaciones tanto en tiempo de compilación como en tiempo de ejecución para la detección de errores, provee de un sistema de control de tipos que evita que por ejemplo se sumen números con cadenas, libera al programador de la tarea de manejar memoria manualmente lo que evita errores por corrupción de memoria, implementa chequeos en arrays para evitar que se acceda a una posición inexistente del mismo, y brinda un control completo de excepciones.

Entonces, Robusto significa fuerte, que es una de las principales características de Java. Este lenguaje de programación se desarrolló de manera que el enfoque principal y el esfuerzo se centren en detectar errores lo antes posible. 

Por lo tanto, el compilador en Java puede detectar incluso errores que otros lenguajes de programación no pueden identificar fácilmente.

Java es un lenguaje robusto por:

  • La falta de indicadores mitiga las amenazas a la seguridad.
  • Tiene una fuerte gestión de la memoria.
  • Java tiene un mecanismo de verificación de tipos y manejo de excepciones .
  • La recolección automática de basura que se ejecuta en JVM ayuda a deshacerse de los objetos que ya no utiliza una aplicación Java.

Multiproceso:

Java proporciona soporte integrado para multiprocesamiento y multiproceso. Java proporciona manejo de subprocesos, monitores, manejo de interbloqueos, condiciones de carrera, etc. Con la función multiproceso de Java, es posible escribir programas que puedan realizar muchas tareas simultáneamente. Esta característica de diseño permite a los desarrolladores crear aplicaciones interactivas que puedan ejecutarse sin problemas.

Java permite el desarrollo de aplicaciones que soportan la ejecución de múltiples hilos de trabajo en forma concurrente.  Al ser multithreaded (multihilvanado, en mala traducción), Java permite 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 gran 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 entornos de flujo único de programa (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 gran imagen que se está trayendo. En Java, las imágenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la información en la página sin tener que esperar por el navegador.

Multihilo en Java

Java es un lenguaje que permite hacer aplicaciones multihilo. Una aplicación multihilo es aquella que tiene la capacidad de ejecutar varios procesos al mismo tiempo. Esto quiere decir que podemos programar una aplicación y que mientras un hilo muestra una pantalla para interactuar con el usuario, otro hilo se encarga de realizar la conexión con el servidor en paralelo, otro hilo se encarga de realizar cálculos, etc.

Un ejemplo pueden ser los navegadores web, en donde no hay que esperar que cargue una página entera para poder visualizarla. El usuario puede navegar por la página web por más que la misma no haya cargado todas las imágenes que contiene. Esto es porque un hilo de ejecución paralelo se encarga de cargar las imágenes, mientras otro hilo nos muestra el resto del contenido de la página web.

Un hilo es similar a un programa separado que se ejecuta simultáneamente. Es importante para aplicaciones web, multimedia, etc. 

La función de subprocesos múltiples de Java permite que dos o más partes de un programa se ejecuten simultáneamente para una utilización máxima de los recursos y la CPU. Puede definir varios subprocesos para escribir programas Java que se ocupen de varias tareas a la vez. 

La mayor ventaja de esta característica en Java es que cada hilo no ocupa mucha memoria pero comparte un área de memoria común. 

Ejemplo:

A continuación se muestra un ejemplo sencillo de creación y ejecución de varios subprocesos:

class MyThread extends Thread {
    public void run() {
        System.out.println(“Thread running”);
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

En este ejemplo, se crean dos subprocesos ( thread1 y thread2 ) extendiendo la clase Thread . El método de ejecución se anula para definir el comportamiento del hilo. Cuando se inician los subprocesos, sus métodos de ejecución se ejecutan simultáneamente.

Alto rendimiento:

aunque Java se está interpretando, sigue teniendo un gran rendimiento. El compilador JIT (Just In Time) ayuda a mejorar el rendimiento. Java es Rápido. Sí, como lo leen, java es rápido.

Otra característica que puede causar gran controversia por la cantidad de personas y sitios web que dicen que Java no es un lenguaje rápido en comparación de lenguajes como por ejemplo C, pero la realidad es que desde que Java implemento un compilador Just in Time en su maquina virtual.

La velocidad de ejecución de sus aplicaciones son casi tan rápidas como un programa hecho en C, y no digo esto por vender ningún producto ya que no trabajo en Java ni me pagan por hacerles publicidad, sino que a los hechos me remito, y basándonos en documentos de investigación que realizaron ingenieros de diferentes universidades de Portugal, en donde comparan la eficiencia de 27 lenguajes de programación, podemos encontrar a Java como el cuarto lenguaje más rápido, siendo el primero C, y que si nos basamos en las tablas que utilizan ciertos algoritmos para determinar la eficiencia de cada lenguaje se puede ver que en uno de los casos Java tarda algo así 276 milisegundos más que C en ejecutar una serie de instrucciones.

La arquitectura de Java

Está diseñada de manera que reduce la sobrecarga durante el tiempo de ejecución. Además, utiliza el compilador JIT (Just in Time) para compilar código bajo demanda. Compila métodos que pueden ayudar a ejecutar aplicaciones más rápido. Java es más rápido que otros lenguajes de programación interpretados tradicionales ya que su código de bytes se acerca al código nativo. 

Sin embargo, al ser un lenguaje interpretado, es más lento que los lenguajes compilados, como C y C++.

Ejemplo:

Por ejemplo, la JVM compila dinámicamente el código de bytes ejecutado con frecuencia en código de máquina nativo para mejorar la velocidad de ejecución.

Distribuido:

Java está diseñado para sistemas distribuidos y es el lenguaje más popular para desarrollar aplicaciones basadas en Internet, ya que Internet es un entorno distribuido.

Java se ha construido con extensas capacidades de interconexión TCP/IP. Existen librerías de rutinas para acceder e interactuar con protocolos como http y ftp. Esto permite a los programadores acceder a la información a través de la red con tanta facilidad como a los ficheros locales. La verdad es que Java en sí no es distribuido, sino que proporciona las librerías y herramientas para que los programas puedan ser distribuidos, es decir, que se corran en varias máquinas, interactuando.

Java es un lenguaje de programación distribuido ya que nos permite crear aplicaciones distribuidas. Podemos utilizar la invocación de métodos remotos (RMI) y los beans Java empresariales (EJB) para crear estas aplicaciones distribuidas en Java. 

Podemos distribuir programas Java fácilmente en uno o más sistemas interconectados a través de una conexión a Internet. Esta es una de las características básicas de Java que nos permite acceder a archivos llamando a métodos desde otras máquinas disponibles en Internet. 

Soporte para trabajar en red

Otra característica importante de Java es el soporte que ofrece para trabajar en red. Para eso se abstrajeron las características y detalles específicos en referencia a los aspectos técnicos de redes de comunicaciones. Con el objetivo de simplificar la tarea del programador a la hora de trabajar con redes a bajo nivel, Java proporciona formas básicas de trabajar en red mediante Sockets URL. En base a esto se desprende la característica de que Java proporciona librerías herramientas para que los programas puedan ser distribuidos, y que gracias a la capacidad que tiene para realizar conexiones con protocolos TCP, UDP, HTTP y FTP, permite el acceso de la información a través de la red con tanta facilidad de cómo se accede a los datos de un archivo.

Dinámico:

Se considera que Java es más dinámico que C o C++ ya que está diseñado para adaptarse a un entorno en evolución. Los programas Java pueden transportar una gran cantidad de información en tiempo de ejecución que se puede utilizar para verificar y resolver accesos a objetos en tiempo de ejecución.

Java provee un mecanismo en el cual las clases son cargadas en el sistema a medida que se las necesitan. Además, en un ambiente cliente-servidor, las aplicaciones del lado del servidor pueden tener modificaciones sin que el cliente tenga que recompilar su código. Java se beneficia todo lo posible de la tecnología orientada 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).

Java también simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una aplicación Java sobre la red y encuentra una pieza de la aplicación que no sabe manejar, Java es capaz de traer automáticamente cualquiera de esas piezas que el sistema necesita para funcionar.

Ejemplo:

Java, para evitar que los módulos de byte-codes o los objetos o nuevas clases, haya que estar trayéndolos de la red cada vez que se necesiten, implementa las opciones de persistencia, para que no se eliminen cuando de limpie la caché de la máquina.

Java es un lenguaje de programación dinámico porque admite la carga dinámica de clases. Al ser un lenguaje de programación orientado a objetos, Java brinda la flexibilidad de agregar clases a pedido, crear nuevas clases a través de subclases y agregar nuevos métodos a las clases existentes. 

Además, admite funciones escritas en lenguajes nativos, como C y C++. Además, Java cuenta con características como administración automática de memoria y compilación dinámica, lo que lo convierte en un lenguaje dinámico.

Performance:

Java adopta un esquema de trabajo en el cual el intérprete Java puede funcionar a una alta velocidad.  A su vez, el “Garbage Collector” funciona por detrás de la aplicación con baja prioridad, lo que permite una mayor disponibilidad de memoria para cuando la misma sea requerida por la aplicación.

Flexible

Además de ser Robusto es un lenguaje flexible. Java combina flexibilidad, robustez y legibilidad. Si bien Java es un lenguaje de tipado fuerte, existe la posibilidad de declarar atributos del tipo Object, que dicho de otra manera, quiere decir que pueden tomar cualquier forma, o mejor dicho ser de cualquier tipo. Asimismo se pueden realizar conversiones entre tipos mediante métodos de casteo provistos por el lenguaje. El programador por tanto utiliza tipos específicos para ganar legibilidad, mientras que en algunos casos donde debe tratar con algún tipo de dato desconocido utiliza el tipo de dato Object a fin de ganar flexibilidad.

Enlace dinámico

La interpretación del código o la tecnología utilizada por el compilador Just in Time permite que los datos se incorporen en tiempo de ejecución. Esto quiere decir que las clases de java solo son enlazadas cuando son necesitadas y que también se puedan enlazar nuevos módulos de código bajo demanda procedentes de fuentes muy variadas,  incluso desde la red.

Por ejemplo: Si desarrollo un videojuego en Java, podría tener una clase que corresponde al menú del juego, y otra clase que corresponde al juego en sí una vez iniciada la partida Al ejecutar el programa, el compilador JIT enlazará la clase correspondiente al menú, y no será hasta que inicie el juego, cuando la clase correspondiente al juego en sí sea enlazada. En el caso de que se enlacen librerías nuevas o actualizadas no se paralizará la ejecución de las aplicaciones actuales –siempre que mantengan el API anterior.

Acá es necesario frenar un poco para entender que es un API.  De paso nos servirá también para entender el caso de Oracle vs Google que ha sido mencionado en el apartado de la historia de Java. 

Java es un lenguaje de programación completo orientado a objetos, por lo que permite la flexibilidad de agregar clases y métodos a las clases existentes. 

Además, puedes crear nuevas clases a través de subclases. Además, Java admite funciones escritas en otros lenguajes, como C y C++, que se consideran métodos nativos.

API

API es el acrónimo de Application Programming Interfaz o Interfaz de programación de aplicaciones en español. Para explicar que es un API debemos retornar al concepto de JDK, el cual es, según dijimos, un conjunto de herramientas librerías que sirven para poder desarrollar y ejecutar programas en Java. Bien, nosotros detallamos algunas de las herramientas pero no hablamos nunca de librerías, y cuando hablamos de librerías nos referimos a un conjunto de clases o archivos que contienen funciones útiles para el desarrollo de nuestro programa.

Por ejemplo, para mostrar un mensaje en la consola de java llamamos a una función llamada println, y dicha función está incluida en una clase que está dentro de la API de Java. Así como funciones para mostrar mensajes por consola, existen otras para pedir datos al usuario, para manejar archivos, conexiones de red, mostrar ventanas e interfaces gráficas, realizar operaciones matemáticas y muchísimas más.

Hay que tener en cuenta que la API se actualiza con cada versión nueva de Java proveyéndonos de nuevas clases, nuevas funciones y en algunos casos dejando obsoletas funciones de APIs anteriores, que retomando el tema, la obsolescencia de estas funciones no paralizarán la ejecución de las aplicaciones actuales –siempre que mantengan el API anterior.

Garbage collector

Un elemento estrella es el conocido garbage collector o recolector de basura de Java. Si bien no fueron los que lo inventaron, si fueron los que lo implementaron bien, es un programa que está todo el tiempo analizando la memoria a fin de localizar objetos en la misma que ya no se usen para eliminarlos. Podemos hacer una analogía para que se entienda un poco el concepto del recolector de basura sin necesidad de saber los conceptos del paradigma orientado a objetos.

Supongamos que creo una variable de tipo entera, y que sirve para almacenar la edad del usuario. Al comienzo de mi programa le pido al usuario que ingrese su edad, y si el mismo es mayor de 18 años procedo a ejecutar el programa, el cual puede estar mucho tiempo en ejecución.

 int edad;
 println(“Ingrese su edad”);
 edad = scanValue();
 if(edad>=18){
    //Código de mi programa
 }

Esta variable no la voy a usar nunca más en mi programa, pero sin embargo el valor seguirá cargado en memoria ocupando un espacio en ella. El recolector de basura detecta este tipo de variables que se encuentran en memoria, y que ya no serán utilizadas, y las elimina a fin de evitar fugas de memoria,  problema que puede aparecer en lenguajes como C++ ya que el programador puede olvidar liberar bloques de memoria que ya no estén siendo utilizados.

 Además de evitar fugas de memoria es un gran aporte para la productividad del programador, ya que  se han estudiado casos concretos en donde los programadores han dedicado un 40% del tiempo de desarrollo para determinar en qué momento se puede liberar un bloque de memoria.

Comunidad de desarrolladores

Para terminar con el tema de las características que nos brinda Java no podemos dejar de nombrar a la gran comunidad de desarrolladores del lenguaje. Los millones de desarrolladores que trabajan con Java conforman una comunidad de desarrollo que aportan infinidad de bibliotecas y utilidades para extender la funcionalidad y mejorar la plataforma de Java.

Casi cualquier cosa que se pueda llegar a necesitar seguramente ya estará desarrollada en algún proyecto de código abierto, y lo mejor de todo es que muchas bibliotecas conocidas y utilizadas las mantienen Google, Facebook, Apache y Amazon que nos provee de un JDK personalizado el cual está dirigido y supervisado personalmente por James Gosling. Esto nos facilita mucho la vida como programadores y no existen muchas comunidades que puedan brindar la misma cantidad de código utilizable. 

Conclusión

Es por todo esto que Java es un lenguaje tan popular y utilizado por tantas personas y organizaciones importantes. Aprender Java hará que puedan conseguir en trabajo casi en cualquier lugar, ya que la demanda de empleo es gigante y resultará útil para conocer muchas características, que nos darán un mejor entendimiento no solo de Java, sino también de otros lenguajes, lo cual es sumamente beneficioso ya que como programadores no debemos casarnos con un lenguaje, sino tener las herramientas necesarias para poder elegir el lenguaje adecuado según lo que se necesite desarrollar.

¿Cuál es la ventaja de todo esto?¿Qué gano con Java?

No debes volver a escribir el código si quieres ejecutar el programa en otra máquina. Un solo código funciona para todos los browsers compatibles con Java o donde se tenga una Máquina Virtual de Java

es un lenguaje de programación orientado a objetos, y tiene todos los beneficios que ofrece esta metodología de programacion

Un browser compatible con Java deberá ejecutar cualquier programa hecho en Java, esto ahorra a los usuarios tener que estar insertando “plug-ins” y demás programas que  a veces nos quitan tiempo y espacio en disco.

Java es un lenguaje y por lo tanto puede hacer todas las cosas que puede hacer un lenguaje de programación: Cálculos matemáticos, procesadores de palabras, bases de datos, aplicaciones gráficas, animaciones, sonido, hojas de cálculo, etc.

algunas limitantes:

  • La velocidad.
  • Los programas hechos en Java no tienden a ser muy rápidos, supuestamente se está trabajando en mejorar esto. Como los programas de Java son interpretados nunca alcanzan la velocidad de un verdadero ejecutable.
  • Java es un lenguaje de programación. Esta es otra gran limitante, por más que digan que es orientado a objetos y que es muy fácil de aprender sigue siendo un lenguaje y por lo tanto aprenderlo no es cosa fácil.

Mantenimiento y soporte

Un problema bien conocido que ocurre con el software corporativo es la demanda de cuidados y realimentación. Java no es, ciertamente, la cura para la enfermedad del mantenimiento, pero tiene varias características que harán la vida del enfermero más fácil. Uno de los componentes del JDK es javadoc.

Si se usan ciertas convenciones en el código fuente Java (como comenzar un comentario con /** y terminarlo con */), javadoc se puede fácilmente generar páginas HTML con el contenido de esos comentarios, que pueden visualizarse en cualquier navegador. La documentación del API de Java ha sido creada de este modo. Esto hace que el trabajo de documentar el código de nuevas clases Java sea trivial.

Otro gran problema del desarrollador corporativo es la creación y control de makefiles. Leerse un makefile es como estar leyendo la historia de empresa. Normalmente se pasan de programador a programador, quitando la información que no es esencial, siempre que se puede. Esto hace que muchos de los makefiles de las aplicaciones contengan docenas de librerías, una miríada de ficheros de cabecera y ultra-confusos macros. Java reduce las dependencia de complejos makefiles drásticamente.

Primero, no hay ficheros de cabecera. Java necesita que todo el código fuente de una clase se encuentre en un solo fichero. Java tiene la inteligencia de make en el propio lenguaje para simplificar la compilación de byte-codes.

Por ejemplo:

    public class pepe {                      // Fichero: pepe.java

        Guitarra flamenca ;

        }

    public class guitarra {                  // Fichero: guitarra.java

        }

% javac -verbose pepe.java

[parsed pepe.java in 720ms]

[loaded C:\JAVA\BIN\..\classes\java\lang\Object.class in 220ms]

[checking class pepe]

[parsed .\\Guitarra.java in 50ms]

[wrote pepe.class]

[checking class Guitarra]

[wrote .\\Guitarra.class]

[done in 2300ms]

El compilador Java se da cuenta de que necesita compilar el fichero guitarra.java. Ahora vamos a forzarlo a que recompile pepe.java sin cambiar guitarra.java, podremos comprobar que el compilador de byte-code Java no recompila innecesariamente el fichero guitarra.java.

% javac -verbose pepe.java

[parsed pepe.java in 440ms]

[loaded C:\JAVA\BIN\..\classes\java\lang\Object.class in 160ms]

[checking class pepe]

[loaded .\\Guitarra.java in 0ms]

[wrote pepe.class]

[done in 1860ms]

Ahora, si modificamos guitarra.java (añadiendo, por ejemplo, otro miembro a la clase) y compilamos pepe.java, el compilador Java se dará cuenta de que debe recompilar tanto pepe.java como guitarra.java

% javac -verbose pepe.java

[parsed pepe.java in 710ms]

[loaded C:\JAVA\BIN\..\classes\java\lang\Object.class in 220ms]

[checking class pepe]

[parsed .\\Guitarra.java in 0ms]

[wrote pepe.class]

[checking class Guitarra]

[wrote .\\Guitarra.class]

[done in 2640ms]

No te detengas, sigue avanzando

Aquí tienes un propósito para este 2024 que debes considerar seriamente: si has querido mejorar tus habilidades en hacking, Ciberseguridad y programación ahora es definitivamente el momento de dar el siguiente paso. ¡Desarrolla tus habilidades aprovechando nuestros cursos a un precio increíble y avanza en tu carrera!

Universidad Hacking. Todo en Ciberseguridad. Curso Completo

Aprende Hacking Ético y Ciberseguridad sin necesitar conocimientos Previos. Practica Hacking Ético y Ciberseguridad aquí

Calificación: 4,6 de 5 (2.877 calificaciones) 15.284 estudiantes Creado por Alvaro Chirou • 1.800.000+ Enrollments Worldwide

Lo que aprenderás

  • Aprende Seguridad informática
  • Te enseñare Hacking Ético
  • Veremos Ciberseguridad
  • La base principal del Hacking, Redes
  • Esto es alternativo que puedes aprender, Programación (python)
  • Necesitaras saber Python para, Hacking con Python
  • Te enseñare Análisis de Malware, además haremos laboratorios, practicas y ejecutaremos Malware para que veas su comportamiento
  • Te enseñare a reforzar tu Privacidad y Anonimato
  • Aprenderás una de las herramientas mas populares por excelencia en el mundo del Hacking, Metasploit
  • Es importante que aprendas Seguridad informática Mobile ya que usamos nuestro celular como una PC
  • Veremos también el top 10 de Owasp Web
  • Veremos también el top 10 de Owasp mobile
  • Veremos también el top 10 de Owasp API
  • Ante la demanda del mercado, te enseñare Seguridad informática para empresas
  • Veras también la suit de herramientas de seguridad informática en un sistema operativo, Kali Linux
  • Herramientas de hacking para el celular en Termux
  • Seguridad informática en WordPress
  • Análisis de trafico en Wireshark

El Hacking Ético y Ciberseguridad es Transversal a todo lo que sea Tecnología. Es decir, cualquier dispositivo inteligente, sea Celular, Computadora, o hasta hoy un Vehículo, debe haber Seguridad informática.

¿Esto que significa?

Que hoy más que nunca, se necesitan personas capacitadas en este rubro para trabajar.

Por esa razón cree esta formación profesional para compartirte mis conocimientos y experiencia en la materia y puedas iniciar en este mundo del Hacking Ético y Ciberseguridad.

Te voy a estar acompañando en el proceso de aprendizaje, donde si estas empezando desde 0, sin conocimientos previos, no es un impedimento ya que iniciaremos como si no supieras nada de la materia.

Y si sos una persona con conocimientos, podrás iniciar directamente en el nivel más avanzado o en el que tu elijas.

Como en todos mis cursos en udemy, tendrás muchísima practica para que materialices lo que vas aprendiendo.

Empieza a aprender ya mismo!

Aprende con nuestros más de 100 cursos que tenemos disponibles para vos

¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?

Sobre los autores

Álvaro Chirou

Yo soy Álvaro Chirou, tengo más de 20 Años de experiencia trabajando en Tecnología, eh dado disertaciones en eventos internacionales como OWASP, tengo más de 1.800.000 estudiantes en Udemy y 100 formaciones profesionales impartidas en la misma. Puedes serguirme en mis redes:

Laprovittera Carlos

Soy Laprovittera Carlos. Con más de 20 años de experiencia en IT brindo Educación y Consultoría en Seguridad de la Información para profesionales, bancos y empresas. Puedes saber más de mi y de mis servicios en mi sitio web: laprovittera.com y seguirme en mis redes:

¿Quieres iniciarte en hacking y ciberseguridad pero no sabes por dónde empezar? Inicia leyendo nuestra guia gratuita: https://achirou.com/como-iniciarse-en-ciberseguridad-y-hacking-en-2024/ que te lleva de 0 a 100. Desde los fundamentos más básicos, pasando por cursos, recursos y certificaciones hasta cómo obtener tu primer empleo.

SIGUE APRENDIENDO GRATIS CON NUESTRAS GUIAS

Cómo Iniciarse en Hacking y Ciberseguridad en 2024

Curso Gratis de Programación

Curso Gratis Linux – Capitulo 1 – Introducción a Linux

Curso Gratis de Redes – Capitulo 1 – Tipos de redes y servicios

Como iniciarse en TRY HACK ME – Complete Beginner #1

OSINT #1 Más de 200 Search Tools