← Voltar ao arquivo

Java Fundamentos: princípios da orientação a objetos

Explicação prática dos principais conceitos da POO, como abstração, encapsulamento, herança, polimorfismo, associação, composição e modularização.

A orientação a objetos fica mais clara quando entendemos seus conceitos na prática, e não apenas como definições soltas.

Orientação a objetos na prática

Orientação a objetos não é apenas teoria.

Ela é um paradigma que pode ser aplicado na prática por meio de linguagens como Java, C#, Python, Kotlin e outras.

A Programação Orientada a Objetos, também conhecida como POO, trabalha com alguns conceitos fundamentais, como:

  • abstração;
  • encapsulamento;
  • herança;
  • polimorfismo.

Além desses pilares clássicos, existem outros conceitos importantes para organizar melhor um sistema, como:

  • modularização;
  • hierarquia;
  • associação;
  • composição.

Abstração

Abstração é a capacidade de observar uma entidade do mundo real, identificar suas características e comportamentos importantes e representá-los dentro de um sistema.

Na abstração, não trazemos tudo do mundo real para o código.

Trazemos apenas o que é necessário para resolver o problema.

Imagine um sistema de cadastro de veículos.

Nesse caso, pode fazer sentido representar informações como:

  • quantidade de portas;
  • motorização;
  • modelo;
  • marca;
  • ano.

Essas informações são extraídas do mundo real e representadas no sistema.

Outro exemplo seria um sistema de faculdade.

Para representar um aluno, talvez sejam necessárias informações como:

  • nome;
  • matrícula;
  • curso;
  • turma;
  • disciplinas.

A abstração consiste em escolher o que realmente importa para aquele sistema.

Encapsulamento

Encapsulamento é o princípio de proteger os dados e comportamentos internos de um objeto, permitindo acesso e alteração apenas de forma controlada.

Como a própria palavra sugere, encapsular é proteger algo dentro de uma estrutura.

Um exemplo simples é um liquidificador.

O liquidificador possui motor, fios e mecanismos internos. Porém, para usá-lo, a pessoa não precisa abrir o aparelho nem entender todos os detalhes internos.

Ela interage apenas com os botões disponíveis, como:

  • ligar;
  • desligar;
  • velocidade 1;
  • velocidade 2;
  • pulsar.

Na orientação a objetos, acontece algo parecido.

O objeto protege seus detalhes internos e expõe apenas os métodos necessários para que outras partes do sistema possam interagir com ele.

Em Java, isso normalmente é feito com modificadores de acesso, como private, public e protected.

Herança e hierarquia

Hierarquia é a organização entre classes que possuem algum tipo de relação entre si.

Uma das formas mais conhecidas de hierarquia na POO é a herança.

Herança acontece quando uma classe herda características e comportamentos de outra classe.

Para avaliar se a relação deve ser herança, uma pergunta ajuda bastante:

Um aluno é uma pessoa ou um aluno tem uma pessoa?

Nesse caso, faz sentido dizer que um aluno é uma pessoa.

Então uma classe Aluno pode herdar características de uma classe Pessoa.

Por exemplo, uma pessoa pode ter:

  • nome;
  • CPF;
  • data de nascimento.

Como um aluno também é uma pessoa, ele pode reutilizar essas características.

Além disso, Aluno pode ter informações próprias, como:

  • matrícula;
  • curso;
  • turma.

Essa é uma relação do tipo “é um”.

Ou seja:

Aluno é uma Pessoa.

Associação

Nem toda relação entre classes deve ser feita com herança.

Às vezes, uma classe apenas usa ou possui referência a outra.

Outra pergunta ajuda a diferenciar:

O aluno é uma disciplina ou o aluno tem uma disciplina?

Um aluno não é uma disciplina.

Um aluno tem uma disciplina, ou várias disciplinas.

Logo, isso não é herança.

Nesse caso, a classe Aluno pode ter uma referência para Disciplina.

Essa relação é chamada de associação.

Ou seja:

Aluno tem uma Disciplina.

Em um cenário mais realista:

Aluno tem várias Disciplinas.

Composição

Composição é uma forma mais forte de associação.

Ela acontece quando uma classe é formada por outra e essa parte normalmente pertence ao objeto principal naquele contexto.

Um exemplo simples é um Pedido com seus ItemPedido.

Um pedido pode ter vários itens.

Esses itens fazem sentido dentro daquele pedido, porque representam os produtos escolhidos, quantidades e valores naquele momento da compra.

A relação não é:

Pedido é um ItemPedido.

A relação correta é:

Pedido tem itens de pedido.

A composição ajuda a representar objetos formados por partes internas.

Polimorfismo

Polimorfismo é a capacidade de objetos diferentes responderem à mesma ação de formas diferentes.

Imagine uma classe Animal com um método emitirSom().

Uma classe Cachorro pode implementar esse método emitindo um latido.

Uma classe Gato pode implementar o mesmo método emitindo um miado.

A ação é a mesma:

emitirSom()

Mas o comportamento muda conforme o objeto.

Isso permite escrever código mais flexível, porque diferentes objetos podem seguir a mesma ideia geral, mas executar comportamentos específicos.

Modularização

Modularização é a ideia de dividir um sistema grande em partes menores, mais organizadas e mais fáceis de manter.

Na Programação Orientada a Objetos, essa divisão acontece principalmente por meio de classes.

Cada classe deve representar uma responsabilidade, entidade ou conceito importante do sistema.

Em um sistema de faculdade, por exemplo, poderíamos ter classes como:

  • Aluno;
  • Professor;
  • Disciplina;
  • Curso;
  • Turma.

Cada uma dessas classes representa uma parte do sistema.

Isso deixa o código mais organizado, facilita a manutenção e melhora o reaproveitamento.

Resumo

A Orientação a Objetos permite representar problemas do mundo real dentro do código usando objetos, classes e relações entre entidades.

Os pilares mais conhecidos da POO são:

  • abstração;
  • encapsulamento;
  • herança;
  • polimorfismo.

Além deles, conceitos como modularização, hierarquia, associação e composição ajudam a estruturar melhor o sistema.

A ideia principal é criar código mais organizado, reutilizável, protegido e fácil de manter.

Diagrama ampliado
100%