Mi primer programa en Java: guía paso a paso para principiantes

D
DanisCh
(Actualizado: ) • 12 min de lectura
Mi primer programa en Java: guía paso a paso para principiantes
Consejos para estudiar programación Empezar desde cero Java

Java es uno de los lenguajes de programación más usados del mundo desde hace más de 25 años. Se usa para desarrollar aplicaciones empresariales, backends de APIs, aplicaciones Android, sistemas bancarios y mucho más. Si estás empezando desde cero, esta guía te lleva de la instalación hasta tu primer programa funcionando, explicando cada línea del camino.

Qué necesitas instalar

Para programar en Java necesitas dos cosas: el JDK (Java Development Kit) y un editor de código.

Instalar el JDK

El JDK incluye el compilador de Java (javac) y la máquina virtual que ejecuta los programas (java). Hay varias distribuciones gratuitas; la más recomendada para empezar es Eclipse Temurin (la distribución de Adoptium).

  1. Ve a adoptium.net y descarga la versión LTS más reciente del JDK (actualmente la 21)
  2. Ejecuta el instalador y sigue los pasos
  3. Asegúrate de marcar la opción de configurar la variable de entorno JAVA_HOME si el instalador lo ofrece

Verifica que la instalación funcionó abriendo una terminal y escribiendo:

java --version
# Deberías ver algo como:
# openjdk 21.0.x 2024-xx-xx

javac --version
# javac 21.0.x

Instalar Visual Studio Code con la extensión de Java

VS Code es gratuito y funciona en Windows, macOS y Linux.

  1. Ve a code.visualstudio.com y descarga VS Code
  2. Instálalo y ábrelo
  3. Ve a la pestaña de Extensiones (icono de cuatro cuadrados en la barra lateral)
  4. Busca Extension Pack for Java (el pack oficial de Microsoft) e instálalo

Alternativamente, puedes usar IntelliJ IDEA Community Edition, que es gratuito y el IDE preferido por la mayoría de desarrolladores Java profesionales. Tiene todo integrado sin necesidad de extensiones adicionales.

Tu primer programa: Hola Mundo

Crea una carpeta para tu proyecto, abre una terminal dentro de ella y crea un archivo llamado HolaMundo.java con el siguiente contenido:

public class HolaMundo {
    public static void main(String[] args) {
        System.out.println("Hola, Mundo!");
    }
}

Para ejecutarlo, compílalo primero y luego ejecútalo:

# Compilar: genera el archivo HolaMundo.class
javac HolaMundo.java

# Ejecutar el programa compilado
java HolaMundo

# Salida:
# Hola, Mundo!

En Java moderno (desde la versión 11) también puedes ejecutar un único archivo directamente sin compilar manualmente:

java HolaMundo.java
# Hola, Mundo!

Qué significa cada línea del Hola Mundo

public class HolaMundo {
    public static void main(String[] args) {
        System.out.println("Hola, Mundo!");
    }
}
  • public class HolaMundo: en Java, todo el código vive dentro de una clase. El nombre de la clase debe coincidir exactamente con el nombre del archivo (por eso el archivo se llama HolaMundo.java). public significa que es accesible desde cualquier parte.
  • public static void main(String[] args): el punto de entrada del programa. Cuando ejecutas la aplicación, Java busca este método exacto y empieza a ejecutar desde aquí. static significa que no necesita crear un objeto para llamarlo, void significa que no devuelve ningún valor, y String[] args son los argumentos que puedes pasarle desde la terminal.
  • System.out.println(...): imprime texto en la consola seguido de un salto de línea. System es una clase de Java, out es la salida estándar, y println es el método que escribe el texto.

Una regla importante: en Java, el nombre del archivo .java debe ser exactamente igual al nombre de la clase pública que contiene. Si la clase se llama HolaMundo, el archivo debe llamarse HolaMundo.java, con las mismas mayúsculas.

Un programa más completo: calculadora simple

Vamos a construir algo más interesante: un programa que pide dos números al usuario y muestra las operaciones básicas entre ellos.

import java.util.Scanner;

public class Calculadora {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("=== Calculadora simple ===");
        System.out.println();

        // Pedir el primer número
        System.out.print("Introduce el primer número: ");
        double numero1 = scanner.nextDouble();

        // Pedir el segundo número
        System.out.print("Introduce el segundo número: ");
        double numero2 = scanner.nextDouble();

