Construtores em Java
Escreva uma classe Box em Box.java com um campo int chamado size e um construtor Box(int n) que faz size = n;. Em Hall.java, construa um box com Box b = new Box(4);, depois imprima b.size. Compile ambos os ficheiros e execute java Hall. O ecrã deve mostrar uma linha: 4. O número que você passa a new chega ao construtor, e o construtor guarda-o no objeto antes de main continuar. Definir o campo no momento da construção — dentro do construtor — é o que esta página ensina.
Um método que corre quando new constrói
Um construtor tem o mesmo nome da classe. Não tem tipo de retorno void nem outro tipo de retorno. Quando main escreve new Box(4), a Java constrói o objeto e corre esse construtor com 4 como n. Depois de o construtor terminar, a variável guarda o objeto pronto. Esse é o trabalho inteiro desta página: passar um valor a new, deixar o construtor guardá-lo no campo, depois imprimir o campo para ver que a guarda funcionou.
Crie Box.java primeiro. A linha public class é public class Box. Não deixe um nome de classe antigo Cup ou Chip aqui. Dentro das chavetas declare int size;. Depois escreva o construtor: Box(int n) { size = n; }. Nesta página use um nome de parâmetro diferente de size para a atribuição ficar clara sem a palavra this. Não há main em Box.java. Guarde antes de compilar.
A linha do campo sozinha não coloca 4 no objeto. O corpo do construtor faz esse trabalho quando new o chama. Se você saltar o construtor e só declarar o campo, um new Box(4) mais tarde não corresponde, e javac queixa-se da chamada. Mantenha as duas peças em Box.java: o campo e o construtor que escreve nele.
public class Box {
int size;
Box(int n) {
size = n;
}
}
Hall passa 4 para new Box
Crie Hall.java na mesma pasta. A linha public class é public class Hall. Dentro de main, escreva Box b = new Box(4); depois System.out.println(b.size);. O argumento 4 entra no parâmetro do construtor n. Você não precisa de uma linha separada b.size = 4; nesta página — o construtor já guardou o valor. A linha de impressão está aí para você confiar no que o construtor fez sem adivinhar.
Mantenha Hall como a classe que tem main. Não coloque main dentro de Box nesta lição. A forma de dois ficheiros corresponde às páginas anteriores de objetos e campos: um ficheiro define o tipo, o outro constrói e usa. Se você renomear o ficheiro mas deixar uma linha antiga public class Shelf, javac recusa até os nomes voltarem a coincidir.
public class Hall {
public static void main(String[] args) {
Box b = new Box(4);
System.out.println(b.size);
}
}
Da pasta que guarda ambos os ficheiros, execute javac Box.java Hall.java. Você pode compilar Box.java primeiro e Hall.java em seguida quando ambos estiverem completos. Quando parênteses, chavetas e ponto e vírgula coincidem, javac não escreve linha própria. Depois execute java Hall — não java Hall.java, e não java Box. Tire o final .java do comando de execução. Arranque a classe que tem main. Os mesmos comandos funcionam no Windows e no macOS.
O programa deve imprimir uma linha e parar: 4. Não deve pedir que você digite. Se o terminal esperar entrada do teclado, uma chamada nextLine de um exercício antigo ainda está num ficheiro. Apague essa chamada e mantenha new Box(4) mais a impressão em Hall, com o construtor em Box. Um cursor à espera não é problema de construtor; é código de entrada antigo no sítio errado.
Percorra a execução uma vez. A Java começa em Hall.main. A expressão new Box(4) constrói um Box e chama Box(int n) com n igual a 4. O corpo escreve size = n, por isso o size desse objeto passa a 4. Depois main imprime b.size e o ecrã mostra 4. Nada mais deve imprimir. Se você vir ok ou 3 ou resto de Cup, não está a executar o programa Hall desta página.
Se você escrever new Box() sem argumento enquanto o único construtor precisa de um int, javac recusa. Faça a chamada coincidir com a lista de parâmetros do construtor. Se você acrescentar void antes do nome do construtor, torna-se um método comum, não um construtor, e new Box(4) não corre esse corpo como esta página espera. O cabeçalho deve parecer Box(int n), não void Box(int n), e não static int Box(int n).
Comparado com atribuir depois de new
Na página de campos você escrevia c.fill = 3; depois de new Cup(). Isso ainda funciona. Esta página move a guarda para dentro do construtor para o valor ficar definido enquanto o objeto é construído. Um demo Cup restante com c.fill = 3; é outra lição. Para esta página mantenha Box e Hall e new Box(4). Se Hall ainda tem c.fill = 3; e esta pasta não tem classe Cup, remova essa linha. O compilador não inventa um Cup por si.
Imprimir só b com System.out.println(b); não mostra um 4 limpo. Imprima b.size para ver o número guardado. A referência do objeto sozinha não é o valor do campo. Você já aprendeu esse padrão na página de campos; mantenha-o aqui quando verificar o trabalho do construtor.
Você ainda pode atribuir um campo depois de new noutros programas. Esta lição simplesmente escolhe o caminho do construtor para o primeiro valor útil chegar no momento da construção. Não misture ambos os estilos no mesmo demo Hall nesta página. Um caminho claro basta: argumento a new, guarda no construtor, impressão do campo.
Dois boxes, dois sizes
Cada new Box(...) corre o construtor de novo para um objeto separado. Você pode escrever Box a = new Box(2); e Box b = new Box(9);, depois imprimir ambos os campos size. A primeira chamada guarda 2 num objeto. A segunda chamada guarda 9 noutro objeto. Os dois objetos não partilham um único espaço 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);
}
}
Compile e execute de novo: javac Box.java Hall.java, depois java Hall. O ecrã deve mostrar 2 numa linha e 9 na seguinte. Cada chamada de construtor guardou o seu próprio argumento no seu próprio objeto. Escrever Box b = a; não constrói um segundo objeto — use duas chamadas new Box(...) quando quiser dois sizes. Copiar uma referência não é o mesmo que chamar o construtor duas vezes.
Se ambas as linhas mostrarem o mesmo número, verifique que cada new passa um argumento diferente e que você imprime a.size e b.size nessa ordem. Se javac parar no segundo new, procure um parêntese em falta ou um nome de classe errado deixado dum ficheiro antigo. Pequenos erros tipográficos na segunda chamada são comuns quando você cola a primeira linha e se esquece de mudar o argumento.
O que isto deixa para this
Esta página usa size = n; com nomes diferentes. Uma página posterior — this — mostra como falar do campo do próprio objeto quando os nomes colidem. Fique aqui com o nome de parâmetro claro n. Não invente this.size nesta página a menos que já o conheça; o objetivo da lição é a chamada do construtor a partir de new. A palavra this é o próximo tópico, não um requisito para guardar n em size hoje.
Se javac não encontrar Box ao compilar Hall.java, verifique que Box.java está na mesma pasta e que a linha da classe é public class Box. Se o ecrã mostrar 0, o construtor pode estar sem a atribuição, ou main ainda usa uma forma sem argumentos que nunca define size — mantenha Box(int n) { size = n; } e new Box(4). Um zero no ecrã costuma significar que o campo ficou no valor padrão porque a guarda nunca correu.
Quando a pasta ainda guarda Cup.java ou Shelf.java da página de campos, deixe-os ou apague-os só se confundirem o seu comando de compilação. Não compile um Shelf antigo que ainda atribui c.fill e espere o ecrã desta página. Execute java Hall depois de compilar o par Box e Hall desta lição.
Antes de this
Você pode declarar int size;, escrever Box(int n) { size = n; }, e construir com Box b = new Box(4); a partir de Hall. Compile ambos os ficheiros e execute java Hall. O ecrã mostra 4. O construtor corre quando new constrói o objeto. Você passou o número no momento da construção, o construtor guardou-o no campo, e a impressão provou a guarda. A próxima página é this, onde você aprende outra forma de nomear os campos do próprio objeto dentro dos seus métodos e construtores.
Mantenha o cabeçalho do construtor sem void. Mantenha o argumento em new. Mantenha a impressão em b.size. Esses três hábitos são o ponto de controlo desta página antes de avançar.
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo