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:
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:
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:
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;
}
}
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:
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:
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.