        // Calcular y mostrar resultados
        System.out.println();
        System.out.printf("Suma:     %.2f + %.2f = %.2f%n", numero1, numero2, numero1 + numero2);
        System.out.printf("Resta:    %.2f - %.2f = %.2f%n", numero1, numero2, numero1 - numero2);
        System.out.printf("Producto: %.2f × %.2f = %.2f%n", numero1, numero2, numero1 * numero2);

        if (numero2 != 0) {
            System.out.printf("División: %.2f / %.2f = %.2f%n", numero1, numero2, numero1 / numero2);
        } else {
            System.out.println("División: no es posible dividir entre cero");
        }

        scanner.close();
    }
}

Compila y ejecuta:

javac Calculadora.java
java Calculadora

Nota el import java.util.Scanner; al inicio: Java no incluye automáticamente todas sus herramientas. Para usar clases como Scanner (que lee la entrada del usuario), debes importarlas explícitamente.

Los conceptos fundamentales explicados

Variables y tipos de datos

Java es un lenguaje de tipado estático y fuertemente tipado: cuando declaras una variable debes especificar su tipo, y no puedes mezclarlo después.

// Tipos primitivos: los más básicos, sin objetos

// Números enteros
int edad = 25;
long poblacionMundo = 8_000_000_000L;   // L al final indica long
byte pequeño = 127;                      // -128 a 127
short mediano = 32000;                   // -32768 a 32767

// Números decimales
double precio = 19.99;      // 64 bits, el más usado para decimales
float temperatura = 36.6f;  // 32 bits, necesita la 'f' al final

// Un solo carácter
char inicial = 'A';         // comillas simples, no dobles

// Verdadero o falso
boolean activo = true;
boolean mayorDeEdad = edad >= 18;

// Tipos de referencia (objetos)

// Texto: String es una clase, no un primitivo
String nombre = "Ana García";
String vacio = "";

// var: inferencia de tipo (desde Java 10, solo para variables locales)
var ciudad = "Madrid";      // inferido como String
var altura = 1.75;          // inferido como double
var contador = 0;           // inferido como int

Entrada del usuario con Scanner

import java.util.Scanner;

public class EntradaUsuario {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Leer texto
        System.out.print("¿Cuál es tu nombre? ");
        String nombre = scanner.nextLine();

        // Leer entero
        System.out.print("¿Cuántos años tienes? ");
        int edad = scanner.nextInt();
        scanner.nextLine();   // consumir el salto de línea que deja nextInt()

        // Leer decimal
        System.out.print("¿Cuánto mides en metros? ");
        double altura = scanner.nextDouble();

        System.out.println();
        System.out.println("Nombre: " + nombre);
        System.out.println("Edad:   " + edad + " años");
        System.out.printf("Altura: %.2f m%n", altura);

        scanner.close();
    }
}

Concatenación e impresión de texto

String nombre = "Carlos";
int edad = 30;
double salario = 2500.50;

// Concatenación con +
System.out.println("Me llamo " + nombre + " y tengo " + edad + " años");

// printf: formato al estilo C, más control sobre la presentación
System.out.printf("Salario: %.2f€%n", salario);   // %.2f = 2 decimales, %n = salto de línea
System.out.printf("%-20s tiene %d años%n", nombre, edad);   // %-20s = texto alineado a la izquierda

// String.format: igual que printf pero devuelve un String en lugar de imprimir
String mensaje = String.format("Me llamo %s y tengo %d años", nombre, edad);
System.out.println(mensaje);

// Text blocks (Java 15+): strings multilínea
String json = """
        {
            "nombre": "%s",
            "edad": %d
        }
        """.formatted(nombre, edad);
System.out.println(json);

Condicionales

int edad = 20;
double nota = 7.5;

// if / else if / else
if (edad < 18) {
    System.out.println("Menor de edad");
} else if (edad >= 18 && edad < 65) {
    System.out.println("Adulto en edad laboral");
} else {
    System.out.println("Jubilado");
}

// Operador ternario
String categoria = edad >= 18 ? "adulto" : "menor";

// switch clásico
String diaSemana = "lunes";
switch (diaSemana) {
    case "sábado":
    case "domingo":
        System.out.println("Fin de semana");
        break;
    case "lunes":
    case "martes":
    case "miércoles":
    case "jueves":
    case "viernes":
        System.out.println("Día laborable");
        break;
    default:
        System.out.println("Día no reconocido");
}

// switch expression (Java 14+): más conciso y sin break
String tipo = switch (diaSemana) {
    case "sábado", "domingo" -> "fin de semana";
    default                  -> "día laborable";
};

