O que é POO e seus principais pilares.
O que é POO?
A POO(Programação orientada a objetos) é um paradigma da programação que surgiu na década de 70, se tornando popular entre os desenvolvedores por aproximar o mundo real do virtual. Ele surgiu para oferecer um modo mais intuitivo, de fácil desenvolvimento e reutilizável , pois divide o código em objetos que contém atributos e métodos.
Pilares da POO.
Esse paradigma tem 4 pilares e guiam sua implementação e permite você criar um sistema baseado em objetos, esse pilares são:
Herança: a Herança permite que uma classe "filha" herde atributos e métodos existentes dentro da classe "Pai". A seguir veremos um exemplo desse pilar:
public class Animal {
private String nome;
public Animal(String nome) {
this.nome = nome;
}
public void emitirSom() {
System.out.println("O animal faz um som.");
}
}
public class Cachorro extends Animal {
public Cachorro(String nome) {
super(nome);
}
@Override
public void emitirSom() {
System.out.println("O cachorro late.");
}
}
public class TesteHeranca {
public static void main(String[] args) {
Animal animal = new Animal("Animal Genérico");
animal.emitirSom();
Cachorro cachorro = new Cachorro("Rex");
cachorro.emitirSom();
}
}
Explicação do exemplo: A classe Cachorro herda a variável {nome} da classe e o método emitirSom() que ela extende. Podendo ter seu próprio nome e uma função emitirSom() diferente.
Encapsulamento: o Encapsulamento permite esconder detalhes importantes de uma classe, permitindo acesso e modificação deles somente por métodos(Getters e Setters). A seguir veremos um exemplo desse pilar:
public class ContaBancaria {
private double saldo;
public ContaBancaria(double saldoInicial) {
this.saldo = saldoInicial;
}
public double getSaldo() {
return saldo;
}
public void depositar(double valor) {
if (valor > 0) {
saldo += valor;
System.out.println("Depósito realizado. Saldo atual: " + saldo);
} else {
System.out.println("Valor de depósito inválido.");
}
}
public void sacar(double valor) {
if (valor > 0 && valor <= saldo) {
saldo -= valor;
System.out.println("Saque realizado. Saldo atual: " + saldo);
} else {
System.out.println("Saque inválido.");
}
}
}
Explicação do exemplo: a classe ContaBancaria permite que seu saldo seja visualizado somento pelo método Get e que seu valor seja alterado após a inicialização da classe somente pela função depositar().
Polimorfismo: o Polimorfismo permite que um método que herda características de outro possam ter comportamentos diferente dependendo do objetivo do desenvolvedor. A seguir veremos um exemplo do pilar:
public class Veiculo {
public void mover() {
System.out.println("O veículo está se movendo.");
}
}
public class Bicicleta extends Veiculo {
@Override
public void mover() {
System.out.println("A bicicleta está pedalando.");
}
}
public class TestePolimorfismo {
public static void main(String[] args) {
Veiculo veiculo = new Veiculo();
veiculo.mover(); // Saída: O veículo está se movendo.
Veiculo bicicleta = new Bicicleta();
bicicleta.mover(); // Saída: A bicicleta está pedalando.
}
}
Explicação do exemplo: a classe Bicicleta herda características de Veiculo, pois ela é um veiculo, porém a função mover() é diferente da sua classe "Pai".
Abstração: a Abstração permite que sejam escondidos aspectos essenciais de um objeto podendo implementar eles posterior mente, a abstração é a união dos conceitos de polimorfismo e encapsulamento. A seguir veremos um exemplo do pilar:
public abstract class Veiculo {
private String marca;
public Veiculo(String marca) {
this.marca = marca;
}
public String getMarca() {
return marca;
}
// Método abstrato: implementado nas subclasses
public abstract void mover();
}
public class Carro implements Veiculo {
public Carro(String marca) {
super(marca);
}
@Override
public void mover() {
System.out.println("O carro está se movendo.");
}
}
Explicação do exemplo: a classe abstrata Veiculo tem um método mover() abstrato que não tem corpo, ou seja, não faz nenhuma ação, porém a classe Carro implementa ela e é obrigada a adicionar um corpo ao método mover().
Conclusão
A POO é um paradigma essencial para desenvolver sistemas modernos que sejam moduláveis, escaláveis, que evita redundância deixando assim o código mais legível e de fácil manutenção, porém como tudo tem suas desvantagens sendo elas a dificuldade para iniciantes entender alguns conceitos e não ser ideal para problemas muito simples.
Considerações Finais
Agradeço a todos que lerem esse meu primeiro artigo, espero ter ajudado de alguma forma =).