SlideShare uma empresa Scribd logo
1 de 77
Baixar para ler offline
Programação Orientada a Objetos
Fausto Maranhão Ayres
3
Fundamentos da POO
1
Paradigmas de Programação
Paradigmas de Programação
 Programação orientada a procedimento
 Programação orientada a função
 Programação orientada a lógica
 Programação orientada a objeto
 etc
3
fausto.ayres@gmail.com
Abstração
 Técnica para lidar com a complexidade de uma tarefa
4
Copyritght 1991 © Grady Booch
fausto.ayres@gmail.com
Abstração x Paradigma
5
fausto.ayres@gmail.com
Programação
Procedimental
...
saldo1 = 0
saldo2 = 0
creditar(saldo1, 100)
debitar(saldo1, 20)
creditar(saldo2, 100)
transferir(saldo2, saldo1, 50)
print(saldo1)
print(saldo2)
Programação
Orientada a Objetos
...
Conta conta1 = new Conta(...)
Conta conta2 = new Conta(...)
conta1.creditar(100)
conta1.debitar(20)
conta2.creditar(100)
conta2.transferir(conta1, 50)
println(conta1.getSaldo())
println(conta2.getSaldo())
Paradigma x Linguagem
6
fausto.ayres@gmail.com
Linguagens
Programação
Fortran, Basic, Pascal, C, Cobol, Cliper ...
Orientado a
procedimento
Smaltalk, C++, Eiffel, Lua, Delphi, VB, Python,
Java, C#, PHP, JavaScript, ...
Orientado a
objeto
Classe e Objeto
Conceito
 Uma classe é a descrição de um conjunto de
coisas (objeto) do mundo real que possuem
mesmos atributos (estrutura) e métodos
(comportamento)
 Objeto é uma instância de uma classe
8
fausto.ayres@gmail.com
Representação do objeto
a1
a2
aN
Métodos
Atributos
objeto
fausto.ayres@gmail.com
são as variáveis
internas
são as funções
internas
Variável de referência
9
Etapas do desenvolvimento O.O.
10
fausto.ayres@gmail.com
Criação dos objetos
Teste e aplicações
Implementação das classes
Usando uma linguagem orientada a objeto
Modelagem das classes
Especificar classes e seus relacionamentos
Modelagem de classes (classificação)
Copyritght 1991 © Grady Booch
Objetos
da
Classe
Leao
Objetos
da
Classe
Cobra
Objetos
da
Classe
Girafa
fausto.ayres@gmail.com
Este objeto é de
qual classe ??
11
Exemplo 1
Implementação da classe Retangulo
 Figura geométrica de retângulo
Modelagem da classe
Diagrama UML
Retangulo
id : int
largura :double
comprimento : double
calcularArea()
calcularPerimetro()
calcularDiagonal()
enquadrar()
redimensionar(fator)
ehQuadrado()
ehEquivalente(outro)
...
atributos
métodos
id=1 id=2
classe
c
l
área
fausto.ayres@gmail.com 13
Objetos do mundo real
public class Retangulo
{ public int id;
public double largura;
public double comprimento;
public double calcularArea(){
return largura * comprimento;
}
}
Retangulo
id
largura
comprimento
calcularArea()
Implementação de Retangulo
Retangulo.java
atributo
método
fausto.ayres@gmail.com 14
UML
Criar objeto
Retangulo r = new Retangulo();
onde:
1. o operador new faz alocação dinâmica dos atributos
2. o método construtor default da classe, inicializa os
atributos numéricos do objeto com 0
3. o endereço do objeto é armazenado na variável r
15
fausto.ayres@gmail.com
id:0
largura:0
comprimento:0
r
Construtor sem
parametro
Atributos
 Depois do objeto criado, pode-se manipular os
atributos e chamar os métodos da classe
Manipulação dos atributos
17
fausto.ayres@gmail.com
r id:1
largura:3
comprimento:4
Adicionando construtores na classe
 Pode-se implementar vários métodos construtores
com diferentes parâmetros, inclusive o construtor
vazio
18
fausto.ayres@gmail.com
2 construtores
Usando os construtores
19
fausto.ayres@gmail.com
Dica eclipse
 É possível adicionar o construtor pelo eclipse:
20
fausto.ayres@gmail.com
Métodos
Chamada de métodos
 Individual
 Encadeada
22
fausto.ayres@gmail.com
nome = teclado.nextLine().toUpperCase();
retorna String retorna String
retorna String
String nome;
nome = teclado.nextLine();
nome = nome.toUpperCase();
retorna String
double x = new Retangulo(1,3,4).calcularArea();
Retangulo r = new Retangulo(1,2,5);
System.out.println(r.calcularArea());
Chamada ao método calcularArea()
23
fausto.ayres@gmail.com
public double calcularArea(){
return largura*comprimento;
}
10
10
id: 1
largura: 2
comprimento:
5
r
Declaração de Método
 Os métodos se comportam como funções que
recebem 0...N parâmetros e retornam (ou não) um
resultado:
public tipo nome (lista de 0...N parâmetros) {
...
return resultado;
}
24
fausto.ayres@gmail.com
tipo do resultado retornado
Não é necessário para o tipo void
Modificador de
acesso
Exemplo de método void (sem retorno)
 Executa uma tarefa sem retornar um resultado
