Java
¿Qué es Java?
Qué es Java, por qué todo vive dentro de una clase, y cómo compilar y ejecutar un primer programa.
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í:
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í.
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.
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 quemainseapublicpara 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,staticsiempre 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 esomaintiene que serstatic: cuando el programa arranca, todavía no existe ningún objeto — la JVM necesita poder llamar amainsin 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 amainpero no espera recibir ningún resultado de él, así que tiene sentido que seavoid. -
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[] args—Stringes el tipo de dato que representa texto en Java (se ve más en la próxima página).argses 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í queString[] argses, en criollo, “una lista de textos que me pueden pasar cuando ejecuto el programa”. Por ejemplo, si corres el programa desde la terminal escribiendojava Main hola mundo, esas dos palabras (hola,mundo) le llegarían al programa adentro deargs.
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:
javac Main.java
java Mainjavac Main.javacompila el código fuente y genera un archivoMain.classcon el bytecode.java Mainle pide a la JVM que cargue ese bytecode y ejecute su métodomain. Nótese que aquí no se escribe la extensión.class, solo el nombre de la clase.
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:
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
Este programa lee dos nombres por teclado y saluda a los dos. Ordena las líneas.
- String a = teclado.nextLine();
- public class Main {
- import java.util.Scanner;
- System.out.println("Hola, " + a + " y " + b + "!");
- }
- String b = teclado.nextLine();
- public static void main(String[] args) {
- Scanner teclado = new Scanner(System.in);
- }
Este archivo se llama Main.java, pero no compila. ¿Por qué?
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.