Objetos, Construtores e Memória em Java - Entenda de Verdade Como Tudo se Conecta!
- #Java
- #POO
Ao compreender como o Java cria e gerencia objetos na memória, você começa a ver o código de um jeito mais lógico e deixa de decorar sintaxe para entender de fato o que está acontecendo.
Olá! Sou Iasmin e quero compartilhar meu aprendizado sobre 3 pilares fundamentais da Programação Orientada a Objetos em Java contigo: objetos, construtores e memória. Esses conceitos, quando bem entendidos, transformam a forma como você escreve seu código, resolve desafios e até se sente mais confiante como programador...
🌱 Programar em Java vai além da sintaxe: é compreender como a JVM cria, armazena e manipula objetos, e saber relacionar todos os conceitos na prática!
Vou te ajudar a entender melhor tudo isso, vem comigo!
O que acontece por trás de cada linha de código?
1. Classes e Objetos: O Molde e a Instância
Uma classe é o molde: define quais atributos e comportamentos os objetos terão.
Um objeto é a instância real dessa classe, criada na memória (heap). Não se preocupe, veremos isso melhor logo, logo.
Exemplo:
public class Pessoa {
private String nome;
private int idade;
}
Até aqui, nada ocupa espaço na memória. A memória só é alocada quando criamos um objeto com new:
Pessoa fulano = new Pessoa();
💡 Entendendo variável, objeto e memória
No início, eu me confundia com isso:
Pessoa fulano = new Pessoa();
O que cada palavra desempenha? Aqui está o que realmente acontece:
- Pessoa → é o tipo da variável. Isso mesmo: Pessoa é uma classe. Assim como int, boolean e String, é um tipo de dado, porém nós criamos esse tipo/classe!
- fulano → é a variável que guarda a referência ao objeto. Atenção: Ela não guarda o valor, guarda a referêcnia! E o que guarda o valor?...
- new Pessoa() → cria o objeto na memória (heap). Agora sim, o valor foi guardado na memória!
Ou seja, fulanoé, ou a variável, é somente a ponte entre o código e o objeto que vive na memória.
O fulano guarda a referência (endereço de memória) do objeto na heap, enquanto ela mesma (a variável) vive na stack.
2. Construtores: Criando e Inicializando Objetos
O construtor é um método especial chamado automaticamente quando o objeto é criado.
Ele inicializa os atributos e garante que o objeto já comece com valores definidos.
public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}
Percebe que há duas palavras "nome" ? Elas não são o mesmo!
Por isso, mesmo, precisamos de uma outra palavra reservada para resolver essa confusão: o this!
Enquanto o nome emString nome é um parâmetro recebido, algo novo, nome em this.nome se refere ao atributo criado lá no início do código, logo após criarmos a classe com public class Pessoa{} :
public class Pessoa {
// Estes são os atributos da classe
private String nome;
private int idade;
// Construtor com parâmetros
public Pessoa(String nome, int idade) {
// Aqui, 'this.nome' se refere ao atributo declarado acima
// Já 'nome' (sem o this) é o parâmetro recebido pelo construtor
this.nome = nome;
this.idade = idade;
}
}
🔹 O this.nome se refere ao atributo do objeto, enquanto nome (sem this) é o parâmetro recebido.
Quando fazemos:
Pessoa p1 = new Pessoa("Iasmin", 25);
a JVM:
- Reserva espaço na heap para o objeto.
- Chama o construtor para inicializar os atributos.
- Armazena o endereço do objeto em
p1(na stack).
Agora que o objeto existe na memória, é o construtor quem garante que ele comece sua ‘vida’ com dados válidos.
3. Valores Padrão e Construtor Vazio
Se você não criar um construtor, o Java fornece automaticamente um construtor padrão:
public Pessoa() { }
Nesse caso, os atributos recebem valores padrão:
🔹int: 0
🔹double: 0.0
🔹boolean: false
🔹String ou objetos: null
Assim, podemos criar o objeto primeiro e preencher depois:
Pessoa p2 = new Pessoa();
p2.setNome("Aurora");
p2.setIdade(22);
4. Encapsulamento: Protegendo os Dados
Usamos private para proteger os atributos e getters/setters públicos para acessá-los ou alterá-los de forma segura...
Quando queremos que nossos atributos não sejam acessados nem alterados fora da classe Pessoa, há 2 métodos que implantamos dentro dessa classe: getter e setter.
Quando os chamarmos na main, arquivo que contém o código executável, poderemos obter valores com get e alterar valores com set.
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
- Getter: retorna o valor do atributo. Na prática, conseguimos fazer isso ao usar getNome() na main.
- Setter: altera o valor, com controle e segurança. Já aqui, na prática, conseguiremos alterar o valor usando setNome() na main.
Esse padrão é chamado encapsulamento: ele impede acesso direto e garante consistência dos dados.
5. Exibindo Objetos: o Método toString()
Lembra que vimos um exemplo de criaão do objeto p1 mais acima, no ítem 3?
Quando imprimimos:
System.out.println(p1);
Java mostra algo como:
Pessoa@5e2de80c
Isso é o endereço de memória do objeto. Como mencionei anteriormente... a variável mostrou a referência do objeto lá na memória! Agora você deve ter pensado: E como verei o valor de um atributo, então? Se não for pelo método get... para exibí-lo de forma legível, sobrescrevemos o método toString():
@Override
public String toString() {
return "Pessoa [nome=" + nome + ", idade=" + idade + "]";
}
Agora:
System.out.println(p1);
mostra:
Pessoa [nome=Aurora, idade=22]
6. Construtor vs Setters: Quando Usar Cada Um
Construtor com parâmetros: Cria e inicializa o objeto de uma vez, quando já se sabe os valores iniciais.;
Construtor padrão + setters: Cria o objeto vazio e depois define valores, quando os valores dependem de entrada do usuário ou processamento posterior.
Ambas são válidas, mas o construtor com parâmetros tende a ser mais direto e elegante.
7. Resumo Final
- Classe: molde que define os atributos e comportamentos.
- Objeto: instância real criada na memória. Lembre-se, ele guarda uma referência!
- Construtor: inicializa o objeto no momento da criação.
- Valores padrão: usados se não houver inicialização/construtor com parâmetros.
- Getters/Setters: garantem acesso controlado aos dados.
- this: diferencia atributo e parâmetro.
- toString(): define como o objeto será exibido.
Viu só como, cada vez mais, a estrutura do Java vai fazendo sentido e sendo mais instigante? Compreender essa sequência ajuda a programar de forma mais consciente, evitar erros e escrever códigos Java mais limpos e sólidos.
Te indico, também, outro artigo meu sobre Java e Poo! Traz uma reflexão melhor da nossa jornada como programador, e você de quebra solidifica os conceitos aprendidos aqui!
Fundamentos de Java e Programação Orientada a Objetos: como aprendi a entender o código de verdade
Link: https://web.dio.me/articles/fundamentos-de-java-e-programacao-orientada-a-objetos-como-aprendi-a-entender-o-codigo-de-verdade-030636261515?back=/articles



