Back-end

Tipos de Relações entre Objetos em Java

No desenvolvimento orientado a objetos, a relação entre classes e objetos é essencial para a estruturação de um sistema bem projetado. Em Java, essas relações podem ser...

Pedro Mendes
Pedro Mendes
18 de fevereiro de 2025 3 min de leitura
Tipos de Relações entre Objetos em Java

No desenvolvimento orientado a objetos, a relação entre classes e objetos é essencial para a estruturação de um sistema bem projetado. Em Java, essas relações podem ser classificadas de diferentes formas, cada uma representando um tipo específico de dependência ou associação entre objetos.

1 - Associação

A associação é a relação mais genérica entre objetos, onde um objeto pode interagir com outro. Ela pode ser unidirecional ou bidirecional, dependendo da forma como a comunicação entre os objetos ocorre.

Por exemplo:

Java

class Pessoa {
    private String nome;
    private Endereco endereco;
    public Pessoa(String nome, Endereco endereco) {
        this.nome = nome;
        this.endereco = endereco;
    }
}
class Endereco {
    private String rua;
    public Endereco(String rua) {
        this.rua = rua;
    }
}

Copiar class Pessoa { private String nome; private Endereco endereco; public Pessoa(String nome, Endereco endereco) { this.nome = nome; this.endereco = endereco; } } class Endereco { private String rua; public Endereco(String rua) { this.rua = rua; } }

Neste exemplo, a classe Pessoa tem uma associação com a classe Endereco.

2 - Composição

A composição é um tipo de associação mais forte, onde um objeto contém outro objeto e a existência do objeto contido depende do objeto principal.

Por exemplo:

Java

class Carro {
    private Motor motor;
    public Carro() {
        this.motor = new Motor(); // O motor só existe dentro do carro
    }
}
class Motor {
    // Detalhes do motor
}

Copiar class Carro { private Motor motor; public Carro() { this.motor = new Motor(); // O motor só existe dentro do carro } } class Motor { // Detalhes do motor }

Aqui, o Motor faz parte de um Carro, e sua existência depende do carro.

3 - Agregação

A agregação é similar à composição, mas com uma diferença importante: o objeto agregado pode existir independentemente do objeto principal.

Por exemplo:

Java

class Universidade {
    private List<Professor> professores;
    public Universidade() {
        this.professores = new ArrayList<>();
    }
    public void adicionarProfessor(Professor professor) {
        professores.add(professor);
    }
}
class Professor {
    private String nome;
    public Professor(String nome) {
        this.nome = nome;
    }
}

Copiar class Universidade { private List professores; public Universidade() { this.professores = new ArrayList<>(); } public void adicionarProfessor(Professor professor) { professores.add(professor); } } class Professor { private String nome; public Professor(String nome) { this.nome = nome; } }

4 - Herança

A herança é um dos conceitos fundamentais da POO, onde uma classe filha herda atributos e métodos de uma classe pai.

Por exemplo:

Java

class Animal {
    public void fazerSom() {
        System.out.println("Som genérico de animal");
    }
}
class Cachorro extends Animal {
    @Override
    public void fazerSom() {
        System.out.println("Latido");
    }
}

Copiar class Animal { public void fazerSom() { System.out.println(“Som genérico de animal”); } } class Cachorro extends Animal { @Override public void fazerSom() { System.out.println(“Latido”); } }

Aqui, Cachorro herda de Animal e sobrescreve o método fazerSom().

5 - Dependência (Usabilidade)

Quando uma classe usa outra temporariamente, sem manter referências permanentes, temos uma relação de dependência.

Por exemplo:

Java

class Pedido {
    public void processar(Pagamento pagamento) {
        pagamento.realizarPagamento();
    }
}
class Pagamento {
    public void realizarPagamento() {
        System.out.println("Pagamento realizado");
    }
}

Copiar class Pedido { public void processar(Pagamento pagamento) { pagamento.realizarPagamento(); } } class Pagamento { public void realizarPagamento() { System.out.println(“Pagamento realizado”); } }

Aqui, Pedido depende de Pagamento, mas não o armazena como atributo.

Compreender essas relações é essencial para criar sistemas bem estruturados em Java. Cada tipo de relação tem seu próprio uso e impacto na manutenção do código.

Pedro Mendes

Sobre Pedro Mendes

Desenvolvedor full stack com foco em aplicações web, automação e entrega confiável de software.

Ver mais artigos