// switch con notas
String calificacion = switch ((int) nota) {
    case 9, 10 -> "Sobresaliente";
    case 7, 8  -> "Notable";
    case 5, 6  -> "Aprobado";
    default    -> nota >= 0 ? "Suspenso" : "Nota no válida";
};
System.out.println(calificacion);   // Notable

Bucles

// for: cuando sabes cuántas veces repetir
for (int i = 1; i <= 5; i++) {
    System.out.println("Iteración " + i);
}

// while: mientras se cumpla la condición
int intentos = 0;
while (intentos < 3) {
    System.out.println("Intento " + (intentos + 1));
    intentos++;
}

// do-while: se ejecuta al menos una vez
Scanner scanner = new Scanner(System.in);
String respuesta;
do {
    System.out.print("¿Continuar? (s/n): ");
    respuesta = scanner.nextLine().toLowerCase();
} while (!respuesta.equals("s") && !respuesta.equals("n"));

// for-each: recorrer arrays y colecciones
String[] frutas = {"manzana", "banana", "naranja", "kiwi"};
for (String fruta : frutas) {
    System.out.println(fruta);
}

// break y continue
for (int i = 1; i <= 10; i++) {
    if (i == 7) break;       // sale del bucle al llegar al 7
    if (i % 2 == 0) continue; // salta los pares
    System.out.print(i + " ");   // imprime: 1 3 5
}

Arrays y ArrayList

// Array: tamaño fijo, se define al crearlo
int[] numeros = {10, 20, 30, 40, 50};
System.out.println(numeros[0]);      // 10 (índices desde 0)
System.out.println(numeros.length);  // 5

// Declarar y luego asignar
String[] nombres = new String[3];
nombres[0] = "Ana";
nombres[1] = "Carlos";
nombres[2] = "María";

// Recorrer con índice
for (int i = 0; i < nombres.length; i++) {
    System.out.println(i + ": " + nombres[i]);
}

// ArrayList: tamaño dinámico, se puede añadir y quitar elementos
import java.util.ArrayList;

ArrayList lista = new ArrayList<>();
lista.add("Ana");
lista.add("Carlos");
lista.add("María");

System.out.println(lista.size());    // 3
System.out.println(lista.get(1));    // Carlos
System.out.println(lista.contains("Ana"));  // true

lista.remove("Carlos");
lista.remove(0);   // eliminar por índice

// for-each con ArrayList
for (String nombre : lista) {
    System.out.println(nombre);
}

Métodos

public class Metodos {

    // Método que no devuelve nada (void)
    static void mostrarBienvenida() {
        System.out.println("¡Bienvenido al programa!");
        System.out.println("=======================");
    }

    // Método que recibe parámetros y devuelve un valor
    static double sumar(double a, double b) {
        return a + b;
    }

    // Método con varios parámetros
    static String crearSaludo(String nombre, int edad) {
        return "Me llamo " + nombre + " y tengo " + edad + " años";
    }

    // Sobrecarga: mismo nombre, diferentes parámetros
    static int multiplicar(int a, int b) {
        return a * b;
    }

    static double multiplicar(double a, double b) {
        return a * b;
    }

    public static void main(String[] args) {
        mostrarBienvenida();

        double resultado = sumar(15.5, 4.5);
        System.out.println("15.5 + 4.5 = " + resultado);

        String saludo = crearSaludo("Ana", 28);
        System.out.println(saludo);

        System.out.println(multiplicar(3, 4));       // llama al de int
        System.out.println(multiplicar(3.0, 4.5));   // llama al de double
    }
}

Un programa completo: gestor de lista de tareas

import java.util.ArrayList;
import java.util.Scanner;

public class GestorTareas {

    static ArrayList tareas = new ArrayList<>();
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("=== Gestor de Tareas ===");

        boolean continuar = true;
        while (continuar) {
            System.out.println();
            System.out.println("1. Ver todas las tareas");
            System.out.println("2. Añadir tarea");
            System.out.println("3. Eliminar tarea");
            System.out.println("4. Salir");
            System.out.print("Elige una opción: ");

            String opcion = scanner.nextLine().trim();

            switch (opcion) {
                case "1" -> mostrarTareas();
                case "2" -> añadirTarea();
                case "3" -> eliminarTarea();
                case "4" -> {
                    continuar = false;
                    System.out.println("¡Hasta luego!");
                }
                default -> System.out.println("Opción no válida. Elige entre 1 y 4.");
            }
        }

