====== 02.1 - Fundamentos de programación en Java ======
===== 1. Lenguajes de programación =====
Podemos clasificar los lenguajes de programación atendiendo a distintos criterios
==== Según su nivel de abstracción ====
* **Lenguajes de bajo nivel:** Están muy cercanos al hardware. Dependen de la arquitectura de la máquina, por lo que **no son portables** (no se pueden ejecutar en otra máquina distinta a aquella para la que se programaron). A cambio, aprovechan al máximo el rendimiento del hardware.
* **Lenguaje máquina:** Único lenguaje que comprende directamente el procesador. Formado exclusivamente por cadenas de bits (0 y 1).
* **Lenguaje ensamblador:** Representación simbólica (mnemónicos) del código máquina. Cada arquitectura de procesador tiene su propio ensamblador.
Ejemplo de código máquina:
0010 0000 1001 1001 1000 1110
Ejemplo de lenguaje ensamblador:
MOV R1, DPL
CJNE R1, #78H, T05SEG
RET
* **Lenguajes de alto nivel:** Se aproximan al lenguaje natural humano e ignoran las complejidades del hardware. Son **portables** entre distintas arquitecturas. Ejemplos: Java, Python, C#, JavaScript, PHP.
==== Según su forma de ejecución ====
* **Lenguajes compilados:** Necesitan un programa **compilador** que traduce todo el código fuente a lenguaje máquina antes de su ejecución (ej. C, C++).
* **Lenguajes interpretados:** Un programa **intérprete** lee y traduce el código fuente a lenguaje máquina línea a línea, en tiempo real mientras se ejecuta (ej. Python, JavaScript).
===== 2. Elementos de un lenguaje de programación =====
Hay una serie de elementos que están presentes en casi todo lenguaje de programación:
* **Tipos de datos**: enteros, reales, cadena de caracteres...
* **Palabras reservadas**: conjunto de palabras propias del lenguaje de programación. No pueden utilizarse, por ejemplo, para nombrar variables o constantes.
* **Operadores**: Crean instrucciones utilizando cálculos matemáticos (operadores aritméticos), comparaciones (operadores relacionales) u operaciones lógicas (operadores lógicos).
* **Constantes y variables**: Posiciones de memoria que almacenan los datos con los que trabaja nuestro programa. Las constantes no pueden variar a lo largo de la ejecución del programa, mientras que las variables sí.
* **Estructuras de control**: Secuenciales, condicionales o bucles.
* **Funciones**: Bloques de código empaquetados con una cabecera que realizan una tarea específica, lo que permite, entre otras cosas, la reutilización del código.
* **Comentarios**: Bloques dentro del código que no se ejecutan. Su función es la de aclarar partes del programa.
===== 3. Introducción al lenguaje Java =====
Java es un lenguaje de programación de alto nivel, de propósito general y con una sintaxis ampliamente derivada de C/C++. Fue creado originalmente por **Sun Microsystems** (actualmente propiedad de Oracle) en 1995.
Entre sus pilares fundamentales destacan:
* **Lenguaje híbrido (compilado e interpretado):** Combina ambas técnicas mediante un proceso en dos fases:
- **Compilación:** Traduce el código fuente (archivos ''.java'') a un código intermedio universal llamado **bytecode** (archivos ''.class'').
- **Ejecución e interpretación:** La **Máquina Virtual de Java** (**JVM**) interpreta ese //bytecode// en la máquina de destino. Gracias a este modelo, el programa es totalmente **portable**: se puede ejecutar en cualquier sistema operativo o arquitectura que disponga de la //JVM// (*"Escríbelo una vez, ejecútalo en cualquier lugar"*).
* **Orientación a Objetos (POO):** Salvo los tipos primitivos, todo el código se estructura en clases y objetos, lo que favorece la modularidad, el mantenimiento y la reutilización.
* **Gran ecosistema y librerías:** Incluye una amplia biblioteca estándar (API) que proporciona herramientas listas para usar en casi cualquier tipo de desarrollo (gestión de archivos, estructuras de datos, redes, etc.).
==== Compilación y ejecución de aplicaciones Java ====
Los archivos de código fuente en Java tienen la extensión ''.java'' y su nombre **debe coincidir exactamente con la clase principal** que contienen.
public class HolaMundo {
static void main() {
IO.println("Hola Mundo");
}
}
Existen dos formas de ejecutar este programa desde la consola:
**1. Ejecución directa en un solo paso**: Ideal para pruebas rápidas. Compila en memoria y ejecuta el resultado de forma transparente:
java HolaMundo.java
**2. Proceso tradicional en dos pasos (entornos de producción):**
1. Compilar el código fuente a bytecode (genera el archivo ''HolaMundo.class''):
javac HolaMundo.java
2. Ejecutar el bytecode compilado en la JVM:
java HolaMundo
Al ejecutar con el comando ''java'' un archivo ya compilado, **no debemos poner la extensión .class**, solo el nombre de la clase. Esta ejecución es más rápida porque no requiere recompilar el código.
==== Generación de archivos .class ====
El compilador de Java genera **un archivo .class por cada clase definida** en nuestro código fuente, independientemente de si están en el mismo archivo ''.java'' o en archivos separados.
public class HolaMundo2 {
static void main() {
IO.println("Hola Mundo 2");
}
}
class HolaMundo3 {
static void main() {
IO.println("Hola Mundo 3");
}
}
Al ejecutar ''javac HolaMundo2.java'', se generarán dos archivos independientes: ''HolaMundo2.class'' y ''HolaMundo3.class''.
**Regla de visibilidad de archivos:** Un archivo ''.java'' solo puede contener **una clase pública (public)** como máximo, y el nombre del archivo debe coincidir exactamente con el nombre de dicha clase.
==== Estructura de una aplicación Java ====
Vamos a ver la estructura del ejemplo anterior //HolaMundo.java//:
public class HolaMundo {
static void main() {
IO.println("Hola Mundo");
}
}
* **''public class HolaMundo''**: Define la clase. Todo código en Java debe residir dentro de una clase.
* **Llaves (''{'' ''}'')**: Delimitan los bloques de código (clases, métodos, bucles, etc.).
* **''static void main()''**: Es el **método de entrada** (punto de inicio) de la aplicación. La JVM busca y ejecuta automáticamente este método al arrancar el programa.
* **''IO.println(...)''**: Instrucción que imprime el texto indicado por pantalla y añade un salto de línea.
==== Secuencia de instrucciones ====
Las instrucciones se ejecutan secuencialmente (de arriba a abajo) y **deben terminar obligatoriamente con punto y coma (;)**.
static void main() {
IO.println("Primera instrucción");
IO.println("Segunda instrucción");
}
==== Indentación del código ====
Aunque Java no obliga a sangrar el código para que compile (a diferencia de Python), la **indentación es fundamental** para garantizar la legibilidad del proyecto. Se recomienda usar **4 espacios** por cada nivel de anidamiento.
Ejemplo con correcta indentación:
public class HolaMundo {
static void main() {
IO.println("Código fácil de leer");
}
}
==== Comentarios ====
Los comentarios son anotaciones dentro del código fuente que el compilador ignora por completo. Su objetivo es explicar la lógica del programa, añadir notas aclaratorias o generar documentación técnica.
En Java podemos escribir comentarios de tres formas:
* **Comentarios de una sola línea:** Empiezan con dos barras (''//'').
* **Comentarios de bloque (multilínea):** Se encierran entre ''/*'' y ''*/''.
* **Comentarios de documentación (JavaDoc):** Se encierran entre ''/**'' y ''*/'' para generar documentación técnica en HTML.
/**
* Comentario de documentación (JavaDoc).
* Muestra información sobre la clase o el autor.
*/
public class HolaMundo {
static void main() {
/*
* Comentario de bloque o multilínea.
* Útil para detallar algoritmos o bloques
* de código complejos.
*/
// Comentario de una línea: explica la instrucción siguiente
IO.println("Hola mundo");
}
}
**No abuses de los comentarios:** Como indica Robert C. Martin en su libro //Código limpio// (Clean Code), el mejor comentario es el que no hace falta escribir. Es preferible escribir código expresivo y autoexplicativo (utilizando buenos nombres de variables y métodos) antes que llenar el programa de comentarios redundantes.
**Limpia el código "muerto":** Durante la fase de desarrollo es habitual comentar bloques de código para realizar pruebas. Es importante eliminar todo ese código comentado antes de finalizar y entregar el proyecto, ya que genera ruido y confunde a otros programadores.