¿Alguna vez te has preguntado qué lenguajes utilizan aplicaciones como Netflix, Uber o Twitter? Estas grandes empresas han experimentado con diversos lenguajes de programación, pero el que les ha sido de mayor utilidad es Java.
Un lenguaje con trayectoria a lo largo de los años, en el que la empresa Oracle ha trabajado y ha puesto su mayor esfuerzo para mantener una versión actualizada que se adapte a las nuevas exigencias del presente y del futuro.
Java es un lenguaje universal, orientado a objetos y que posee la ventaja de tener un motor oculto que transforma un programa Java en código que se puede ejecutar en cualquier máquina, lo que permite compatibilidad en diversos sistemas operativos; a esto se le llama máquina virtual de Java o también se conoce, por sus siglas en inglés, como JVM (Java Virtual Machine).
En este tema recordarás las bases de la programación orientada a objetos utilizando Java como lenguaje de programación.
Estructura del lenguaje
Java es un lenguaje muy popular debido a sus contribuciones en el desarrollo de sistemas de información, especialmente de comercio electrónico en Internet. El lenguaje es compatible con distintos sistemas operativos gracias al bytecode.
El bytecode es un conjunto altamente optimizado de instrucciones diseñadas para ser ejecutadas por la máquina virtual de Java (JVM), que forma parte del entorno de ejecución de Java (JRE). En esencia, la JVM original se diseñó como un intérprete de bytecode (Sznajdleder, 2018).
Figura 1. Esquema de arquitectura general de un programa en ejecución en una máquina virtual de Java.
Fuente: Arroyo, C. (2019). Programación en JAVA I. Argentina: Six Ediciones.
Solo para fines educativos.
El lenguaje Java está compuesto por identificadores, palabras clave, literales, expresiones, operadores, variables, tipos de datos, bloques y sentencias de control que te facilitan la programación. Java es un lenguaje orientado a objetos, por lo que todo lo anterior debe estar dentro de una clase. Una clase es una estructura que agrupa datos junto con la funcionalidad necesaria para manipular dichos datos (Sznajdleder, 2018).
Como todo lenguaje de programación, Java posee identificadores que te ayudan a definir el nombre de tus variables, constantes o clases. También posee palabras clave o palabras reservadas que son únicamente para el uso del lenguaje, por lo que no las podrás utilizar como identificadores de alguna variable. A continuación, se muestra una tabla con las principales palabras clave:
Tabla 1. Principales palabras reservadas en Java.
La variable es la unidad básica de almacenamiento en un programa Java. Una variable se define mediante la combinación de un identificador, un tipo y un inicializador opcional. Además, todas las variables tienen un ámbito que define su visibilidad y un tiempo de vida. Estos elementos se examinan a continuación (Schildt, 2018).
Java es un lenguaje altamente tipado, es decir, una variable debe ser definida por un tipo de dato, que indicará cómo se clasifica la información que se almacenará en la variable. Los tipos de datos se clasifican en datos primitivos y en datos objeto.
Figura 2. Tipo de datos en Java.
Los tipos de datos primitivos que podemos ocupar en Java son los siguientes:
Tabla 2. Tipos de datos primitivos.
Algunas veces necesitarás asignar un valor a una variable y para ello necesitamos las literales que son datos que se asignan a las variables. Y con la palabra final puedes hacer que se convierta en constante, es decir, que no sufra cambio a lo largo de la ejecución del programa.
Como notarás en el ejemplo, cada línea termina en un punto y coma, lo que significa que es el final de una sentencia. Una sentencia es la unidad mínima de ejecución de un programa y se agrupan para formar bloques con el fin de resolver un problema.
public class App { public static void main(String[] args) throws Exception { int days = 365; // Literal de tipo entero System.out.println("Número de días = " + days );
String name = "TecMilenio"; // Literal de tipo cadena System.out.println("Nombre = " + name);
float value; // Declaración de una variable de tipo flotante value = 1.5f; // Literal de tipo flotante System.out.println("Valor = " + value);
final double PI=3.141592653589793; // Literal constante de tipo double System.out.println("PI = "+ PI );
} } |
Tabla 3. Ejemplo de declaración de variables y literales.
Java proporciona un rico entorno de operadores y la mayoría de ellos pueden dividirse en los siguientes cuatro grupos: aritméticos, de bits, relacionales y lógicos (Schildt, 2018).
De igual forma, en Java también contamos con expresiones que son combinaciones de operadores y variables que regresan algún tipo de dato dependiendo de los elementos ocupados, por ejemplo: (a * 2).
Programación orientada a objetos en Java
Como habrás notado, Java es un lenguaje de programación bastante completo y estructurado. Y la programación orientada a objetos (POO) es la base de Java. Al menos todos los programas de Java son formados por una clase.
Una clase es una plantilla para un objeto y un objeto es una instancia de una clase. Dado que un objeto es una instancia de una clase, a menudo verás las dos palabras: objeto e instancia utilizadas indistintamente (Schildt, 2018).
Cada objeto realiza una acción que se llama método. Java puede definir varios métodos con el mismo nombre, pero diferenciados por el tipo de parámetros que son definidos y a esto se le llama sobrecarga de métodos. Asimismo, un objeto también tiene propiedades específicas que son los atributos. A continuación, se muestra un ejemplo de la definición de una clase:
public class Figura { private int id; private double base; private double altura;
/* Constructor sin parámetros */ public Figura() { }
/* Constructor con parámetros */ public Figura(int id, double base, double altura) { this.id = id; this.base = base; this.altura = altura; }
/* Sobrecarga de métodos */ public double calcularArea(double base, double altura){ return base * altura; }
/* Sobrecarga de métodos */ public double calcularArea(double base){ return base * 2; } } |
Tabla 4. Ejemplo de definición de una clase y sobrecarga de métodos.
Java, al igual que varios lenguajes orientados a objetos, ha desarrollado mecanismos como la encapsulación, la abstracción, la herencia y el polimorfismo que ayudan a implementar el modelo orientado a objetos.
“Un elemento esencial de la programación orientada a objetos es la abstracción” (Schildt, 2018). Los seres humanos gestionan la complejidad mediante la abstracción. Por ejemplo, imagina que calientas tu comida en un microondas; regularmente no te preocupan los circuitos que tiene el microondas o la manera en la que se construyó ni cómo es su funcionamiento, solo lo percibes como un objeto que tiene una función. A eso se le llama abstracción, porque te permite usar el microondas sin sentirte abrumado por la complejidad de cada una de sus piezas, al contrario, únicamente lo utilizas y no te preocupa nada más.
“El encapsulamiento es el mecanismo que une el código y los datos que manipula, y mantiene a ambos a salvo de interferencias externas y usos indebidos” (Schildt, 2018). Así que puedes imaginar que el encapsulamiento es una envoltura que protege al código y a los datos para que no puedan acceder a ellos arbitrariamente por otro código que esté fuera de esa envoltura protectora.
“La herencia es el proceso por el cual un objeto adquiere las propiedades de otro” (Schildt, 2018). Por ejemplo, un labrador forma parte de una clasificación de perros que, a su vez, forma parte de una clasificación de mamíferos que está bajo la clasificación mayor que es animal, por lo que, mediante el uso de la herencia, si lo piensas en clases, la clase labrador puede adquirir las propiedades de la clase animal.
El polimorfismo (del griego, que significa "muchas formas") es una característica que permite utilizar una interfaz para una clase general de acciones (Schildt, 2018).
Cuando se aplican correctamente, “el polimorfismo, la encapsulación y la herencia se combinan para producir un entorno de programación que soporta el desarrollo de programas mucho más robustos y escalables que el modelo orientado a procesos” (Schildt, 2018).
Paquetes y modificadores de acceso
A lo largo de tu vida te has dado cuenta de que cuando tienes un orden, este te ayuda a mejorar tu vida a través de la organización. Por ejemplo, si clasificas las prendas en tu closet, te será más fácil encontrarlas cada vez que las necesitas. En Java también se cuenta con una organización, un cajón para guardar cada una de tus clases por tipo, es decir, los paquetes.
Schildt (2018) expone que los paquetes son un mecanismo de control para dividir el espacio de nombres de clases en partes más manejables.
Se pueden definir clases dentro de un paquete que no son accesibles por el código fuera de ese paquete, para lo cual se necesitan los modificadores de acceso, los cuales pueden ser private, public, protected o por defecto, y proporcionan una variedad de maneras de producir los muchos niveles de acceso.
Tabla 5. Modificadores de acceso.
Las clases y los paquetes son medios para encapsular y contener el espacio de nombres y el ámbito de las variables y los métodos. Los paquetes actúan como contenedores de clases y otros paquetes subordinados. Las clases actúan como contenedores de datos y código.
Interfaces base
Las interfaces son una lista de acciones que realiza un objeto que, a diferencia de los métodos, las interfaces únicamente son el prototipo de la función.
Ejemplo de la implementación de una interfaz:
package aeropaquete; |
Tabla 6. Ejemplo de declaración de una interfaz.
package aeropaquete; |
Tabla 7. Ejemplo de implementación de una interfaz.
package aeropaquete; |
Tabla 8. Ejemplo de uso de una interfaz.
“Las interfaces básicas de las colecciones encapsulan diferentes tipos de colecciones” (Oracle, 2021-a).
Las interfaces básicas son las siguientes:
Estas interfaces permiten manipular las colecciones independientemente de los detalles de su representación. Las interfaces de colección básicas son la base del marco de trabajo de las colecciones de Java.
Clases de implementación
Las clases de implementación son los objetos de datos utilizados para almacenar colecciones que implementan las interfaces Set, List, Queue y Map. Entre las más comunes se encuentran las siguientes:
Java es un lenguaje que brinda muchos beneficios al orientarse a objetos, ya que ofrece portabilidad y reutilización del código. Es un lenguaje que ofrece una amplia gama de posibilidades en cuanto al manejo de los datos, puede ocupar desde los más simples, como los enteros, booleanos o flotantes, hasta tipos más complejos que manejan estructuras de datos como List, Set, etc. Asimismo, estos pueden implementarse a través de las clases ArrayList, HashMap, HashSet, etc.
Después de lo aprendido y sabiendo que Java es un lenguaje con más de dos décadas de existencia, ¿consideras que tiene futuro como lenguaje de programación?, ¿por qué se mantiene a lo largo de los años?
Asegúrate de: