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.
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
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.
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
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.
// 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.
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
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
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!