Victor Jesus
Victor Jesus25/05/2025 17:23
Compartilhe

Entendendo os 4 Pilares da Programação Orientada a Objetos

    A Programação Orientada a Objetos (POO) é um paradigma utilizado por muitas linguagens modernas como Java, C#, Python e C++. Para desenvolver com clareza e eficiência nesses ambientes, é fundamental dominar seus quatro pilares: encapsulamento, herança, polimorfismo e abstração.

    Encapsulamento

    O encapsulamento é o princípio de ocultar os dados internos de uma classe e permitir o acesso a eles somente por meio de métodos públicos. Ele ajuda a proteger os atributos de alterações indevidas e mantém o controle sobre como eles são manipulados.

    Exemplo:

    public class ContaBancaria {
      private double saldo;
    
    
      public void depositar(double valor) {
          if (valor > 0) saldo += valor;
      }
    
    
      public void sacar(double valor) {
          if (valor > 0 && valor <= saldo) saldo -= valor;
      }
    
    
      public double getSaldo() {
          return saldo;
      }
    }
    

    Neste exemplo, o atributo saldo não pode ser acessado diretamente. As únicas formas de alterá-lo são através dos métodos depositar e sacar.

    Herança

    Herança é o mecanismo que permite a uma classe herdar atributos e métodos de outra. Isso evita duplicação de código e facilita a reutilização.

    Exemplo:

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

    A classe cachorro herda o método emitirSom() de Animal, mas sobrescreve com um comportamento específico.

    Polimorfismo

    Polimorfismo é a capacidade que métodos têm de se comportar de maneiras diferentes dependendo do contexto ou dos parâmetros recebidos. Ele pode ser dividido em dois conceitos principais:

    Sobrescrita de métodos (Override)

    A sobrescrita ocorre quando uma subclasse redefine um método herdado da superclasse para alterar ou especializar seu comportamento.

    • A anotação @override indica que um método está sobrescrevendo um método da classe pai.
    • Isso ajuda o compilador a verificar se realmente existe um método com a mesma assinatura na superclasse, evitando erros.

    Exemplo de sobrescrita:

    class Animal {
      void emitirSom() {
          System.out.println("Som genérico");
      }
    }
    
    class Gato extends Animal {
      @Override
      void emitirSom() {
          System.out.println("Miau");
      }
    }
    
    
    class Vaca extends Animal {
      @Override
      void emitirSom() {
          System.out.println("Muuu");
      }
    }
    
    }
    

    Aqui, o método emitirSom() das classes Vaca e Gato sobrescreve o método da classe Animal.

    Sobrecarga de métodos (Overload)

    A sobrecarga ocorre quando há vários métodos com o mesmo nome na mesma classe, mas com diferentes listas de parâmetros (assinaturas diferentes). É uma forma de polimorfismo em tempo de compilação.

    • Não envolve herança, ocorre dentro da mesma classe.
    • Permite chamar o método com diferentes tipos ou números de argumentos.

    Exemplo de sobrecarga:

    class Calculadora {
      int somar(int a, int b) {
          return a + b;
      }
    
    
      int somar(int a, int b, int c) {
          return a + b + c;
      }
    
    
      double somar(double a, double b) {
          return a + b;
      }
    }
    

    Aqui, o método somar() está sobrecarregado para aceitar diferentes números e tipos de argumentos.

    Abstração

    Abstração consiste em expor apenas os comportamentos essenciais de um objeto e esconder os detalhes da implementação. Pode ser aplicada com interfaces ou classes abstratas.

    Exemplo com interface:

    interface Forma {
      double calcularArea();
    }
    
    
    class Circulo implements Forma {
      private double raio;
    
    
      Circulo(double raio) {
          this.raio = raio;
      }
    
    
      public double calcularArea() {
          return Math.PI * raio * raio;
      }
    }
    

    Exemplo com classe abstrata:

    abstract class Veiculo {
      abstract void acelerar();
    }
    
    
    class Carro extends Veiculo {
      void acelerar() {
          System.out.println("Carro acelerando");
      }
    }
    

    A abstração define um contrato que as classes concretas devem seguir, sem impor como ele deve ser implementado.

    Conclusão

    Os quatro pilares da orientação a objetos tornam o código mais organizado, reutilizável, seguro e flexível. Entender e aplicar corretamente cada um deles é essencial para quem deseja se aprofundar no desenvolvimento de software com qualidade.

    Compartilhe
    Comentários (1)
    Carlos Barbosa
    Carlos Barbosa - 25/05/2025 19:00

    Ótima explicação, Victor !! 🚀