        scanner.close();
    }

    static void mostrarTareas() {
        if (tareas.isEmpty()) {
            System.out.println("No hay tareas pendientes");
            return;
        }
        System.out.println("\nTareas pendientes (" + tareas.size() + "):");
        for (int i = 0; i < tareas.size(); i++) {
            System.out.println("  " + (i + 1) + ". " + tareas.get(i));
        }
    }

    static void añadirTarea() {
        System.out.print("Nueva tarea: ");
        String tarea = scanner.nextLine().trim();
        if (!tarea.isEmpty()) {
            tareas.add(tarea);
            System.out.println("✓ Tarea '" + tarea + "' añadida");
        } else {
            System.out.println("La tarea no puede estar vacía");
        }
    }

    static void eliminarTarea() {
        mostrarTareas();
        if (tareas.isEmpty()) return;

        System.out.print("Número de tarea a eliminar: ");
        try {
            int indice = Integer.parseInt(scanner.nextLine().trim()) - 1;
            if (indice >= 0 && indice < tareas.size()) {
                String eliminada = tareas.remove(indice);
                System.out.println("✓ Tarea '" + eliminada + "' eliminada");
            } else {
                System.out.println("Número fuera de rango");
            }
        } catch (NumberFormatException e) {
            System.out.println("Eso no es un número válido");
        }
    }
}

Compila y ejecuta:

javac GestorTareas.java
java GestorTareas

Errores comunes al empezar con Java

El nombre del archivo no coincide con el nombre de la clase. En Java, el archivo .java debe llamarse exactamente igual que la clase pública que contiene.

// ❌ El archivo se llama "holaMundo.java" pero la clase es "HolaMundo"
public class HolaMundo { ... }   // error al compilar

// ✅ El archivo debe llamarse "HolaMundo.java"
public class HolaMundo { ... }   // correcto

Olvidar el punto y coma. Cada instrucción en Java termina con ;.

// ❌ Falta el punto y coma
System.out.println("Hola")

// ✅ Correcto
System.out.println("Hola");

Comparar Strings con == en lugar de equals(). En Java, == compara referencias de objeto, no el contenido. Para comparar texto usa siempre equals().

String respuesta = "si";

// ❌ Puede funcionar a veces pero no es fiable
if (respuesta == "si") { ... }

// ✅ Siempre correcto para comparar texto
if (respuesta.equals("si")) { ... }

// Para ignorar mayúsculas/minúsculas
if (respuesta.equalsIgnoreCase("SI")) { ... }

Acceder a un índice fuera del array. Los arrays empiezan en 0 y el último elemento está en la posición length - 1.

String[] nombres = {"Ana", "Carlos", "María"};
System.out.println(nombres[3]);   // ArrayIndexOutOfBoundsException: solo existen 0, 1, 2

// ✅ El último elemento está en length - 1
System.out.println(nombres[nombres.length - 1]);   // "María"

Usar nextInt() o nextDouble() y luego nextLine(). Los métodos de Scanner que no son nextLine() dejan el salto de línea en el buffer. Hay que consumirlo con un nextLine() extra antes de leer texto.

Scanner scanner = new Scanner(System.in);

System.out.print("Edad: ");
int edad = scanner.nextInt();
scanner.nextLine();   // ← consumir el '\n' que quedó en el buffer

System.out.print("Nombre: ");
String nombre = scanner.nextLine();   // sin el nextLine() anterior, esto devolvería ""

Los siguientes pasos

Con lo que has visto en esta guía puedes construir programas de consola funcionales en Java. El siguiente paso natural es aprender la Programación Orientada a Objetos: clases, objetos, constructores, herencia, interfaces y polimorfismo. Java fue diseñado desde el principio para este paradigma y entenderlo bien es fundamental para escribir código Java real.

Después, dependiendo de lo que quieras hacer:

  • Spring Boot si te interesa el desarrollo de APIs REST y aplicaciones web empresariales.
  • Android SDK si quieres desarrollar aplicaciones para dispositivos Android.
  • JUnit para aprender a escribir tests automáticos, una habilidad muy valorada en el mercado.
  • Maven o Gradle para gestionar dependencias y construir proyectos Java de forma profesional.

¿Te ha gustado esta entrada?

Compártela con tus compañeros para que también sigan aprendiendo.

Comunidad y Comentarios

0 COMENTARIOS

No hay comentarios todavía. Sé el primero en compartir tu opinión.

Escribe tu opinión
Respondiendo a