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
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.
.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");
}
}