Carregando...

this em Java

Escreva uma classe Tin em Tin.java com um campo int chamado size e um construtor Tin(int size) que faz this.size = size;. Em Lab.java, construa um tin com Tin t = new Tin(7);, depois imprima t.size. Compile ambos os ficheiros e execute java Lab. O ecrã deve mostrar uma linha: 7. O parâmetro e o campo partilham o nome size. A palavra this nomeia o campo no objeto para a guarda chegar ao sítio certo. Usar this quando os nomes colidem é o que esta página ensina.

Porque o mesmo nome precisa de this

Na página dos construtores o parâmetro era n e o campo era size, por isso size = n; era claro. Aqui ambos os nomes são size. Dentro do construtor, um size nu significa o parâmetro. Escrever size = size; copia o parâmetro sobre si mesmo e deixa o campo no valor padrão. O campo no objeto ainda precisa de uma escrita. Essa escrita usa this.size do lado esquerdo.
Crie Tin.java primeiro. A linha public class é public class Tin. Não deixe um nome de classe antigo Box ou Cup aqui. Dentro das chavetas declare int size;. Depois escreva o construtor: Tin(int size) { this.size = size; }. Não há main em Tin.java. Guarde antes de compilar.
Leia a atribuição outra vez. O lado direito size é o valor que chegou no parâmetro — aqui 7. O lado esquerdo this.size é o campo no objeto a ser construído. Depois de a linha correr, o size desse objeto guarda 7. Se você tirar this. e ficar com size = size;, o ecrã mais tarde mostra 0 porque o campo nunca mudou.

Tin with this in constructor

java
public class Tin {
    int size;

    Tin(int size) {
        this.size = size;
    }
}

Lab constrói um tin

Crie Lab.java na mesma pasta. A linha public class é public class Lab. Dentro de main, escreva Tin t = new Tin(7); depois System.out.println(t.size);. O argumento 7 torna-se o parâmetro do construtor size. O construtor guarda-o com this.size = size;. Você não precisa de uma linha separada t.size = 7; nesta página.
Mantenha Lab como a classe que tem main. Não coloque main dentro de Tin nesta lição. Se um ficheiro Hall restante da página dos construtores ainda está na pasta, não execute java Hall nesta lição — execute java Lab depois de compilar Tin.java e Lab.java.

Lab builds one tin

java
public class Lab {
    public static void main(String[] args) {
        Tin t = new Tin(7);
        System.out.println(t.size);
    }
}

Da pasta que guarda ambos os ficheiros, execute javac Tin.java Lab.java. Você pode compilar Tin.java primeiro e Lab.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 Lab — não java Lab.java, e não java Tin. 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: 7. 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 Tin(7) mais a impressão em Lab, com this.size = size; em Tin.
Percorra a execução uma vez. A Java começa em Lab.main. A expressão new Tin(7) constrói um Tin e chama Tin(int size) com o parâmetro igual a 7. O corpo escreve this.size = size, por isso o campo do objeto passa a 7. Depois main imprime t.size e o ecrã mostra 7.
Se você escrever size = size; em vez de this.size = size;, o campo fica em 0 para um int. O ecrã então mostra 0, não 7. Esse é o sinal habitual de que this falta. Ponha this. de novo do lado esquerdo da atribuição.

this.size e size lado a lado

Uma tabela curta mantém os dois nomes claros enquanto você está dentro do construtor.

📊 this.size vs size

Nome O que significa em Tin(int size)
size sozinho o parâmetro que entrou no construtor
this.size o campo no objeto a ser construído
this.size = size; guardar o parâmetro no campo
size = size; não atualiza o campo
A tabela é só um lembrete. A linha tipada que você mantém é this.size = size; dentro do construtor, depois Tin t = new Tin(7); e System.out.println(t.size); em Lab.

Comparado com a página dos construtores

Na página dos construtores, Box(int n) { size = n; } funcionava porque n e size eram palavras diferentes. Essa forma ainda funciona. Esta página usa de propósito a mesma palavra duas vezes para você precisar de this. Um demo restante de Box e Hall com size = n; é outra lição. Para esta página mantenha Tin e Lab e this.size = size;.
Imprimir só t com System.out.println(t); não mostra um 7 limpo. Imprima t.size para ver o número guardado. A referência do objeto sozinha não é o valor do campo.
Você ainda pode escolher um nome de parâmetro diferente noutros dias. Esta lição escolhe nomes iguais de propósito. Não misture n e this no mesmo demo Tin nesta página. Um caminho claro basta: nomes que coincidem, this no campo, impressão do campo.

Dois tins continuam separados

Cada new Tin(...) corre o construtor de novo para um objeto separado. Você pode escrever Tin a = new Tin(2); e Tin b = new Tin(9);, depois imprimir ambos os campos size. Cada chamada usa this.size = size; no seu próprio objeto. Os dois objetos não partilham um único espaço size. Você não precisa de uma segunda caixa de código para essa verificação — mude os números em Lab depois de já ter visto 7, ou mantenha o demo de um tin como o ficheiro que guarda.
Se ambas as linhas mostrarem 0, o construtor ainda está sem this do lado esquerdo. Se javac não encontrar Tin ao compilar Lab.java, verifique que Tin.java está na mesma pasta e que a linha da classe é public class Tin.

O que isto deixa para os métodos de instância

Esta página usa this só dentro do construtor para guardar um campo. Uma página posterior — métodos de instância — mostra métodos que correm num objeto e podem ler ou mudar campos. Fique aqui com a guarda no construtor. Não invente métodos extra em Tin nesta lição a menos que já os conheça; o objetivo da lição é this.size = size quando os nomes coincidem.
Se Lab ainda tem Box b = new Box(4); do demo dos construtores e esta pasta não tem uma classe Box que você queira manter, remova essa linha. Mantenha Tin t = new Tin(7); e System.out.println(t.size);. O compilador não inventa um Box por si quando você ensina Tin.
Quando a pasta ainda guarda Box.java ou Hall.java, deixe-os ou apague-os só se confundirem o seu comando de compilação. Execute java Lab depois de compilar o par Tin e Lab desta lição.

Antes dos métodos de instância

Você pode declarar int size;, escrever Tin(int size) { this.size = size; }, e construir com Tin t = new Tin(7); a partir de Lab. Compile ambos os ficheiros e execute java Lab. O ecrã mostra 7. A palavra this nomeia o campo do objeto quando o parâmetro usa o mesmo nome. Você passou o número no momento da construção, o construtor guardou-o com this, e a impressão provou a guarda. A próxima página é métodos de instância, onde métodos no objeto usam campos depois de o objeto já existir.
Mantenha o cabeçalho do construtor sem void. Mantenha this. no campo. Mantenha a impressão em t.size. Esses três hábitos são o ponto de controlo desta página antes de avançar.

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
6
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 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