Ex:
Teste
Retangulo r = new Retangulo(1, 3, 5);
System.out.println(r.calcularArea()); //15.0
r.enquadrar();
System.out.println(r.calcularArea()); //16.0
fausto.ayres@gmail.com 25
exiba os atributos!
Exemplo de método boolean
Teste
Retangulo r;
r = new Retangulo(1, 3, 3);
System.out.println(r.ehQuadrado()); // true
r = new Retangulo(2, 2, 7);
System.out.println(r.ehQuadrado()); // false
fausto.ayres@gmail.com 26
27
O método public String toString()
Obtém os dados do objeto na forma de string
Teste
Retangulo r;
r = new Retangulo(1, 3, 5);
System.out.println(r); //r.toSring()
27
id=1 largura=3 comprimento=5
chama automaticamente toString()
fausto.ayres@gmail.com
Dica eclipse
 É possível gerar toString() pelo eclipse
28
fausto.ayres@gmail.com
Exercício 1
 Implemente a classe Triangulo com:
 Atributos: base e altura
 Métodos:
• Construtor para inicializar os 2 atributos
• calcularArea()
• toString()
 Implemente a classe TesteTriangulo para criar
um objeto Triangulo e aplicar os métodos sobre
este objeto
29
fausto.ayres@gmail.com
Parâmetro implícito this
A variável this
 Contém a referência para o objeto envolvido na
chamada de método
...
this
objeto
fausto.ayres@gmail.com 31
Uso da variável this
 É usada para distinguir um atributo do objeto de
uma outra variável de mesmo nome
fausto.ayres@gmail.com 32
largura
parâmetro
largura
atributo
atributo parâmetro
this
Uso da variável this
 A variável this é implícita e pode ser ocultada no
código-fonte.
33
fausto.ayres@gmail.com
A variável this está implícita
Ex: equivalência de área
Teste
Retangulo r1,r2;
r1 = new Retangulo(1, 3, 3);
r2 = new Retangulo(2, 2, 4.5);
System.out.println(r1.ehEquivalente(r2)); // true
Uso da variável this
fausto.ayres@gmail.com 34
Compara a
área dos
dois objetos
id: 1
largura: 3
comprimento: 3
this
id: 2
largura: 2
comprimento:
4.5
outro
r1
r2
Sobrecarga
Sobrecarga de método
 Ocorre quando um método possui mais de uma
