Programación Orientada a Objetos 2 - Java

En este capítulo vamos a hablar de Java, uno de los lenguajes pilares de la programación orientada a objetos, en el cual van a estar los ejemplos vistos en esta serie de capítulos.

Vamos a hablar de su historia, entender su funcionamiento, el por qué lo elegimos, y prepararte para escribir tu primer programa.

Un Poco de Historia y Filosofía

Java fue concebido originalmente por Sun Microsystems en 1995 y desde entonces ha sido adoptado como uno de los lenguajes de programación más populares del mundo.

En 2010, Oracle Corporation adquirió Sun Microsystems, llevando a Java a nuevas alturas. Su lema “Escribe una vez, ejecuta en cualquier lugar” encapsula su filosofía de portabilidad y eficiencia, permitiendo que el mismo código funcione en diferentes plataformas sin modificaciones.

¿Por Qué Elegimos Java?

Java (también hay que incluir a C#) es uno de los lenguajes pioneros y más populares de programación orientada a objetos, en la actualidad sigue teniendo gran importancia y un alto uso dentro de la industria.

Java se elige por varias razones:

  • Portabilidad: Gracias a la JVM (Java Virtual Machine), el código Java es portable y puede ejecutarse en cualquier sistema operativo.
  • Orientado a Objetos: Promueve un diseño limpio y modular, facilitando el mantenimiento y la escalabilidad del software.
  • Seguridad y Robustez: Gestiona la memoria automáticamente y protege contra muchas vulnerabilidades comunes en otros lenguajes.
  • Rico Ecosistema: Amplia gama de bibliotecas y marcos de trabajo para casi cualquier tarea de programación imaginable.

Compilado vs. Interpretado: El Papel de la JVM

Java es tanto compilado como interpretado, la JVM (Java Virtual Machine) es una maquina virtual que nos permite ejecutar código Java. Es un programa que se instala sobre el sistema operativo y corre nuestro programa.

Primero, el código fuente se compila en bytecode por el compilador Java, y luego, en tiempo de ejecución, la JVM interpreta y ejecuta este bytecode.

Esta doble etapa permite una verificación y optimización exhaustiva, lo que contribuye a la eficiencia y portabilidad de Java, ya que el código compilado es independiente del sistema operativo, es el mismo para todos porque ejecuta sobre la JVM.

La JVM es quien se encarga de interactuar con el Sistema Operativo.

Instalación del JDK (Java Development Kit)

La JDK es un kit de desarrollo necesario para escribir y ejecutar programas Java. Incluye la JRE (Java Runtime Environment) y un conjunto de herramientas para desarrollar Java.

  • Paso 1: Descarga del JDK: Visita el sitio web oficial de Oracle o una distribución de OpenJDK y descarga la versión más reciente del JDK para tu sistema operativo.

  • Paso 2: Instalación: Ejecuta el instalador descargado y sigue las instrucciones. Asegúrate de seleccionar un PATH de instalación que recuerdes, ya que necesitarás referenciarlo más tarde.

  • Paso 3: Configuración del PATH: Para poder ejecutar los comandos de Java desde la línea de comandos, necesitas agregar la ubicación del binario de Java al PATH del sistema.

    • En Windows: Ve a Configuración del Sistema > Variables de Entorno y edita la variable de sistema ‘Path’ para incluir la ruta al binario de Java (ej. C:\Program Files\Java\jdk-11.0.1\bin).

    • En macOS/Linux: Edita tu archivo de perfil (.bash_profile, .bashrc, .zprofile, etc.) y añade export PATH=/usr/lib/jvm/jdk-11.0.1/bin:$PATH, reemplazando la ruta con tu ruta de instalación específica.

  • Paso 4: Verificación: Abre una terminal o línea de comandos y escribe java -version y javac -version. Si la instalación fue exitosa, deberías ver las versiones instaladas del JRE y del compilador Java, respectivamente.

IDE (Entorno de Desarrollo Integrado)

Una IDE te proporcionará una interfaz para escribir, depurar y ejecutar tu código. Algunos populares incluyen:

  • Eclipse: La IDE más usada por desarrolladores Java.
  • IntelliJ IDEA: Conocido por su ergonomía y características inteligentes.
  • NetBeans: Otro IDE gratuito y de código abierto.

Elige uno, descárgalo e instálalo desde su sitio web oficial.

Sintaxis Java

Java es un lenguaje de programación rico y potente con muchos elementos en su sintaxis. A continuación, te presento los elementos básicos que necesitarás conocer para empezar a programar en Java.

1. Clases

Todo en Java está asociado con clases e interfaces. Una clase es un “modelo” para crear objetos (instancias específicas de la clase).


   public class MiClase {
      //Atributos, métodos, etc.
   }
              

2. Métodos

Un método es un bloque de código que se ejecuta cuando se invoca. Un programa Java puede tener muchos métodos.


   public void miMetodo(){
      //Código para ejecutar
   }
              

3. Variables

Las variables son contenedores para almacenar datos. En Java, cada variable debe ser declarada con un tipo de datos.


   int miNumero = 5; //Variable de tipo entero
              

4. Tipos de Datos

Java es un lenguaje de programación fuertemente tipado. Algunos tipos básicos incluyen:

  • int: Para enteros.
  • double: Para números decimales.
  • boolean: Para verdadero/falso.
  • char: Para caracteres individuales.
  • String: Para cadenas de texto.

5. Operadores

Java utiliza operadores para realizar operaciones en variables y valores. Algunos ejemplos comunes incluyen:

  • +: Adición
  • -: Sustracción
  • *: Multiplicación
  • /: División
  • %: Módulo
  • ==: Igual a
  • !=: No igual a

6. Control de Flujo

El control de flujo permite que tu programa tome decisiones y ejecute código de manera condicional.

  • If Statement:

   if (condicion1) {
      //código a ejecutar si la condición1 es verdadera
   } else if (condicion2) {
      //código a ejecutar si la condición2 es verdadera
   } else if (condicion3) {
      //código a ejecutar si la condición3 es verdadera
      /// ...
   } else {
      //código a ejecutar si ninguna condición previa es verdadera
   }
               
  • Switch Statement:

   swirch (expresion) {
      case x: 
            //código a ejecutar si expresion es igual a x (expresion == x)
            break; //no sigue evaluando los otros casos
      case y: 
            //código a ejecutar si expresion es igual a y (expresion == y)
            break; //no sigue evaluando los otros casos
      default:
         //código a ejecutar si no se cumplen los casos anteriores
         //también se ejecuta si no salió por algún break
   }
               

7. Bucles

Los bucles se utilizan para ejecutar un bloque de código varias veces.

  • For Loop:


   for (int i=0; i < 10; i++) {
      //código a ejecutar en cada iteración
   }
               
  • While Loop:


   while (condicion) {
      //código a ejecutar mientras la condición sea verdadera (true)
   }
                              

8. Arreglos

Los arreglos en Java son contenedores que almacenan múltiples elementos del mismo tipo.


   int[] miArreglo = {1, 2, 3, 4, 5};
              

9. Comentarios

Los comentarios son utilizados para explicar el código y pueden ayudar cuando se revisa el código en el futuro. No son ejecutados por el programa.

  • Comentarios de una sola línea: // Esto es un comentario
  • Comentarios de varias líneas: /* Esto es un comentario multilínea */

10. Acceso a Miembros y Modificadores de Acceso

  • Acceso a miembros: public, private, y protected determinan la visibilidad de clases, variables y métodos.

  • Modificadores no acceso: Como static, que indica que un miembro pertenece a la clase en lugar de a una instancia de la clase.

11. Constructores

Un constructor es un método especial que se utiliza para inicializar objetos.


   public class MiClase {
      // atributos
   
      // Constructor
      public MiClase() {
         // código para ejecutar durante la creación del objeto
      }
   }                          
              

12. Herencia

La herencia permite que una clase adquiera los campos y métodos de otra clase.


   public class MiSubclase extends MiClase {
      // Clase que hereda de mi clase
   }              
              

13. Interfaces y Clases Abstractas

Las interfaces y clases abstractas se utilizan para lograr la abstracción en Java.

  • Interface:


   interface MiInterface {
      public void miMetodo();
   }
              
  • Clase Abstracta:

   abstract class MiClase {
      public abstract void miMetodo(); //método abstracto
   }
              

14. Excepciones

Las excepciones son eventos que ocurren durante la ejecución del programa y alteran el flujo normal, se capturan mediante las sentencias try/catch


   try {
      // código que puede generar una excepción
   } catch (ExceptionType1 e) {
      // código para manejar la excepción
   } catch (ExceptionType2 e) {
      // código para manejar la excepción
      // ...
   } catch (ExceptionTypeN e) {
      // código para manejar la excepción
   }                          
              

15. Colecciones en Java

Las colecciones son estructuras de datos que se usan para almacenar y organizar múltiples elementos. Java proporciona un framework de colecciones robusto que permite trabajar con diferentes tipos de conjuntos de datos.

Framework de Colecciones

El framework de colecciones de Java brinda varias interfaces y clases para almacenar y manipular grupos de objetos.

Estas interfaces y clases se encuentran principalmente en el paquete java.util.

Interfaces e implementaciones

Se declara la variable (o el atributo) con el tipo de la interfaz, y cuando se crea se le asigna un tipo concreto de implementación.

  • List: La interfaz más simple, una colección ordenada (lista) que puede contener elementos duplicados. Permite acceso posicional a los elementos.

    • Ejemplo de implementación: ArrayList, LinkedList.
  • Set: Una interfaz de Conjunto. Esta colección no contiene elementos duplicados.

    • Ejemplo de implementación: HashSet, LinkedHashSet, TreeSet.
  • Map: Interfaz tipo mapa (clave, valor). Este objeto mapea claves a valores. Una clave no puede duplicarse, pero puede tener uno o más valores.

    • Ejemplo de implementación: HashMap, LinkedHashMap, TreeMap.
  • Queue: Una colección diseñada para operaciones de tipo FIFO (First-In-First-Out).

    • Ejemplo de implementación: PriorityQueue, LinkedList.

Generics

Las colecciones suelen utilizarse junto con Generics, que permiten definir colecciones con un tipo de datos específico.

Por ejemplo, List<String> define una lista de elementos que son cadenas de texto.

  • Ejemplo de Uso de List

   // nombres es de tipo List (Interfaz)
   // al crearla le asigno un tipo concreto, ArrayList
   List<String> nombres = new ArrayList<>();
   nombres.add("Ana");
   nombres.add("Luis");
   // List permite elementos duplicados
   nombres.add("Ana");
   
   for (String nombre : nombres) {
         System.out.println(nombre);
   }               
              
  • Ejemplo de Uso de Set

   Set<String> nombres = new HashSet<>();
   nombres.add("Ana");
   nombres.add("Luis");
   nombres.add("Ana");
   
   // Set no permite elementos duplicados, no lo agregará
   for (String nombre : nombres) {
         System.out.println(nombre);
   }                              
              
  • Ejemplo de Uso de Map

   Map<String, Integer> edades = new HashMap<>();
   edades.put("Ana", 25);
   edades.put("Luis", 30);
   edades.put("Ana", 28); // Las claves son únicas. Esto sobrescribe el valor de "Ana".
   
   for (Map.Entry<String, Integer> entrada : edades.entrySet()) {
         System.out.println(entrada.getKey() + ": " + entrada.getValue());
   }                           
              
  • Ejemplo de Uso de Queue

   Queue<String> cola = new LinkedList<>();
   cola.offer("Primero");
   cola.offer("Segundo");
   cola.offer("Tercero");
   
   while (!cola.isEmpty()) {
         System.out.println(cola.poll());
   }                             
              

Los elementos básicos de la sintaxis de Java mencionados aquí forman la columna vertebral de cualquier programa Java. 

A lo largo de los capítulos iremos viendo qué significa cada uno.

Tu Primer Programa Java: “Hola Mundo”

Una vez que hayas configurado tu entorno, es hora de escribir tu primer programa.

  • Paso 1: Crear un Nuevo Archivo: Abre tu IDE, crea un nuevo proyecto y luego un nuevo archivo llamado HolaMundo.java.

  • Paso 2: Escribe el Código: Copia el siguiente código en tu archivo.


   public class HolaMundo { // Clase
      // public static void main es el Punto de entrada de todo programa
      public static void main(String[] args) {
            System.out.println("¡Hola, mundo!");
      }
   }
              
  • Paso 3: Compilar y Ejecutar: Utiliza las herramientas de tu IDE para compilar y ejecutar el programa. Deberías ver “¡Hola, mundo!” impreso en la salida.

Entendiendo el Código

  • Clase: public class HolaMundo define una clase pública llamada HolaMundo. En Java, todo código tiene que estar dentro de una clase.

  • Método main: public static void main(String[] args) define el método principal, el punto de entrada de cualquier programa Java. Cuando ejecutas el programa, el JVM llama a este método.

  • Imprimir a Consola: System.out.println("¡Hola, mundo!"); imprime una línea de texto en la consola. Es una forma de mostrar datos al usuario.

Resolución de Problemas Comunes

No te desanimes si te encuentras con errores, son parte del aprendizaje. Siempre analiza el error, probablemente sea alguno de los siguientes:

  • JDK Instalado Correctamente: Asegúrate de que tanto java como javac estén disponibles en tu línea de comandos o terminal.
  • Estructura del Código: Verifica que la estructura de tu código coincida exactamente con el ejemplo y que el nombre del archivo coincida con el nombre de la clase.
  • Configuración del IDE: Asegúrate de que tu IDE esté configurado para usar el JDK que instalaste.
  • “Googlea”:googlear” es lo que evitará “reinventar la rueda“. La comunidad Java es muy grande y siempre dispuesta a ayudar, en sitios como Stack Overflow encontrarás muchos problemas comunes.

Explorando Más Allá

Una vez que te sientas cómodo con los fundamentos, no te detengas. Java es muy potente.

Experimenta con conceptos más avanzados como hilos, colecciones y GUIs.

Sumérgete en marcos de trabajo como Spring para ver cómo Java se maneja en entornos empresariales.

Conclusiones

Java no es solo un lenguaje, es una aventura en el mundo de la programación. Con cada línea de código, estás participando en una historia que ha sido escrita por millones de desarrolladores a lo largo de décadas.

Así que adelante, configura tu entorno, escribe tu código y sé parte de la comunidad global que sigue llevando a Java a nuevos horizontes.