Article image
Iasmin Santiago
Iasmin Santiago24/10/2025 19:52
Compartilhe

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:

  1. Reserva espaço na heap para o objeto.
  2. Chama o construtor para inicializar os atributos.
  3. 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

Compartilhe
Comentários (0)