Constructores en Java
Escribe una clase Box en Box.java con un campo int llamado size y un constructor Box(int n) que hace size = n;. En Hall.java, construye una caja con Box b = new Box(4); y luego imprime b.size. Compila ambos archivos y ejecuta java Hall. La pantalla debe mostrar una línea: 4. El número que pasas a new llega al constructor, y el constructor lo guarda en el objeto antes de que main continúe. Fijar el campo en el momento de construir — dentro del constructor — es lo que enseña esta página.
Un método que corre cuando new construye
Un constructor tiene el mismo nombre que la clase. No lleva tipo de retorno void ni ningún otro tipo de retorno. Cuando main escribe new Box(4), Java construye el objeto y ejecuta ese constructor con 4 como n. Tras terminar el constructor, la variable guarda el objeto listo. Ese es todo el trabajo de esta página: pasa un valor a new, deja que el constructor lo guarde en el campo y luego imprime el campo para ver que el guardado funcionó.
Crea primero Box.java. La línea public class es public class Box. No dejes un nombre de clase antiguo Cup o Chip aquí. Dentro de las llaves declara int size;. Luego escribe el constructor: Box(int n) { size = n; }. Usa un nombre de parámetro distinto de size en esta página para que la asignación quede clara sin la palabra this. En Box.java no hay main. Guarda antes de compilar.
La línea del campo sola no pone 4 dentro del objeto. El cuerpo del constructor hace ese trabajo cuando new lo llama. Si omites el constructor y solo declaras el campo, un new Box(4) posterior no encajará, y javac se quejará de la llamada. Mantén ambas piezas en Box.java: el campo y el constructor que escribe en él.
public class Box {
int size;
Box(int n) {
size = n;
}
}
Hall pasa 4 a new Box
Crea Hall.java en la misma carpeta. Su línea public class es public class Hall. Dentro de main, escribe Box b = new Box(4); y luego System.out.println(b.size);. El argumento 4 entra en el parámetro del constructor n. No necesitas una línea aparte b.size = 4; en esta página — el constructor ya guardó el valor. La línea de impresión está para que confíes en lo que hizo el constructor sin adivinar.
Mantén Hall como la clase que guarda main. No pongas main dentro de Box en esta lección. La forma de dos archivos coincide con las páginas anteriores de objetos y campos: un archivo define el tipo, el otro construye y lo usa. Si renombras el archivo pero queda una línea antigua public class Shelf, javac rechaza hasta que los nombres coincidan de nuevo.
public class Hall {
public static void main(String[] args) {
Box b = new Box(4);
System.out.println(b.size);
}
}
Desde la carpeta que guarda ambos archivos, ejecuta javac Box.java Hall.java. Puedes compilar primero Box.java y luego Hall.java cuando ambos estén completos. Cuando paréntesis, llaves y puntos y coma coinciden, javac no escribe una línea propia. Luego ejecuta java Hall — no java Hall.java ni java Box. Quita el final .java del comando de ejecución. Arranca la clase que guarda main. Los mismos comandos funcionan en Windows y en macOS.
El programa debe imprimir una línea y parar: 4. No debe pedirte que escribas. Si la terminal espera teclado, aún queda una llamada nextLine de un ejercicio antiguo en un archivo. Bórrala y mantén new Box(4) más la impresión en Hall, con el constructor en Box. Un cursor en espera no es un problema de constructor; es código de entrada sobrante en el lugar equivocado.
Recorre la ejecución una vez. Java empieza en Hall.main. La expresión new Box(4) construye un Box y llama a Box(int n) con n igual a 4. El cuerpo escribe size = n, así que el size de ese objeto pasa a ser 4. Luego main imprime b.size y la pantalla muestra 4. No debe imprimirse nada más. Si ves ok o 3 o un resto de Cup, no estás ejecutando el programa Hall de esta página.
Si escribes new Box() sin argumento mientras el único constructor necesita un int, javac rechaza. Haz coincidir la llamada con la lista de parámetros del constructor. Si añades void delante del nombre del constructor, se convierte en un método ordinario, no en un constructor, y new Box(4) no ejecutará ese cuerpo como espera esta página. La cabecera debe verse como Box(int n), no void Box(int n), ni static int Box(int n).
Comparado con asignar después de new
En la página de campos escribiste c.fill = 3; después de new Cup(). Eso sigue funcionando. Esta página mueve el guardado al constructor para que el valor se fije mientras se construye el objeto. Una demo sobrante de Cup con c.fill = 3; es otra lección. Para esta página mantén Box y Hall y new Box(4). Si Hall aún tiene c.fill = 3; y esta carpeta no tiene clase Cup, quita esa línea. El compilador no inventará un Cup por ti.
Imprimir b solo con System.out.println(b); no muestra un 4 limpio. Imprime b.size para ver el número guardado. La referencia al objeto sola no es el valor del campo. Ya aprendiste ese patrón en la página de campos; mantenlo aquí cuando compruebes el trabajo del constructor.
En otros programas aún puedes asignar un campo después de new. Esta lección simplemente elige la vía del constructor para que el primer valor útil llegue al construir. No mezcles ambos estilos en la misma demo de Hall en esta página. Un camino claro basta: argumento a new, guardado en el constructor, impresión del campo.
Dos cajas, dos sizes
Cada new Box(...) ejecuta el constructor otra vez para un objeto aparte. Puedes escribir Box a = new Box(2); y Box b = new Box(9);, luego imprimir ambos campos size. La primera llamada guarda 2 en un objeto. La segunda guarda 9 en otro objeto. Los dos objetos no comparten un solo hueco size.
public class Hall {
public static void main(String[] args) {
Box a = new Box(2);
Box b = new Box(9);
System.out.println(a.size);
System.out.println(b.size);
}
}
Compila y ejecuta otra vez: javac Box.java Hall.java, luego java Hall. La pantalla debe mostrar 2 en una línea y 9 en la siguiente. Cada llamada al constructor guardó su propio argumento en su propio objeto. Escribir Box b = a; no construye un segundo objeto — usa dos llamadas new Box(...) cuando quieras dos sizes. Copiar una referencia no es lo mismo que llamar al constructor dos veces.
Si ambas líneas muestran el mismo número, comprueba que cada new pasa un argumento distinto y que imprimes a.size y b.size en ese orden. Si javac se detiene en el segundo new, busca un paréntesis faltante o un nombre de clase incorrecto de un archivo antiguo. Los errores tipográficos pequeños en la segunda llamada son comunes cuando pegas la primera línea y olvidas cambiar el argumento.
Lo que queda para this
Esta página usa size = n; con nombres distintos. Una página posterior — this — muestra cómo hablar del campo propio del objeto cuando los nombres chocan. Quédate aquí con el nombre claro de parámetro n. No inventes this.size en esta página a menos que ya lo conozcas; el objetivo de la lección es la llamada al constructor desde new. La palabra this es el tema siguiente, no un requisito para guardar n en size hoy.
Si javac no encuentra Box al compilar Hall.java, comprueba que Box.java esté en la misma carpeta y que la línea de clase sea public class Box. Si la pantalla muestra 0, puede faltar la asignación en el constructor, o main aún usa una forma sin argumento que nunca fija size — mantén Box(int n) { size = n; } y new Box(4). Un cero en pantalla suele significar que el campo se quedó en el valor por defecto porque el guardado nunca corrió.
Cuando la carpeta aún tiene Cup.java o Shelf.java de la página de campos, déjalos o bórralos solo si confunden el comando de compilación. No compiles un Shelf antiguo que aún asigna c.fill y esperes la pantalla de esta página. Ejecuta java Hall después de compilar el par Box y Hall de esta lección.
Antes de this
Puedes declarar int size;, escribir Box(int n) { size = n; } y construir con Box b = new Box(4); desde Hall. Compila ambos archivos y ejecuta java Hall. La pantalla muestra 4. El constructor corre cuando new construye el objeto. Pasaste el número al construir, el constructor lo guardó en el campo y la impresión demostró el guardado. La página siguiente es this, donde aprendes otra forma de nombrar los campos propios del objeto dentro de sus métodos y constructores.
Mantén la cabecera del constructor sin void. Mantén el argumento en new. Mantén la impresión en b.size. Esas tres costumbres son el punto de control de esta página antes de seguir.
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior