JAVA Learning

Hub de Conteúdo

POO - Programação Orientada a Objetos

Guia completo sobre o paradigma de programação mais usado no desenvolvimento moderno

1. O que é Programação Orientada a Objetos?

A Programação Orientada a Objetos (POO) é um paradigma de programação que organiza o código em torno de "objetos" que representam entidades do mundo real. Em vez de pensar em funções e procedimentos, você pensa em objetos que têm características (atributos) e comportamentos (métodos).

POO torna o código mais organizado, reutilizável e fácil de manter. É o paradigma usado na maioria dos sistemas modernos e é fundamental para qualquer desenvolvedor Java.

2. Os 4 Pilares da POO

A Programação Orientada a Objetos se baseia em quatro conceitos fundamentais:

Encapsulamento

Proteger dados internos do objeto, controlando acesso com modificadores e métodos getters/setters.

Herança

Reutilizar código de classes existentes. Uma classe filha herda características e comportamentos da classe pai.

Polimorfismo

Um objeto assumir várias formas. Um mesmo método pode ter comportamentos diferentes dependendo do objeto.

Abstração

Esconder complexidade, mostrando apenas o essencial. Usamos classes abstratas e interfaces para isso.

3. Classes e Objetos

O que é uma Classe?

Uma classe é como um molde ou planta arquitetônica. Ela define a estrutura e o comportamento que os objetos terão, mas não é um objeto em si.

Estrutura de uma Classe:
java
public class Pessoa {
    // Atributos (características)
    String nome;
    int idade;
    double altura;
    
    // Métodos (comportamentos)
    public void apresentar() {
        System.out.println("Olá, meu nome é " + nome);
        System.out.println("Tenho " + idade + " anos");
    }
    
    public void fazerAniversario() {
        idade++;
        System.out.println("Feliz aniversário! Agora tenho " + idade + " anos");
    }
}

Criando e Usando Objetos

java
public class Main {
    public static void main(String[] args) {
        // Criando objetos (instâncias)
        Pessoa pessoa1 = new Pessoa();
        pessoa1.nome = "João";
        pessoa1.idade = 25;
        
        Pessoa pessoa2 = new Pessoa();
        pessoa2.nome = "Maria";
        pessoa2.idade = 30;
        
        // Usando os métodos
        pessoa1.apresentar();
        pessoa1.fazerAniversario();
    }
}

4. Construtores

Um construtor é um método especial chamado automaticamente quando você cria um objeto. Ele inicializa os atributos.

java
public class Carro {
    String marca;
    String modelo;
    int ano;
    
    // Construtor sem parâmetros
    public Carro() {
        marca = "Não definida";
        modelo = "Não definido";
        ano = 0;
    }
    
    // Construtor com parâmetros
    public Carro(String marca, String modelo, int ano) {
        this.marca = marca;
        this.modelo = modelo;
        this.ano = ano;
    }
    
    public void exibir() {
        System.out.println("Carro: " + marca + " " + modelo + " (" + ano + ")");
    }
}

// Uso:
Carro carro1 = new Carro();
Carro carro2 = new Carro("Toyota", "Corolla", 2023);
carro2.exibir();  // Carro: Toyota Corolla (2023)

5. Encapsulamento

Encapsulamento é o conceito de proteger os dados de um objeto, controlando como eles são acessados e modificados.

Modificadores de Acesso

Modificador Acesso
private Apenas dentro da própria classe
protected Mesmo pacote + subclasses
public De qualquer lugar

Getters e Setters

java
public class ContaBancaria {
    private String titular;
    private double saldo;
    
    public ContaBancaria(String titular) {
        this.titular = titular;
        this.saldo = 0.0;
    }
    
    // Getter
    public double getSaldo() {
        return saldo;
    }
    
    // Setter com validação
    public void depositar(double valor) {
        if (valor > 0) {
            saldo += valor;
            System.out.println("Depósito de R$ " + valor + " realizado");
        }
    }
    
    public void sacar(double valor) {
        if (valor > 0 && valor <= saldo) {
            saldo -= valor;
            System.out.println("Saque de R$ " + valor + " realizado");
        }
    }
}

6. Herança

Herança permite que uma classe herde atributos e métodos de outra classe, promovendo reuso de código. Usa a palavra-chave extends.

java
// Superclasse (Classe Pai)
public class Animal {
    protected String nome;
    
    public Animal(String nome) {
        this.nome = nome;
    }
    
    public void dormir() {
        System.out.println(nome + " está dormindo");
    }
}

// Subclasse (Classe Filha)
public class Cachorro extends Animal {
    public Cachorro(String nome) {
        super(nome);
    }
    
    public void latir() {
        System.out.println(nome + " está latindo: Au au!");
    }
}

// Uso:
Cachorro dog = new Cachorro("Rex");
dog.dormir();   // Método herdado
dog.latir();    // Método próprio

7. Polimorfismo

Polimorfismo (muitas formas) permite que um método tenha comportamentos diferentes dependendo do objeto que o chama.

java
public class FormaGeometrica {
    public void desenhar() {
        System.out.println("Desenhando uma forma");
    }
}

public class Circulo extends FormaGeometrica {
    @Override
    public void desenhar() {
        System.out.println("Desenhando um círculo");
    }
}

public class Retangulo extends FormaGeometrica {
    @Override
    public void desenhar() {
        System.out.println("Desenhando um retângulo");
    }
}

// Uso - Polimorfismo:
FormaGeometrica forma1 = new Circulo();
FormaGeometrica forma2 = new Retangulo();

forma1.desenhar();  // Desenhando um círculo
forma2.desenhar();  // Desenhando um retângulo

8. Abstração

Abstração é o conceito de esconder a complexidade e mostrar apenas o essencial. Usamos classes abstratas e interfaces.

Classes Abstratas

java
public abstract class Funcionario {
    protected String nome;
    protected double salarioBase;
    
    public Funcionario(String nome, double salarioBase) {
        this.nome = nome;
        this.salarioBase = salarioBase;
    }
    
    // Método abstrato - deve ser implementado
    public abstract double calcularSalario();
    
    // Método concreto
    public void exibir() {
        System.out.println("Funcionário: " + nome);
        System.out.println("Salário: R$ " + calcularSalario());
    }
}

public class FuncionarioMensalista extends Funcionario {
    public FuncionarioMensalista(String nome, double salarioBase) {
        super(nome, salarioBase);
    }
    
    @Override
    public double calcularSalario() {
        return salarioBase;
    }
}

Interfaces

java
public interface Pagavel {
    double calcularPagamento();
    void processar();
}

public class Fatura implements Pagavel {
    private double valor;
    
    public Fatura(double valor) {
        this.valor = valor;
    }
    
    @Override
    public double calcularPagamento() {
        return valor;
    }
    
    @Override
    public void processar() {
        System.out.println("Processando pagamento: R$ " + valor);
    }
}

9. Exercícios Práticos

Exercício 1: Classe Produto

Crie uma classe Produto com atributos nome, preço e quantidade. Implemente métodos para adicionar/remover estoque e calcular valor total.

Exercício 2: Herança com Veículos

Crie uma classe Veiculo (marca, modelo, ano) e duas subclasses: Carro (numPortas) e Moto (cilindradas).

Exercício 3: Interface Pagamento

Crie uma interface FormaPagamento e implemente em classes CartaoCredito, Pix e Dinheiro.

10. Resumo dos 4 Pilares

Encapsulamento

Proteger dados com private e controlar acesso com getters/setters.

Herança

Reutilizar código com extends. Subclasse herda de superclasse.

Polimorfismo

Mesmo método, comportamentos diferentes. Sobrescrita (Override) e Sobrecarga (Overload).

Abstração

Classes abstratas e interfaces. Esconder complexidade, mostrar o essencial.

Conclusão

Programação Orientada a Objetos é fundamental para criar sistemas organizados, reutilizáveis e fáceis de manter. Com os 4 pilares (Encapsulamento, Herança, Polimorfismo e Abstração), você está pronto para desenvolver aplicações Java profissionais!

Continue praticando criando suas próprias classes e modelando problemas do mundo real usando POO!