Programação Orientada a Objetos
Programação Orientada a Objetos
Paradigmas
Paradigmas de Programação são abordagens ou estilos diferentes de escrever código para resolver problemas.
A programação estruturada divide o código em estruturas para armazenar dados e funções que executam tarefas específicas. Ela normalmente é indicada para problemas menores e menos complexos.
Na POO, o código é organizado em objetos que representam entidades do mundo real, com atributos e métodos relacionados. Isso permite a modelagem de problemas complexos de forma mais intuitiva e promove a reutilização de código.
Exemplo
Imagine um sistema de controle de contas correntes.
Como seria escrito a definição de uma conta corrente em programção estruturada?
struct Conta{
float saldo;
int numero_conta;
char[30] correntista;
}
como seria fazer um saque ou um depósito?
int sacar(struct Conta minha_conta, float valor){
if(minha_conta.saldo>=valor){
minha_conta.saldo-=valor;
return 1;
}
return 0;
}
int depositar(struct Conta minha_conta, float valor){
minha_conta.saldo+=valor;
return 1;
}
Como fazer um saque quando a conta for com limite (cheque especial)?
int sacarComLimite(struct Conta minha_conta, float valor, float limite){
if(minha_conta.saldo>=valor+limite){
minha_conta.saldo-=valor;
return 1;
}
return 0;
}
Objeto
- Um objeto é cada uma das entidades identificáveis num dado domínio de aplicação
- Em um sistema Bancário teríamos objetos do tipo: Cliente, Conta, Conta Corrente, Dependente, etc.
- Um objeto também pode ser visto como um agregado de outros objetos (suas partes)
- Um Objeto é uma entidade independente que armazena dados, encapsula serviços, troca mensagens com outros objetos e é modelado para executar as funções do sistema
- Um Objeto pode ser descrito pela identificação de dois elementos básicos: estrutura e comportamento
Exemplo
Objeto do tipo Pessoa
- Estrutura : nome, cpf, idade
- Comportamento : trabalhar, descansar
Exemplo
Objeto do tipo Conta
- Estrutura: titular, código, saldo
- Comportamento: debitarValor, adicionarValor
Mensagens
- São estímulos enviados aos objetos solicitando que alguma operação seja realizada por um dado objeto
- Nome da mensagem
- Parâmetros
- Especifica O QUE deve ser feito
- O comportamento de um objeto é dado pelo conjunto de mensagens que ele pode responder
Características dos Objetos
- Único
- Possui atributos que definem caraterísticas e/ou estado
- Possuem capacidade de realizar ações que chamamos de métodos ou funções
- Normalmente se diz que um objeto é uma instância de uma Classe.
- O que é uma Classe ?
Classe
Origem do termo
- A palavra classe vem da taxonomia da biologia.
- Todos os seres vivos de uma mesma classe biológica têm uma série de atributos e comportamentos em comum, mas não são iguais, podem variar nos valores desses atributos e como realizam esses comportamentos.
- Homo Sapiens define um grupo de seres que possuem características em comum
- Homo Sapiens é um ser humano?
- Tudo está especificado na classe Homo Sapiens, mas se quisermos mandar alguém correr, comer, pular, precisaremos de uma instância de Homo Sapiens, ou então de um objeto do tipo Homo Sapiens.
Analogias
- Uma receita de bolo.
- Você come uma receita de bolo?
- Precisamos instaciá-la, criar um objeto bolo a partir dessa especificação (a classe) para utilizá-la.
- Podemos criar centenas de bolos a partir dessa classe (a receita, no caso), eles podem ser bem semelhantes, alguns até idênticos, mas são objetos diferentes.
- Você come uma receita de bolo?
- A planta de uma casa é uma casa?...
Conceito
- Uma classe é uma descrição de um conjunto que compartilham os mesmos atributos(características), operações, relacionamentos e semântica
- Todos os objetos são instâncias de classes, onde a classe descreve as propriedades e comportamentos daquele objeto
- Atributos são propriedades de uma classe, que descreve um intervalo de valores que as instâncias podem apresentar. Uma Classe pode ter qualquer número de atributos ou nenhum
- Operações correspondem aos processos que a classe pode realizar
- Estrutura (molde) que define os atributos e/ou estados de um conjunto de objetos com características similares.
- Define o comportamento de seus objetos (ações que o objeto pode fazer) através de métodos.
- Descreve os serviços (ações) providos por seus objetos
- Quais informações eles podem armazenar
class Conta{
int numero;
String cliente;
double saldo;
double limite;
}
Usando a classe
class Programa{
public static void main(String[] args){
new Conta();
}
}
- Objeto criado, mas como acessar?
class Programa{
public static void main(String[] args){
Conta minhaConta;
minhaConta = new Conta();
}
}
- Através da variável minhaConta, podemos acessar o objeto recém criado para alterar seu cliente, seu saldo, etc
class Programa{
public static void main(String[] args){
Conta minhaConta;
minhaConta = new Conta();
minhaConta.cliente = "Leandro";
minhaConta.saldo = 10.0;
System.out.println("Saldo atual: "+minhaConta.saldo);
}
}
Atributos de uma Classe
- Caraterísticas e/ou estado de uma classe
- Após a classe ser instanciada em um objeto os atributos vão receber valores (caraterísticas e/ou estados) que definem o objeto
class Conta{
int numero;//atributo
String cliente;//atributo
double saldo;//atributo
double limite;//atributo
}
Métodos de uma Classe
- Conjunto de ações que um determinado objeto pode executar
- Definem o que um objeto pode fazer
- São acionados por outros objetos
- Os objetos se comunicam através de métodos
- Troca de mensagens
Métodos sem retorno
- Um método que saca uma determinada quantidade e devolve nenhuma informação para quem acionar esse método
class Conta{
int numero;
String cliente;
double saldo;
double limite;
void saca(double quantidade){//método
double novoSaldo = saldo - quantidade;
saldo = novoSaldo;
}
}
- Fazer um depósito
class Conta{
int numero;
String cliente;
double saldo;
double limite;
void saca(double quantidade){//método
double novoSaldo = saldo - quantidade;
saldo = novoSaldo;
}
void deposita(double quantidade){//método
saldo += quantidade;
}
}
class Programa{
public static void main(String[] args){
Conta minhaConta;
minhaConta = new Conta();
minhaConta.cliente = "Leandro";
minhaConta.saldo = 100.0;
//saca 20
minhaConta.saca(20);
//deposita 50
minhaConta.deposita(50);
System.out.println("Saldo atual: "+minhaConta.saldo);
}
}
Método com retorno
- No caso do nosso método saca, podemos devolver um valor booleano indicando se a operação foi bem sucedida.
class Conta{
//...
boolean saca(double valor){
if(saldo<valor){
return false;
}else{
saldo -= valor;
return true;
}
}
}
class Programa{
public static void main(String[] args){
//...
minhaConta.saldo = 100.0;
boolean consegui=minhaConta.saca(20);
if(consegui){
System.out.println("Consegui sacar");
}else{
System.out.println("Não consegui sacar");
}
}
}
Referência ao Objeto
class Programa{
public static void main(String[] args){
Conta c1;
c1 = new Conta();
Conta c2;
c2 = new Conta();
}
}
- c1 uma variável que "aponta" para o objeto(referência).
class Programa{
public static void main(String[] args){
Conta c1;
c1 = new Conta();
Conta c2 = c1;
}
}
?
Como seria a transferência de valores entre duas contas?
Details
void transferir(Conta destino, double quantidade){
if(saca(quantidade)){
destino.deposita(quantidade);
}
}
Comparando
public static void main(String args[]) {
Conta c1 = new Conta();
c1.cliente = "Leandro";
c1.saldo = 100.0;
Conta c2 = new Conta();
c2.cliente = "Leandro";
c2.saldo = 100.0;
if (c1 == c2) {
System.out.println("Contas iguais");
}
}
- O operador
==
compara o conteúdo das variáveis- variáveis não guardam o objeto, e sim o endereço em que ele se encontra (referência)
- As contas podem ser equivalentes no nosso critério de igualdade, porém elas não são o mesmo objeto.
equals
public static void main(String args[]) {
Conta c1 = new Conta();
c1.cliente = "Leandro";
c1.saldo = 100.0;
Conta c2 = new Conta();
c2.cliente = "Leandro";
c2.saldo = 100.0;
if (c1.equals(c2)) {
System.out.println("Contas iguais");
}
}
class Conta {
//...
public boolean equals(Conta outraConta) {
return numero == outraConta.numero;
}
//...
}
Transformando o objeto em String
toString
O método toString()
em Java é um método da classe Object (falaremos de herança mais para frente) que retorna uma representação em formato de string do objeto em questão.
Se uma classe em Java deseja ter sua própria representação em formato de string, ela pode sobrescrever esse método e fornecer uma implementação personalizada. A implementação sobrescrita deve retornar uma string que descreva o objeto de uma forma útil e significativa para o usuário.
Por exemplo, a seguinte classe Pessoa
sobrescreve (falaremos de herança mais para frente) o método toString() para fornecer uma representação personalizada de uma pessoa:
public class Pessoa {
private String nome;
private int idade;
public Pessoa(String nome, int idade) {
nome = nome;
idade = idade;
}
@Override
public String toString() {
return "Pessoa{" +
"nome='" + nome + "'" +
", idade=" + idade + "}";
}
}
Neste exemplo, o método toString()
retorna uma string formatada que inclui o nome e a idade da pessoa em questão, com o seguinte formato: Pessoa{nome='Alice', idade=30}
.
Para usar o método toString()
em uma instância da classe Pessoa
, basta chamá-lo em uma referência para um objeto Pessoa
, como no exemplo abaixo:
Pessoa person = new Pessoa("Alice", 30);
String personString = person.toString(); // retorna "Pessoa{nome='Alice', idade=30}"
System.out.println(person);//Escreve Pessoa{nome='Alice', idade=30} no console