Fundamentos de Java


Introducción

¿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.


Explicació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;
/* Declaración de Interfaz */
public interface TransporteAereo{
  public void volar();
}

Tabla 6. Ejemplo de declaración de una interfaz.

package aeropaquete;
/* Declaración de la clase Avión con la implementación de la interfaz TransporteAereo */
public class Avion implements TransporteAereo{
  public void volar(){
    System.out.println("Vuela...");
  }
}

Tabla 7. Ejemplo de implementación de una interfaz.

package aeropaquete;
/* Declaración de la clase con el método main */
public class Aeropuerto{
  public static void main(String[] args) throws Exception {
    Avion av = new Avion();
    hacerVolar(av);
  }
  public static void hacerVolar(Avion a){
    a.volar();
  }
}

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:

  • Set: una colección que no puede contener duplicados.
  • List: una colección ordenada que sí puede contener duplicados.
  • Queue: una colección utilizada para mantener múltiples elementos antes de su procesamiento. Es la implementación de la estructura de datos cola.
  • Deque: representa una cola, pero de dos extremos, es decir, se puede insertar y eliminar de ambos lados.
  • Map: es un objeto que posee dos elementos: una clave y un valor. No puede contener claves duplicadas.

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:


Cierre

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?


Checkpoint

Asegúrate de:

  • Reconocer las principales características de Java para aplicarlas en el desarrollo de un programa.
  • Diferenciar entre los métodos y las interfaces con el fin de aplicar correctamente la programación orientada a objetos en el desarrollo de un sistema.
  • Comprender las interfaces básicas de las colecciones para utilizarlas de acuerdo con las necesidades en el desarrollo de un sistema.
  • Determinar cuándo usar cada una de las clases de implementación para procesar datos complejos en un desarrollo de software.

Bibliografía

  • Arroyo, C. (2019). Programación en JAVA I. Argentina: Six Ediciones.
  • Oracle. (2021-a). The Java Tutorials. Lesson: Interfaces. Recuperado de https://docs.oracle.com/javase/tutorial/collections/interfaces/index.html
  • Oracle. (2021-b). Class ArrayList. Recuperado de https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
  • Oracle. (2021-c). Class Stack. Recuperado de https://docs.oracle.com/javase/8/docs/api/java/util/Stack.html
  • Oracle. (2021-d). Class ArrayDeque. Recuperado de https://docs.oracle.com/javase/9/docs/api/java/util/ArrayDeque.html
  • Oracle. (2021-e). Class HashSet. Recuperado de https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
  • Oracle. (2021-f). Class HashMap. Recuperado de https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html
  • Oracle. (2021-g). Class LinkedList. Recuperado de https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
  • Schildt, H. (2018). Java: The Complete Reference (11a ed.). España: McGraw-Hill.

La obra presentada es propiedad de ENSEÑANZA E INVESTIGACIÓN SUPERIOR A.C. (UNIVERSIDAD TECMILENIO), protegida por la Ley Federal de Derecho de Autor; la alteración o deformación de una obra, así como su reproducción, exhibición o ejecución pública sin el consentimiento de su autor y titular de los derechos correspondientes es constitutivo de un delito tipificado en la Ley Federal de Derechos de Autor, así como en las Leyes Internacionales de Derecho de Autor.

El uso de imágenes, fragmentos de videos, fragmentos de eventos culturales, programas y demás material que sea objeto de protección de los derechos de autor, es exclusivamente para fines educativos e informativos, y cualquier uso distinto como el lucro, reproducción, edición o modificación, será perseguido y sancionado por UNIVERSIDAD TECMILENIO.

Queda prohibido copiar, reproducir, distribuir, publicar, transmitir, difundir, o en cualquier modo explotar cualquier parte de esta obra sin la autorización previa por escrito de UNIVERSIDAD TECMILENIO. Sin embargo, usted podrá bajar material a su computadora personal para uso exclusivamente personal o educacional y no comercial limitado a una copia por página. No se podrá remover o alterar de la copia ninguna leyenda de Derechos de Autor o la que manifieste la autoría del material.