Programação Orinetada a Objetos (POO) é um paradigma que organiza o código em torno de objetos e classes. Em Java, esse paradigma é fundamental para criar software modular e reutilizável.
Conceitos Básicos
- Classe: modelo que define atributos e comportamentos.
- Objeto: instância cnocreta de uma classe.
- Abstração: simplificação da realidade focando nos pontos essenciais.
Os pilares da POO são:
- Encapsulamento: agrupar dados e métodos que operam sobre eles, controlando o acesso.
- Herança: criar novas classes a partir de classes existentes.
- Polimorfismo: permitir que um mesmo nome de método se comporte de diferentes formas.
Do ponto de vista conceitual, primeiro existem objetos concretos e depois abstraímos classes. Já na implementação, primeiro definimos a classe e depois criamos objetos a partir dela.
Métodos em Detalhe
Um método pode ser estático (asssociado à classe) ou de instância (associado ao objeto). A assinatura inclui modificador de acesso, tipo de retorno, nome e parâmetros.
Exemplo de definição e chamada de método:
// Exemplo01.java
public class Exemplo01 {
public static void main(String[] args) {
// Chamada de método não estático
Exemplo01 obj = new Exemplo01();
String saudacao = obj.dizerOla();
System.out.println(saudacao);
// Chamada de método estático
int resultado = Exemplo01.somar(5, 3);
System.out.println("Soma: " + resultado);
}
// Método de instância
public String dizerOla() {
return "Olá, mundo!";
}
// Método estático
public static int somar(int a, int b) {
return a + b;
}
}
Diferença entre static e não static: métodos estáticos podem ser invocados sem criar uma instância, enquanto métodos de instância precisam de um objeto.
Exemplo de acesso a métodos estáticos e de instância:
// Aluno.java
public class Aluno {
public static void falar() {
System.out.println("O aluno está falando.");
}
public void andar() {
System.out.println("O aluno está andando.");
}
}
// TesteAluno.java
public class TesteAluno {
public static void main(String[] args) {
// Chamada estática direta
Aluno.falar();
// Chamada de instância
Aluno aluno = new Aluno();
aluno.andar();
}
}
Passagem de Parâmetros
Em Java, a passagem de parâmetros é sempre por valor. Para tipos primitivos, o valor é copiado; para objetos, a referência é copiada (ainda assim, a referência aponta para o mesmo objeto).
Exemplo com tipo primitivo:
public class ExemploPassagem {
public static void main(String[] args) {
int numero = 10;
System.out.println("Antes: " + numero); // 10
alterarPrimitivo(numero);
System.out.println("Depois: " + numero); // ainda 10
}
public static void alterarPrimitivo(int valor) {
valor = 20;
}
}
Exemplo com objeto (tipo referência):
class Pessoa {
String nome;
}
public class ExemploReferencia {
public static void main(String[] args) {
Pessoa pessoa = new Pessoa();
System.out.println("Antes: " + pessoa.nome); // null
alterarNome(pessoa);
System.out.println("Depois: " + pessoa.nome); // "João"
}
public static void alterarNome(Pessoa p) {
p.nome = "João";
}
}
Ao passar um objeto, a variável de referência é copiada, mas ambas as referências apontam para o mesmo objeto na memória. Portanto, alterar o objeto através da referência local modifica o objeto original.