Orientação a objetos básica - Informática

Propaganda
Desenvolvimento OO com Java
Orientação a objetos
básica
Vítor E. Silva Souza
([email protected])
http://www.inf.ufes.br/~vitorsouza
Departamento de Informática
Centro Tecnológico
Universidade Federal do Espírito Santo
Licençaparausoedistribuição
• EsteobraestálicenciadacomumalicençaCreative
Commons Atribuição-CompartilhaIgual 4.0Internacional;
• Vocêtemodireitode:
– Compartilhar:copiareredistribuiromaterialem
qualquersuporteouformato
– Adaptar:remixar,transformar,ecriarapartirdo
materialparaqualquerfim,mesmoquecomercial.
• Deacordocomostermosseguintes:
– Atribuição:vocêdevedarocréditoapropriado,proverumlinkpara
alicençaeindicarsemudançasforamfeitas.Vocêdevefazê-loem
qualquercircunstânciarazoável,masdemaneiraalgumaquesugira
aolicencianteaapoiarvocêouoseuuso;
– CompartilhaIgual:sevocêremixar,transformar,oucriarapartirdo
material,temdedistribuirassuascontribuiçõessobamesma
licençaqueooriginal.
Mais informações podem ser encontradas em:
http://creativecommons.org/licenses/by-sa/4.0/
Março2016
OO&Java- Orientaçãoaobjetosbásica
2
Conteúdodocurso
• OqueéJava;
• Variáveisprimitivase
controledefluxo;
• Orientaçãoaobjetos
básica;
• Umpoucodevetores;
• Modificadoresdeacesso
eatributosdeclasse;
• Herança,reescritae
polimorfismo;
• Classesabstratas;
• Interfaces;
• Exceçõesecontrolede
erros;
• UtilitáriosdaAPIJava.
EstesslidesforambaseadosnaapostiladocursoFJ-11:Javae
OrientaçãoaObjetosdaCaelum ena apostila Programação
Orientada aObjetos em Javadoprof.Flávio MiguelVarejão.
Março2016
OO&Java- Orientaçãoaobjetosbásica
3
Questão deresponsabilidade
• Imagineumsistema...
– Dezenas deformulários;
– CPFssão validados – função validar(cpf) deve ser
chamada em cada formulário;
– Todos osdesenvolvedoressão responsáveis!
– Define-seque idade deve ser >=18.Validação
simples(umif),masonde adicioná-la?
• Procedural:responsabilidade espalhada;
• OO:responsabilidade concentrada,polimorfismo.
Março2016
OO&Java- Orientaçãoaobjetosbásica
4
Classeseobjetos
• DesdeAristótelesqueoserhumanoclassifica os
objetos domundo;
• Juntamosobjetoscommesmascaracterísticas em
categorias quechamamosde“classes”:
– Todasascontasdebanco temumsaldo,mascada
contapodeterumsaldodiferente;
– Todasascontasdebanco podemsofrerdepósitos ou
seremencerradas.
• Classes sãousadasporlinguagensOOparamodelar
tiposcompostos.Sãomodelosabstratos quedefinem
osobjetos daclasse.
Março2016
OO&Java- Orientaçãoaobjetosbásica
5
Classeseobjetos
Classes são projetos /
especificações
Objetos são instâncias
de verdade
Homo Sapiens
Um ser humano
Receita de bolo
Um bolo feito com a receita
Planta de uma casa
Uma casa construída a partir da
planta
Definem um conjunto de
características e
comportamentos comuns.
Março2016
Possuem valores para as
características (olhos verdes,
calda de chocolate, cor azul) e
podem realizar o comportamento
(correr, ser comido, abrir a porta)
OO&Java- Orientaçãoaobjetosbásica
6
Definiçãodeumaclasse
• Usodapalavrareservadaclass;
• Significado:“segueabaixoaespecificação decomo
objetosdestetipodevemsecomportar”;
class NomeDaClasse {
/* Especificação da classe vai aqui. */
}
• Depois dedefinidaaclasse,podemosdefinirvariáveis
(referências)ecriarobjetos:
NomeDaClasse obj = new NomeDaClasse();
Março2016
OO&Java- Orientaçãoaobjetosbásica
7
Membrosdaclasse
• Umaclassepodeterdois tiposdemembro:
– Variáveis (emjargãoOO:“atributos”);
– Funções (emjargãoOO:“métodos”).
• Atributossãocomopartes deumtipocomposto;
• Métodossãofunções quesãoexecutadasnocontexto
deumaclasse/objeto.
Março2016
OO&Java- Orientaçãoaobjetosbásica
8
Atributos
• Definidoscomovariáveis noescopodaclasse:
class Conta {
int numero;
String dono;
double saldo;
double limite;
// ...
}
Repare que as variáveis não são declaradas dentro de um
bloco de função, mas diretamente no bloco da classe.
Março2016
OO&Java- Orientaçãoaobjetosbásica
9
Atributos
• Acessoviaoperador deseleção (“.”):
class Programa {
public static void main(String[] args) {
Conta minhaConta;
minhaConta = new Conta();
minhaConta.dono = "Duke";
minhaConta.saldo = 1000.0;
System.out.println("Saldo: " + minhaConta.saldo);
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
10
Métodos
• Ummétodo éumafunçãoqueoperanocontexto de
umaclasse (mensagemqueoobjetorecebe);
• É amaneira (método)desefazer algo num objeto:
class Conta {
// Atributos já declarados...
void sacar(double qtd) {
double novoSaldo = this.saldo - qtd;
this.saldo = novoSaldo;
}
void depositar(double qtd) {
this.saldo += qtd;
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
11
Métodos
Não retorna valor.
Argumento(s)
Variável local
class Conta {
// Atributos já declarados...
void sacar(double qtd) {
double novoSaldo = this.saldo - qtd;
this.saldo = novoSaldo;
}
void depositar(double qtd) {
this.saldo += qtd;
}
}
Atributo (neste caso,
this é opcional)
Março2016
OO&Java- Orientaçãoaobjetosbásica
12
Métodos
• E/Invocação também viaoperador deseleção (“.”):
class Programa {
public static void main(String[] args) {
Conta minhaConta = new Conta();
minhaConta.dono = "Duke";
minhaConta.saldo = 1000;
minhaConta.sacar(200);
minhaConta.depositar(500);
// Saldo: 1300.0
System.out.println("Saldo: " + minhaConta.saldo);
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
13
Métodos
• Ummétodo pode retornar umvalor:
class Conta {
// Atributos já declarados...
boolean sacar(double qtd) {
if (saldo < qtd) return false;
saldo = saldo - qtd;
return true;
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
14
Umaclasse,múltiplas instâncias
• Podemos criar quantos objetos quisermos…
class Programa {
public static void main(String[] args) {
Conta minhaConta = new Conta();
minhaConta.saldo = 1000;
if (minhaConta.sacar(2000))
System.out.println("Consegui");
else System.out.println("Não deu...");
Conta meuSonho = new Conta();
meuSonho.saldo = 1_000_000_000.0;
// Usando a mesma referência.
minhaConta = new Conta();
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
15
ManipulaçãodeobjetosemJava
• EmJavatrabalhamoscomreferências paraobjetos,ao
contrário deC++ (manipulaçãodiretaouponteiros);
• Analogia:
– ATVéoobjeto;
– Ocontroleéareferência;
– Vocêsócarrega areferência;
– Areferênciapodeexistir semoobjeto.
Março2016
OO&Java- Orientaçãoaobjetosbásica
16
Referência eobjeto
public class Coordenadas {
int x;
int y;
int z;
public static void main(String[] args) {
Coordenadas coord; // Só a referência.
// Não dá pra fazer nada...
// Agora temos um objeto, podemos usá-lo.
coord = new Coordenadas();
coord.x = 10;
coord.y = 15;
coord.z = 18;
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
17
Atribuiçãodevalores
• Quandorealizamosumaatribuição:
x = y;
• Javafazacópia dovalor davariáveldadireitaparaa
variáveldaesquerda;
– Paratiposprimitivos,issosignificaquealterações em
x nãoimplicamalteraçõesemy;
– Paraobjetos,comooqueécopiadoéareferência
paraomesmoobjeto,alterações noobjetoquex
referenciaaltera oobjetoquey referencia,poiséo
mesmo objeto!
Março2016
OO&Java- Orientaçãoaobjetosbásica
18
Atribuiçãodevaloresprimitivos
int x = 10;
int y = x;
y = 20;
Março2016
OO&Java- Orientaçãoaobjetosbásica
19
Atribuiçãodeobjetos
Coordenada c1;
c1 = new Coordenada();
c1.x = 10;
c1.y = 20;
c1.z = 30;
Coordenada c2;
// Erro comum:
// c2 = new Coordenada();
c2 = c1;
Março2016
OO&Java- Orientaçãoaobjetosbásica
20
Atribuiçãodeobjetos
c2.x = 50;
Tenha sempre em mente a diferença entre
um tipo primitivo e um objeto (referência).
”É parecido com um ponteiro, porém você
não pode manipulá-lo como um número e
nem utilizá-lo para aritmética, ela é
tipada.” (Caelum FJ-11)
Março2016
OO&Java- Orientaçãoaobjetosbásica
21
Comparações entreobjetos
public class Comparacoes {
public static void main(String[] args) {
Coordenadas c1 = new Coordenadas();
c1.x = 10; c1.y = 15; c1.z = 20;
Coordenadas c2 = new Coordenadas();
c2.x = 10; c2.y = 15; c2.z = 20;
// O que imprime?
System.out.println(c1 == c2);
}
}
false
Março2016
OO&Java- Orientaçãoaobjetosbásica
22
Comparações entreobjetos
public class Comparacoes {
public static void main(String[] args) {
Coordenadas c1 = new Coordenadas();
c1.x = 10; c1.y = 15; c1.z = 20;
Coordenadas c2 = c1;
c2.x = 11; c2.y = 16; c2.z = 21;
// O que imprime?
System.out.println(c1 == c2);
}
}
true
Março2016
OO&Java- Orientaçãoaobjetosbásica
23
Métodos==funções declasse
• Métodos são funções que executam nocontexto de
uma classe:
class Conta { //...
boolean transferir(Conta destino, double qtd) {
if (! this.sacar(qtd)) return false;
destino.depositar(qtd);
return true;
}
public static void main(String[] args) {
// Copie aqui minhaConta e meuSonho do slide 15.
meuSonho.transferir(minhaConta, 1_000_000);
}
}
O destino é minhaConta,
mas e a origem?
Março2016
OO&Java- Orientaçãoaobjetosbásica
24
Armazenamentoemmemória
Classe Conta
sacar()
depositar()
transferir()
saldo =
1_000_000_000
meuSonho
minhaConta
Março2016
saldo = 1_000
OO&Java- Orientaçãoaobjetosbásica
25
Chamandométodosemobjetos
• Ocódigo compiladodosmétodosficanaáreade
memória daclasse;
• Sendoassim,comoJavasabe emqualobjeto estou
chamandoumdeterminadométodo?
class Num {
int i = 5;
void somar(int j) { i += j; }
}
public class Teste
public static void main(String[] args) {
Num m = new Num(), n = new Num();
m.somar(10); n.somar(5);
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
26
Chamandométodosemobjetos
• Internamente écomoseométodo fosse:
// Imagina uma "função global", como em C:
void somar(Num this, int j) {
this.i += j;
}
• Eachamada fosse:
// Como chamaríamos a função em programação estruturada.
somar(m, 10);
somar(n, 5);
Março2016
OO&Java- Orientaçãoaobjetosbásica
27
Apalavrareservadathis
• Javafazestatransformação paravocê,deformaqueo
objetoque“recebeuamensagem”estádisponível pela
palavra-chavethis:
class Num {
int i = 5;
void somar(int j) { this.i += j; }
}
• Não énecessáriousarthis quandoacessamos
membrosdoobjetodedentro domesmo(comono
exemploacima).
Março2016
OO&Java- Orientaçãoaobjetosbásica
28
Apalavrareservadathis
• this podeserusadoparadiferenciar umatributo do
objetodeumparâmetro dométodo:
class Num {
int i = 5;
void somar(int i) { this.i += i; }
}
• Nestecaso,othis énecessário!
Março2016
OO&Java- Orientaçãoaobjetosbásica
29
Apalavrareservadathis
class Num {
int i = 5;
Num somar(int j) {
i += j;
return this; // Aqui, this é útil!
}
}
public class Teste
public static void main(String[] args) {
Num m = new Num();
m.somar(10).somar(5).somar(1);
System.out.println(m.i); // 21
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
30
Valoresdefault paraatributos
• Umatributopodeserinicializado:
class Conta {
int numero;
String dono;
double saldo;
double limite
}
// 0
// null
// 0.0
= 1000.0;
• Quandonão inicializamosexplicitamente,umvalor
default éatribuídoaele:
Tipo
Valor
Tipo
Valor
boolean
false
int
0
char
’\u0000'
long
0l
byte
(byte) 0
float
0.0f
short
(short) 0
double
0.0
Março2016
OO&Java- Orientaçãoaobjetosbásica
31
Implementando associações entreclasses
• Atributos podem ser referências paraobjetos deoutras
classes(ou damesma classe):
class Conta {
int numero;
double saldo;
double limite = 1000.0;
Cliente titular;
}
class Cliente {
String nome;
String sobrenome;
String cpf;
}
// ...
Março2016
OO&Java- Orientaçãoaobjetosbásica
32
Implementando associações entreclasses
• Atributos podem ser referências paraobjetos deoutras
classes(ou damesma classe):
public class Teste
public static void main(String[] args) {
Cliente larry = new Cliente();
larry.nome = "Larry";
larry.sobrenome = "Ellison";
Conta conta = new Conta();
conta.saldo = 50_400_000_000.0;
conta.titular = larry;
// Navegando no grafo de objetos...
System.out.println(conta.titular.nome);
}
}
Março2016
OO&Java- Orientaçãoaobjetosbásica
33
Ovalornull
• Ovalordefault parareferências (objetos)énull;
• Um“objetonulo”éumareferênciaquenãoaponta
paranenhum objeto;
• Usar umareferêncianulacomoseelaapontassepara
umobjetocausa NullPointerException.
public class Teste
public static void main(String[] args) {
Conta conta = new Conta();
conta.saldo = 50_400_000_000.0;
System.out.println(conta.titular.nome);
}
}
// Exception in thread "main"
// java.lang.NullPointerException
Março2016
OO&Java- Orientaçãoaobjetosbásica
34
Valoresdefaultparavariáveis locais
• Variáveislocais nãosão“zeradas”automaticamentee
geramerros decompilaçãoseutilizadas semvalor:
public class Teste
public static void main(String[] args) {
Cliente larry;
Conta conta = new Conta();
conta.saldo = 50_400_000_000.0;
conta.titular = larry;
System.out.println(conta.titular.nome);
}
}
// error: variable larry might not have been initialized
//
conta.titular = larry;
//
^
Março2016
OO&Java- Orientaçãoaobjetosbásica
35
Exercitar é fundamental
• ApostilaFJ-11daCaelum:
– Seção 4.12,página 51(classFuncionario);
– Seção 4.13,página 55(recursividade /Fibonacci);
– Seção 4.14,página 56(fixando oconhecimento).
Março2016
OO&Java- Orientaçãoaobjetosbásica
36
http://nemo.inf.ufes.br/
Download