assinatura com mesmo nome
public class Retangulo{
...
public void redimensionar(double fator)
{
largura = largura * fator;
comprimento = comprimento * fator;
}
public void redimensionar(Retangulo objeto)
{
largura = objeto.largura;
comprimento = objeto.comprimento;
}
fausto.ayres@gmail.com
Assinaturas
diferentes
36
número
Sobrecarga de método
Teste
Retangulo r1 = new Retangulo(1, 2, 4);
Retangulo r2 = new Retangulo(2, 3, 10);
System.out.println(r1.calcularArea()); //8
System.out.println(r2.calcularArea()); //30
r1.redimensionar(0.5); //metade
System.out.println(r1.calcularArea()); //2
r2.redimensionar(2.0); //dobro
System.out.println(r2.calcularArea()); //120
r2.redimensionar(r1); //copia dados de r1
System.out.println(r2.calcularArea()); //2
fausto.ayres@gmail.com 37
Exercício 2
 Crie outro construtor de Retangulo com apenas
um parâmetro, que será usado para inicializar
tanto a largura quanto o comprimento.
Ex:
Retangulo r = new Retangulo(5);
System.out.println(r.calcularArea()); //25
38
fausto.ayres@gmail.com
Encapsulamento
40
Acesso aos atributos públicos
 Os atributos declarados como public podem ser
acessados diretamente pelo programa, mas isso
não é uma boa prática, pois diminui a abstração
de dados.
 Solução: Encapsulamento dos atributos
40
fausto.ayres@gmail.com
Encapsulamento dos atributos
 É o conceito da POO que impede o acesso direto
aos atributos do objeto, visando aumentar a
abstração
fausto.ayres@gmail.com 41
Fonte: Use a cabeça:Java
Modificador de acesso private
 Exemplo:
private impede o acesso ao atributo fora de
sua classe.
public class Retangulo {
private double largura;
private double comprimento;
...
pubic static void main(...){
Retangulo r1 = new Retangulo(1,5,30);
r1.largura = 8; //erro
r1.comprimento = 10; //erro
System.out.println(r1.largura); //erro
System.out.println(r1.comprimento); //erro
...
fausto.ayres@gmail.com 42
Métodos get/set
 O acesso a um atributo deve ser feito sempre
que possível via getAtributo() e setAtributo()
Ex:
Retangulo r1 = new Retangulo(1,5,30);
r1.setLargura(8);
r1.setComprimento(10);
System.out.println(r1.getLargura() );
System.out.println(r1.getComprimento() );
fausto.ayres@gmail.com 43
Implementação de get/set
 Retangulo
public class Retangulo{
private double largura;
private double comprimento;
...
public double getLargura() {
return this.largura;
}
public double getComprimento() {
return this.comprimento;
}
public void setLargura(double largura) {
this.largura=largura;
}
public void setComprimento(double comprimento) {
this.comprimento=comprimento;
}
}
fausto.ayres@gmail.com 44
Dica eclipse
 É possível gerar get/set através do eclipse:
45
fausto.ayres@gmail.com
Exemplo de encapsulamento
 Obter os dados internos de uma matrícula de
aluno
46
fausto.ayres@gmail.com
Exemplo de encapsulamento
47
fausto.ayres@gmail.com
Outro exemplo de encapsulamento
 Criar uma janela desktop
48
fausto.ayres@gmail.com
Exercício 3
 A classe Aluno:
 Atributos: nome, nota1, nota2 (0 a 100)
 Métodos:
• Construtor para inicializar nome e as 2 notas
• getMedia() retorna a média aritmética (inteira)
• getSituacao(), retorna “aprovado”, “reprovado” e
“final” de acordo com a media
• toString()
 A classe TesteAluno
Aluno a1 = new Aluno(“joao”, 100, 70) ;
System.out.println(a1);
49
fausto.ayres@gmail.com
Exemplo 2:
Implementação da classe Conta
Modelagem da classe
 conta de um banco digital
51
fausto.ayres@gmail.com
numero
cpf
saldo
creditar(valor)
debitar(valor)
transferir(valor, destino)
Conta
atributos
métodos
classe
Diagrama de classe UML
Implementação
fausto.ayres@gmail.com
public class Conta {
private String numero;
private String cpf;
private double saldo;
public Conta(String numero, String cpf) {
this.numero = numero;
this.cpf = cpf;
this.saldo = 0;
}
public void creditar(double valor) {
saldo = saldo + valor;
}
public void debitar(double valor) {
saldo = saldo - valor;
}
//...demais métodos
} 52
numero
cpf
saldo
creditar(valor)
debitar(valor)
transferir(…)
Conta
construtor
Atributos
A variável this
está implícita
Dica eclipse
 É possível inserir o construtor pelo eclipse:
53
fausto.ayres@gmail.com
O saldo deve ser
inicializado com 0
54
Criar objeto
public class TesteConta{
public static void main (String[] args) {
Conta conta1 = new Conta(“101”,”123456”);
conta1.creditar(300.0);
conta1.debitar(100.0);
conta1.creditar(200.0);
System.out.println(conta1.getSaldo()); //400
}
}
54
fausto.ayres@gmail.com
numero:“101”
cpf:“123456”
saldo:400.0
conta1
Chamada ao método creditar
 O método creditar modifica o atributo saldo
55
fausto.ayres@gmail.com
public void creditar(double valor){
saldo = saldo + valor;
}
conta1.creditar(300);
numero:“101”
cpf:“123456”
saldo:300.0
conta1
Teste:
saldo = 0 + 300
conta1.creditar(300);
Chamada ao método creditar
fausto.ayres@gmail.com
conta1
“101”
“123456”
0
“101”
“123456”
300
56
conta1
depois
Modificou o saldo
antes
Chamada ao método debitar
 O método debitar modifica o atributo saldo
57
fausto.ayres@gmail.com
public void debitar(double valor){
saldo = saldo - valor;
}
conta1.debitar(200);
numero:“101”
cpf:“123456”
saldo:100.0
conta1
objeto após debitar
Teste:
saldo = 300 - 200
58
método toString
Converter o objeto para uma string
58
System.out.println(conta1);
numero=101 cpf=123456 saldo=100
numero:“101”
cpf:“123456”
saldo:100.0
conta1
fausto.ayres@gmail.com
Exercicio 4
 Implemente o método vazia() na classe Conta
que retorna true se o saldo estiver 0
59
fausto.ayres@gmail.com
public class TesteConta{
public static void main (String[] args) {
Conta conta1 = new Conta(“333”,”123456”);
conta1.creditar(300.0);
conta1.debitar(100.0);
conta1.creditar(200.0);
...
conta1.debitar(400.0);
System.out.println(conta1.vazia()); //true
}
}
Uso da variável this
fausto.ayres@gmail.com
...
public void transferir(double valor, Conta destino)
{
this.debitar(valor);
destino.creditar(valor);
}
conta1.transferir(100, conta2)
... ....
conta1 conta2
60
objeto Conta
Teste
Uso da variável this
fausto.ayres@gmail.com
...
public void transferir(double valor, Conta destino)
{
this.debitar(valor);
destino.creditar(valor);
}
conta2.transferir(50, conta1)
... ....
conta1 conta2
61
objeto Conta
Teste
Tópicos adicionais
Visibilidade de atributos e métodos
 Os atributos e métodos podem ser declarados
em qualquer lugar dentro da classe, pois são
acessíveis em qualquer lugar da classe
Ex:
63
fausto.ayres@gmail.com
public class Conta {
public void creditar(double valor) {...}
public Conta(String n, String c) {...}
public String numero;
public String cpf;
public void debitar(double valor) {...}
public double saldo;
...
}
Inicialização default dos atributos
 Antes de executar o construtor, a JVM inicializa
automaticamente todos os atributos do objeto
com os seguintes valores default:
 Entretanto, pode-se inicializar manualmente
fausto.ayres@gmail.com
int 0
double 0.0
boolean false
String null (qualquer classe)
public class Conta {
public String numero;
public String cpf;
public double saldo = 1000.0;
...
64
Inicialização pode ser
feita aqui ou dentro do
construtor
Argumentos variáveis (varargs)
 Pode-se chamar um método com quantidade
variável de argumentos
 Para tanto, o método deve ter o parâmetro
declarado com a expressão “tipo...”
O parâmetro lista é um array
65
fausto.ayres@gmail.com
public class Conta {
...
public void creditar(double... lista) {
for(double valor : lista)
saldo = saldo + valor;
}
conta1.creditar(100.0); //1
conta1.creditar(200.0, 50.0); //2
conta1.creditar(100.0, 300.0, 100.0);//3
Tipos de modificadores de acesso
 Java possui 4 modificadores de acesso que
determinam a forma de acesso a um atributo ou
método:
66
fausto.ayres@gmail.com
Permite acesso
Modificador
apenas dentro da própria classe
private
em qualquer classe
public
apenas na herança de classe
protected
apenas dentro de um mesmo package
(package private)
“ausente”
Documentação HTML das classes
67
fausto.ayres@gmail.com
Escolha o projeto
Pasta destino
selecione
javadoc.exe
São gerados arquivos HTML e o index.html
Exercício 5
 Crie a classe AlunoFlex, considerando
 que o aluno possui várias notas (double... notas)
 que o construtor vai receber uma quantidade
indeterminada de notas, além do nome
 Adaptar os demais métodos de Aluno
Teste
AlunoFlex a1 = new AlunoFlex(“joao”, 100, 70) ;
AlunoFlex a2 = new AlunoFlex(“maria”, 90, 50, 70, 80) ;
System.out.println(a1);
System.out.println(a2);
68
fausto.ayres@gmail.com
Ciclo de vida dos objetos
Ciclo de vida de um objeto
1. Instanciação: o objeto é criado na memória e
passa a ser referenciado por uma variável de
referência;
2. Uso: manipulamos o objeto através de seus
métodos
3. Destruição: quando o objeto não é mais
referenciado (acessível) ele torna-se elegível
para a coleta de lixo
Coletor de Lixo:
serviço que limpa a memória ocupada pelos
objetos inacessíveis (quando necessário)
fausto.ayres@gmail.com 70
Esquema
71
fausto.ayres@gmail.com
Retangulo r;
new Retangulo(1,5,30);
r = new Retangulo(5,30);
r.setLargura(10);
r = null;
Instanciação (cria referência)
Destruição (descarta referência)
r
30
5
r
inacessível
30
10
O objeto está
elegível para
a coleta de
lixo
Atribuição (guarda referência)
Uso (acessa referência)
Declaração da variável de referência (não existe objeto ainda)
acessível
 O trecho de abaixo cria 10 objetos e descarta 9
Retangulo r1 = null;
for(int i=1; i<=10; i++){
r1 = new Retangulo(i,i,i); //cria dez objetos
System.out.println(r1.calcularArea());
}
System.out.println(r1.getId()); // 10
 No final do loop, apenas o último objeto (id=10)
permanece na variável r1.
 Onde estão os 9 primeiros objetos descartados?
 Resposta: no lixo!
Exemplo
72
fausto.ayres@gmail.com
Criação e descarte dos objetos
73
fausto.ayres@gmail.com
1 2 3 4 7
6
5 8 9
r1
Os 9 primeiros objetos se tornaram
inacessíveis e foram para a coleta de lixo
10
O décimo objeto
permanece na
memória e acessível
por r1
for
. . .
Sequência de criação e
descarte dos objetos
Várias variáveis para um objeto
 Pode-se ter várias referências para um objeto
r1
Retangulo r1,r2,r3;
r1 = new Retangulo(1,5,30);
r2=r1;
r3=r1;
r3.setLargura(7);
r2.setLargura(8);
...println(r1.calcularArea()); //240
...println(r2.calcularArea()); //240
...println(r3.calcularArea()); //240
r2
r3
3 variáveis
1 objeto
largura
5 7 8
Comprimento
30
74
fausto.ayres@gmail.com
Exemplo
 Quantos objetos foram instanciados? 2
 Quais objetos foram para a coleta de lixo? nenhum
Retangulo r1,r2,r3;
r1 = new Retangulo(1, 5,30);
r2 = new Retangulo(2, 10,10);
r3=r2;
r2=r1;
r1=null;
fausto.ayres@gmail.com 75
1, 5 , 30
2, 10 , 10
r2
r1
r3
Exemplo
 Quantos objetos foram instanciados? 2
 Quais objetos foram para a coleta de lixo? Id=2
Retangulo r1,r2,r3;
r1 = new Retangulo(1,5,30);
r2 = new Retangulo(2,10,10);
r3=r2;
r2=r1;
r3=null;
fausto.ayres@gmail.com 76
1, 5 , 30
2, 10 , 10
r2
r1
r3
Vai p/ lixo
Exemplo
 Quantos objetos foram instanciados? 2
 Quais objetos foram para a coleta de lixo? id=1
Retangulo r1;
r1 = new Retangulo(1,5,30);
r1 = new Retangulo(2,10,10);
fausto.ayres@gmail.com 77
1, 5 , 30
2, 10 , 10
r1
Vai p/ lixo

Mais conteúdo relacionado

Semelhante a POO-FundamentosPOO.pdf

Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2irenescotolo
 
Programando em python classes
Programando em python   classesProgramando em python   classes
Programando em python classessamuelthiago
 
Exercícios de programação orientado a objeto
Exercícios de programação orientado a objetoExercícios de programação orientado a objeto
Exercícios de programação orientado a objetoGleyciana Garrido
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
Minicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e PythonMinicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e PythonGuilherme Garcia
 
Classe integer-float-byte-short-long-double
Classe integer-float-byte-short-long-doubleClasse integer-float-byte-short-long-double
Classe integer-float-byte-short-long-doublePAULO Moreira
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classesCarlos Melo
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.xNorton Guimarães
 
Programação orientada a objetos – III
Programação orientada a objetos – IIIProgramação orientada a objetos – III
Programação orientada a objetos – IIIGabriel Faustino
 
09 programando em python - classes
 09   programando em python - classes 09   programando em python - classes
09 programando em python - classesVictor Marcelino
 

Semelhante a POO-FundamentosPOO.pdf (20)

10 heranca
10   heranca10   heranca
10 heranca
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
 
Programando em python classes
Programando em python   classesProgramando em python   classes
Programando em python classes
 
Exercícios de programação orientado a objeto
Exercícios de programação orientado a objetoExercícios de programação orientado a objeto
Exercícios de programação orientado a objeto
 
Programação OO - Java
Programação OO - JavaProgramação OO - Java
Programação OO - Java
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Minicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e PythonMinicurso de Django - Desenvolvimento ágil web com Django e Python
Minicurso de Django - Desenvolvimento ágil web com Django e Python
 
Classe integer-float-byte-short-long-double
Classe integer-float-byte-short-long-doubleClasse integer-float-byte-short-long-double
Classe integer-float-byte-short-long-double
 
Programando em python - Classes
Programando em python -  ClassesProgramando em python -  Classes
Programando em python - Classes
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Java5
Java5Java5
Java5
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classes
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.x
 
Fj pratica04
Fj pratica04Fj pratica04
Fj pratica04
 
Java 06
Java 06Java 06
Java 06
 
Programação orientada a objetos – III
Programação orientada a objetos – IIIProgramação orientada a objetos – III
Programação orientada a objetos – III
 
09 programando em python - classes
 09   programando em python - classes 09   programando em python - classes
09 programando em python - classes
 

POO-FundamentosPOO.pdf

  • 1. Programação Orientada a Objetos Fausto Maranhão Ayres 3 Fundamentos da POO 1
  • 3. Paradigmas de Programação  Programação orientada a procedimento  Programação orientada a função  Programação orientada a lógica  Programação orientada a objeto  etc 3 fausto.ayres@gmail.com
  • 4. Abstração  Técnica para lidar com a complexidade de uma tarefa 4 Copyritght 1991 © Grady Booch fausto.ayres@gmail.com
  • 5. Abstração x Paradigma 5 fausto.ayres@gmail.com Programação Procedimental ... saldo1 = 0 saldo2 = 0 creditar(saldo1, 100) debitar(saldo1, 20) creditar(saldo2, 100) transferir(saldo2, saldo1, 50) print(saldo1) print(saldo2) Programação Orientada a Objetos ... Conta conta1 = new Conta(...) Conta conta2 = new Conta(...) conta1.creditar(100) conta1.debitar(20) conta2.creditar(100) conta2.transferir(conta1, 50) println(conta1.getSaldo()) println(conta2.getSaldo())
  • 6. Paradigma x Linguagem 6 fausto.ayres@gmail.com Linguagens Programação Fortran, Basic, Pascal, C, Cobol, Cliper ... Orientado a procedimento Smaltalk, C++, Eiffel, Lua, Delphi, VB, Python, Java, C#, PHP, JavaScript, ... Orientado a objeto
  • 8. Conceito  Uma classe é a descrição de um conjunto de coisas (objeto) do mundo real que possuem mesmos atributos (estrutura) e métodos (comportamento)  Objeto é uma instância de uma classe 8 fausto.ayres@gmail.com
  • 9. Representação do objeto a1 a2 aN Métodos Atributos objeto fausto.ayres@gmail.com são as variáveis internas são as funções internas Variável de referência 9
  • 10. Etapas do desenvolvimento O.O. 10 fausto.ayres@gmail.com Criação dos objetos Teste e aplicações Implementação das classes Usando uma linguagem orientada a objeto Modelagem das classes Especificar classes e seus relacionamentos
  • 11. Modelagem de classes (classificação) Copyritght 1991 © Grady Booch Objetos da Classe Leao Objetos da Classe Cobra Objetos da Classe Girafa fausto.ayres@gmail.com Este objeto é de qual classe ?? 11
  • 12. Exemplo 1 Implementação da classe Retangulo
  • 13.  Figura geométrica de retângulo Modelagem da classe Diagrama UML Retangulo id : int largura :double comprimento : double calcularArea() calcularPerimetro() calcularDiagonal() enquadrar() redimensionar(fator) ehQuadrado() ehEquivalente(outro) ... atributos métodos id=1 id=2 classe c l área fausto.ayres@gmail.com 13 Objetos do mundo real
  • 14. public class Retangulo { public int id; public double largura; public double comprimento; public double calcularArea(){ return largura * comprimento; } } Retangulo id largura comprimento calcularArea() Implementação de Retangulo Retangulo.java atributo método fausto.ayres@gmail.com 14 UML
  • 15. Criar objeto Retangulo r = new Retangulo(); onde: 1. o operador new faz alocação dinâmica dos atributos 2. o método construtor default da classe, inicializa os atributos numéricos do objeto com 0 3. o endereço do objeto é armazenado na variável r 15 fausto.ayres@gmail.com id:0 largura:0 comprimento:0 r Construtor sem parametro
  • 17.  Depois do objeto criado, pode-se manipular os atributos e chamar os métodos da classe Manipulação dos atributos 17 fausto.ayres@gmail.com r id:1 largura:3 comprimento:4
  • 18. Adicionando construtores na classe  Pode-se implementar vários métodos construtores com diferentes parâmetros, inclusive o construtor vazio 18 fausto.ayres@gmail.com 2 construtores
  • 20. Dica eclipse  É possível adicionar o construtor pelo eclipse: 20 fausto.ayres@gmail.com
  • 22. Chamada de métodos  Individual  Encadeada 22 fausto.ayres@gmail.com nome = teclado.nextLine().toUpperCase(); retorna String retorna String retorna String String nome; nome = teclado.nextLine(); nome = nome.toUpperCase(); retorna String double x = new Retangulo(1,3,4).calcularArea();
  • 23. Retangulo r = new Retangulo(1,2,5); System.out.println(r.calcularArea()); Chamada ao método calcularArea() 23 fausto.ayres@gmail.com public double calcularArea(){ return largura*comprimento; } 10 10 id: 1 largura: 2 comprimento: 5 r
  • 24. Declaração de Método  Os métodos se comportam como funções que recebem 0...N parâmetros e retornam (ou não) um resultado: public tipo nome (lista de 0...N parâmetros) { ... return resultado; } 24 fausto.ayres@gmail.com tipo do resultado retornado Não é necessário para o tipo void Modificador de acesso
  • 25. Exemplo de método void (sem retorno)  Executa uma tarefa sem retornar um resultado Ex: Teste Retangulo r = new Retangulo(1, 3, 5); System.out.println(r.calcularArea()); //15.0 r.enquadrar(); System.out.println(r.calcularArea()); //16.0 fausto.ayres@gmail.com 25 exiba os atributos!
  • 26. Exemplo de método boolean Teste Retangulo r; r = new Retangulo(1, 3, 3); System.out.println(r.ehQuadrado()); // true r = new Retangulo(2, 2, 7); System.out.println(r.ehQuadrado()); // false fausto.ayres@gmail.com 26
  • 27. 27 O método public String toString() Obtém os dados do objeto na forma de string Teste Retangulo r; r = new Retangulo(1, 3, 5); System.out.println(r); //r.toSring() 27 id=1 largura=3 comprimento=5 chama automaticamente toString() fausto.ayres@gmail.com
  • 28. Dica eclipse  É possível gerar toString() pelo eclipse 28 fausto.ayres@gmail.com
  • 29. Exercício 1  Implemente a classe Triangulo com:  Atributos: base e altura  Métodos: • Construtor para inicializar os 2 atributos • calcularArea() • toString()  Implemente a classe TesteTriangulo para criar um objeto Triangulo e aplicar os métodos sobre este objeto 29 fausto.ayres@gmail.com
  • 31. A variável this  Contém a referência para o objeto envolvido na chamada de método ... this objeto fausto.ayres@gmail.com 31
  • 32. Uso da variável this  É usada para distinguir um atributo do objeto de uma outra variável de mesmo nome fausto.ayres@gmail.com 32 largura parâmetro largura atributo atributo parâmetro this
  • 33. Uso da variável this  A variável this é implícita e pode ser ocultada no código-fonte. 33 fausto.ayres@gmail.com A variável this está implícita
  • 34. Ex: equivalência de área Teste Retangulo r1,r2; r1 = new Retangulo(1, 3, 3); r2 = new Retangulo(2, 2, 4.5); System.out.println(r1.ehEquivalente(r2)); // true Uso da variável this fausto.ayres@gmail.com 34 Compara a área dos dois objetos id: 1 largura: 3 comprimento: 3 this id: 2 largura: 2 comprimento: 4.5 outro r1 r2
  • 36. Sobrecarga de método  Ocorre quando um método possui mais de uma assinatura com mesmo nome public class Retangulo{ ... public void redimensionar(double fator) { largura = largura * fator; comprimento = comprimento * fator; } public void redimensionar(Retangulo objeto) { largura = objeto.largura; comprimento = objeto.comprimento; } fausto.ayres@gmail.com Assinaturas diferentes 36 número
  • 37. Sobrecarga de método Teste Retangulo r1 = new Retangulo(1, 2, 4); Retangulo r2 = new Retangulo(2, 3, 10); System.out.println(r1.calcularArea()); //8 System.out.println(r2.calcularArea()); //30 r1.redimensionar(0.5); //metade System.out.println(r1.calcularArea()); //2 r2.redimensionar(2.0); //dobro System.out.println(r2.calcularArea()); //120 r2.redimensionar(r1); //copia dados de r1 System.out.println(r2.calcularArea()); //2 fausto.ayres@gmail.com 37
  • 38. Exercício 2  Crie outro construtor de Retangulo com apenas um parâmetro, que será usado para inicializar tanto a largura quanto o comprimento. Ex: Retangulo r = new Retangulo(5); System.out.println(r.calcularArea()); //25 38 fausto.ayres@gmail.com
  • 40. 40 Acesso aos atributos públicos  Os atributos declarados como public podem ser acessados diretamente pelo programa, mas isso não é uma boa prática, pois diminui a abstração de dados.  Solução: Encapsulamento dos atributos 40 fausto.ayres@gmail.com
  • 41. Encapsulamento dos atributos  É o conceito da POO que impede o acesso direto aos atributos do objeto, visando aumentar a abstração fausto.ayres@gmail.com 41 Fonte: Use a cabeça:Java
  • 42. Modificador de acesso private  Exemplo: private impede o acesso ao atributo fora de sua classe. public class Retangulo { private double largura; private double comprimento; ... pubic static void main(...){ Retangulo r1 = new Retangulo(1,5,30); r1.largura = 8; //erro r1.comprimento = 10; //erro System.out.println(r1.largura); //erro System.out.println(r1.comprimento); //erro ... fausto.ayres@gmail.com 42
  • 43. Métodos get/set  O acesso a um atributo deve ser feito sempre que possível via getAtributo() e setAtributo() Ex: Retangulo r1 = new Retangulo(1,5,30); r1.setLargura(8); r1.setComprimento(10); System.out.println(r1.getLargura() ); System.out.println(r1.getComprimento() ); fausto.ayres@gmail.com 43
  • 44. Implementação de get/set  Retangulo public class Retangulo{ private double largura; private double comprimento; ... public double getLargura() { return this.largura; } public double getComprimento() { return this.comprimento; } public void setLargura(double largura) { this.largura=largura; } public void setComprimento(double comprimento) { this.comprimento=comprimento; } } fausto.ayres@gmail.com 44
  • 45. Dica eclipse  É possível gerar get/set através do eclipse: 45 fausto.ayres@gmail.com
  • 46. Exemplo de encapsulamento  Obter os dados internos de uma matrícula de aluno 46 fausto.ayres@gmail.com
  • 48. Outro exemplo de encapsulamento  Criar uma janela desktop 48 fausto.ayres@gmail.com
  • 49. Exercício 3  A classe Aluno:  Atributos: nome, nota1, nota2 (0 a 100)  Métodos: • Construtor para inicializar nome e as 2 notas • getMedia() retorna a média aritmética (inteira) • getSituacao(), retorna “aprovado”, “reprovado” e “final” de acordo com a media • toString()  A classe TesteAluno Aluno a1 = new Aluno(“joao”, 100, 70) ; System.out.println(a1); 49 fausto.ayres@gmail.com
  • 51. Modelagem da classe  conta de um banco digital 51 fausto.ayres@gmail.com numero cpf saldo creditar(valor) debitar(valor) transferir(valor, destino) Conta atributos métodos classe Diagrama de classe UML
  • 52. Implementação fausto.ayres@gmail.com public class Conta { private String numero; private String cpf; private double saldo; public Conta(String numero, String cpf) { this.numero = numero; this.cpf = cpf; this.saldo = 0; } public void creditar(double valor) { saldo = saldo + valor; } public void debitar(double valor) { saldo = saldo - valor; } //...demais métodos } 52 numero cpf saldo creditar(valor) debitar(valor) transferir(…) Conta construtor Atributos A variável this está implícita
  • 53. Dica eclipse  É possível inserir o construtor pelo eclipse: 53 fausto.ayres@gmail.com O saldo deve ser inicializado com 0
  • 54. 54 Criar objeto public class TesteConta{ public static void main (String[] args) { Conta conta1 = new Conta(“101”,”123456”); conta1.creditar(300.0); conta1.debitar(100.0); conta1.creditar(200.0); System.out.println(conta1.getSaldo()); //400 } } 54 fausto.ayres@gmail.com numero:“101” cpf:“123456” saldo:400.0 conta1
  • 55. Chamada ao método creditar  O método creditar modifica o atributo saldo 55 fausto.ayres@gmail.com public void creditar(double valor){ saldo = saldo + valor; } conta1.creditar(300); numero:“101” cpf:“123456” saldo:300.0 conta1 Teste: saldo = 0 + 300
  • 56. conta1.creditar(300); Chamada ao método creditar fausto.ayres@gmail.com conta1 “101” “123456” 0 “101” “123456” 300 56 conta1 depois Modificou o saldo antes
  • 57. Chamada ao método debitar  O método debitar modifica o atributo saldo 57 fausto.ayres@gmail.com public void debitar(double valor){ saldo = saldo - valor; } conta1.debitar(200); numero:“101” cpf:“123456” saldo:100.0 conta1 objeto após debitar Teste: saldo = 300 - 200
  • 58. 58 método toString Converter o objeto para uma string 58 System.out.println(conta1); numero=101 cpf=123456 saldo=100 numero:“101” cpf:“123456” saldo:100.0 conta1 fausto.ayres@gmail.com
  • 59. Exercicio 4  Implemente o método vazia() na classe Conta que retorna true se o saldo estiver 0 59 fausto.ayres@gmail.com public class TesteConta{ public static void main (String[] args) { Conta conta1 = new Conta(“333”,”123456”); conta1.creditar(300.0); conta1.debitar(100.0); conta1.creditar(200.0); ... conta1.debitar(400.0); System.out.println(conta1.vazia()); //true } }
  • 60. Uso da variável this fausto.ayres@gmail.com ... public void transferir(double valor, Conta destino) { this.debitar(valor); destino.creditar(valor); } conta1.transferir(100, conta2) ... .... conta1 conta2 60 objeto Conta Teste
  • 61. Uso da variável this fausto.ayres@gmail.com ... public void transferir(double valor, Conta destino) { this.debitar(valor); destino.creditar(valor); } conta2.transferir(50, conta1) ... .... conta1 conta2 61 objeto Conta Teste
  • 63. Visibilidade de atributos e métodos  Os atributos e métodos podem ser declarados em qualquer lugar dentro da classe, pois são acessíveis em qualquer lugar da classe Ex: 63 fausto.ayres@gmail.com public class Conta { public void creditar(double valor) {...} public Conta(String n, String c) {...} public String numero; public String cpf; public void debitar(double valor) {...} public double saldo; ... }
  • 64. Inicialização default dos atributos  Antes de executar o construtor, a JVM inicializa automaticamente todos os atributos do objeto com os seguintes valores default:  Entretanto, pode-se inicializar manualmente fausto.ayres@gmail.com int 0 double 0.0 boolean false String null (qualquer classe) public class Conta { public String numero; public String cpf; public double saldo = 1000.0; ... 64 Inicialização pode ser feita aqui ou dentro do construtor
  • 65. Argumentos variáveis (varargs)  Pode-se chamar um método com quantidade variável de argumentos  Para tanto, o método deve ter o parâmetro declarado com a expressão “tipo...” O parâmetro lista é um array 65 fausto.ayres@gmail.com public class Conta { ... public void creditar(double... lista) { for(double valor : lista) saldo = saldo + valor; } conta1.creditar(100.0); //1 conta1.creditar(200.0, 50.0); //2 conta1.creditar(100.0, 300.0, 100.0);//3
  • 66. Tipos de modificadores de acesso  Java possui 4 modificadores de acesso que determinam a forma de acesso a um atributo ou método: 66 fausto.ayres@gmail.com Permite acesso Modificador apenas dentro da própria classe private em qualquer classe public apenas na herança de classe protected apenas dentro de um mesmo package (package private) “ausente”
  • 67. Documentação HTML das classes 67 fausto.ayres@gmail.com Escolha o projeto Pasta destino selecione javadoc.exe São gerados arquivos HTML e o index.html
  • 68. Exercício 5  Crie a classe AlunoFlex, considerando  que o aluno possui várias notas (double... notas)  que o construtor vai receber uma quantidade indeterminada de notas, além do nome  Adaptar os demais métodos de Aluno Teste AlunoFlex a1 = new AlunoFlex(“joao”, 100, 70) ; AlunoFlex a2 = new AlunoFlex(“maria”, 90, 50, 70, 80) ; System.out.println(a1); System.out.println(a2); 68 fausto.ayres@gmail.com
  • 69. Ciclo de vida dos objetos
  • 70. Ciclo de vida de um objeto 1. Instanciação: o objeto é criado na memória e passa a ser referenciado por uma variável de referência; 2. Uso: manipulamos o objeto através de seus métodos 3. Destruição: quando o objeto não é mais referenciado (acessível) ele torna-se elegível para a coleta de lixo Coletor de Lixo: serviço que limpa a memória ocupada pelos objetos inacessíveis (quando necessário) fausto.ayres@gmail.com 70
  • 71. Esquema 71 fausto.ayres@gmail.com Retangulo r; new Retangulo(1,5,30); r = new Retangulo(5,30); r.setLargura(10); r = null; Instanciação (cria referência) Destruição (descarta referência) r 30 5 r inacessível 30 10 O objeto está elegível para a coleta de lixo Atribuição (guarda referência) Uso (acessa referência) Declaração da variável de referência (não existe objeto ainda) acessível
  • 72.  O trecho de abaixo cria 10 objetos e descarta 9 Retangulo r1 = null; for(int i=1; i<=10; i++){ r1 = new Retangulo(i,i,i); //cria dez objetos System.out.println(r1.calcularArea()); } System.out.println(r1.getId()); // 10  No final do loop, apenas o último objeto (id=10) permanece na variável r1.  Onde estão os 9 primeiros objetos descartados?  Resposta: no lixo! Exemplo 72 fausto.ayres@gmail.com
  • 73. Criação e descarte dos objetos 73 fausto.ayres@gmail.com 1 2 3 4 7 6 5 8 9 r1 Os 9 primeiros objetos se tornaram inacessíveis e foram para a coleta de lixo 10 O décimo objeto permanece na memória e acessível por r1 for . . . Sequência de criação e descarte dos objetos
  • 74. Várias variáveis para um objeto  Pode-se ter várias referências para um objeto r1 Retangulo r1,r2,r3; r1 = new Retangulo(1,5,30); r2=r1; r3=r1; r3.setLargura(7); r2.setLargura(8); ...println(r1.calcularArea()); //240 ...println(r2.calcularArea()); //240 ...println(r3.calcularArea()); //240 r2 r3 3 variáveis 1 objeto largura 5 7 8 Comprimento 30 74 fausto.ayres@gmail.com
  • 75. Exemplo  Quantos objetos foram instanciados? 2  Quais objetos foram para a coleta de lixo? nenhum Retangulo r1,r2,r3; r1 = new Retangulo(1, 5,30); r2 = new Retangulo(2, 10,10); r3=r2; r2=r1; r1=null; fausto.ayres@gmail.com 75 1, 5 , 30 2, 10 , 10 r2 r1 r3
  • 76. Exemplo  Quantos objetos foram instanciados? 2  Quais objetos foram para a coleta de lixo? Id=2 Retangulo r1,r2,r3; r1 = new Retangulo(1,5,30); r2 = new Retangulo(2,10,10); r3=r2; r2=r1; r3=null; fausto.ayres@gmail.com 76 1, 5 , 30 2, 10 , 10 r2 r1 r3 Vai p/ lixo
  • 77. Exemplo  Quantos objetos foram instanciados? 2  Quais objetos foram para a coleta de lixo? id=1 Retangulo r1; r1 = new Retangulo(1,5,30); r1 = new Retangulo(2,10,10); fausto.ayres@gmail.com 77 1, 5 , 30 2, 10 , 10 r1 Vai p/ lixo