</>waridocu

Java

¿Qué es Java?

Qué es Java, por qué todo vive dentro de una clase, y cómo compilar y ejecutar un primer programa.

javaintroduccionjvm

Un problema chiquito para empezar

Quieres escribir un programa que salude a quien lo ejecuta. En Python son dos líneas. En Java, el mismo programa se ve así:

Ejemplo: hola mundo en Javajava
public class Main {
    public static void main(String[] args) {
        System.out.println("Hola, mundo");
    }
}

Cinco líneas para imprimir un texto. Antes de mirar cada palabra por separado, vale la pena entender por qué Java pide esta ceremonia — el resto de la página se explica solo una vez que se entiende eso.

Por qué existe esa ceremonia: la JVM

Java es un lenguaje compilado, de tipado estático y orientado a objetos. La diferencia clave con C++ o Python está en qué produce el compilador: en vez de traducir directamente a instrucciones del procesador, el compilador de Java (javac) genera un código intermedio llamado bytecode, que corre sobre una máquina virtual: la JVM (Java Virtual Machine). Esa capa intermedia es la razón del lema histórico de Java: “write once, run anywhere” — el mismo bytecode funciona sin cambios en Windows, Linux o macOS, siempre que exista una JVM instalada ahí.

Nota

Si vienes de C++, el paralelo más cercano es este: donde C++ compila directo a binario nativo de una plataforma, Java compila a un binario intermedio (bytecode) que la JVM traduce a código nativo en tiempo de ejecución. Eso cuesta algo de rendimiento, pero a cambio gana portabilidad.

Parte de esa ceremonia —la clase, el main con esa firma exacta— es precisamente lo que la JVM necesita para saber por dónde arrancar. No es capricho del lenguaje: es el precio de la portabilidad.

Todo vive dentro de una clase

A diferencia de C++ o Python, en Java no existen funciones sueltas a nivel de archivo. Toda pieza de código — incluido el punto de entrada del programa — debe estar dentro de una clase. Es consecuencia directa de que Java es un lenguaje orientado a objetos “hasta el final”: no hay una zona de código fuera de ese modelo.

Nota

Un programa de consola como el de arriba no es el escenario donde más se escribe Java hoy en día. Java se usa sobre todo dentro de frameworks (Spring para backends web, Android para apps móviles, servicios empresariales), y ahí gran parte de esta ceremonia (public class, main, etc.) la resuelve el framework por ti — el código de negocio que terminas escribiendo suele ser bastante más corto que estos ejemplos sueltos. Aquí se usa consola porque no necesita instalar nada más que el JDK para probarlo.

Por qué main se ve tan “cargado”

La firma public static void main(String[] args) es fija: la JVM busca exactamente ese método para arrancar el programa. Java toma sus palabras clave del inglés, así que antes de explicar qué hace cada una en este contexto, vale traducirlas literalmente — esa traducción casi siempre da una pista real de su función.

  • public — esto literalmente se traduce como “público”. En este contexto significa que el método puede ser visto y llamado desde fuera de la clase donde vive, no solo desde adentro. Es como la puerta de entrada de un edificio: si es “pública”, cualquiera de afuera puede usarla para entrar; si fuera “privada” (lo opuesto, y lo vas a ver más adelante en la sección de clases), solo la gente de adentro podría usarla. La JVM está “afuera” del programa en cierto sentido, así que necesita que main sea public para poder llamarlo.

  • static — esto se traduce como “estático”, que en español cotidiano significa “fijo, que no se mueve, que se mantiene igual”. En este contexto quiere decir que el método le pertenece a la clase entera, no a cada objeto que se cree a partir de ella — no importa cuántos objetos crees, static siempre va a ser el mismo, uno solo, compartido. Es como el reloj de una plaza: no le pertenece a una persona en particular que pasa por ahí, le pertenece a la plaza en sí, y es el mismo reloj para todo el que lo mire. Por eso main tiene que ser static: cuando el programa arranca, todavía no existe ningún objeto — la JVM necesita poder llamar a main sin tener que crear nada antes.

  • void — esto se traduce como “vacío”. Significa que el método no devuelve ningún valor cuando termina: hace su trabajo (en este caso, imprimir algo en pantalla) pero no “entrega” nada de vuelta a quien lo llamó. La JVM llama a main pero no espera recibir ningún resultado de él, así que tiene sentido que sea void.

  • main — esto se traduce literalmente como “principal”. Es, ni más ni menos, el nombre exacto que la JVM busca como punto de partida del programa — el “principal” entre todos los métodos posibles.

  • String[] argsString es el tipo de dato que representa texto en Java (se ve más en la próxima página). args es una abreviación de la palabra en inglés arguments (“argumentos”). Los corchetes [] significan “una lista de” (un array, que se ve más adelante en esta sección) — así que String[] args es, en criollo, “una lista de textos que me pueden pasar cuando ejecuto el programa”. Por ejemplo, si corres el programa desde la terminal escribiendo java Main hola mundo, esas dos palabras (hola, mundo) le llegarían al programa adentro de args.

Importante

El nombre del archivo .java debe coincidir exactamente con el nombre de la clase pública que contiene (incluyendo mayúsculas y minúsculas). Si la clase se llama Main, el archivo debe llamarse Main.java. Si no coinciden, el compilador da error.

Cómo se compila y ejecuta

Java separa la compilación de la ejecución en dos comandos distintos:

bashbash
javac Main.java
java Main
  • javac Main.java compila el código fuente y genera un archivo Main.class con el bytecode.
  • java Main le pide a la JVM que cargue ese bytecode y ejecute su método main. Nótese que aquí no se escribe la extensión .class, solo el nombre de la clase.
Tip

Si ves el error Error: Could not find or load main class, casi siempre es porque el nombre de archivo, el nombre de la clase o el comando java (con extensión de más) no coinciden entre sí.

Un segundo ejemplo: variable y entrada por teclado

Con una variable y la clase Scanner para leer texto que escribe el usuario:

Ejemplo: leer un nombre y saludarjava
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        System.out.print("¿Cómo te llamas? ");
        String nombre = teclado.nextLine();
        System.out.println("Hola, " + nombre + "!");
    }
}

Scanner no es parte del lenguaje en sí, sino de la biblioteca estándar de Java: por eso hace falta importarla con import java.util.Scanner; antes de poder usarla.

Pon a prueba

🧩 Ordena el código

Este programa lee dos nombres por teclado y saluda a los dos. Ordena las líneas.

  1. String a = teclado.nextLine();
  2. public class Main {
  3. import java.util.Scanner;
  4. System.out.println("Hola, " + a + " y " + b + "!");
  5. }
  6. String b = teclado.nextLine();
  7. public static void main(String[] args) {
  8. Scanner teclado = new Scanner(System.in);
  9. }

💡 Encuentra el error

Este archivo se llama Main.java, pero no compila. ¿Por qué?

javajava
public class Saludo {
    public static void main(String[] args) {
        System.out.println("Hola");
    }
}

El nombre del archivo (Main.java) no coincide con el nombre de la clase pública (Saludo). Java exige que sean idénticos, mayúsculas incluidas. La solución es renombrar el archivo a Saludo.java, o renombrar la clase a Main.

Siguiente paso

Esto es solo la puerta de entrada. Los siguientes temas naturales son los tipos de datos básicos, las estructuras de control (if, for, while) y cómo definir clases propias más allá de main.