Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Desenvolvimento OO com Java
Orientação a objetosbá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
CommonsAtribuição-CompartilhaIgual 4.0Internacional;• Vocêtemodireitode:
– Compartilhar:copiareredistribuiromaterialemqualquersuporteouformato
– Adaptar:remixar,transformar,ecriarapartirdomaterialparaqualquerfim,mesmoquecomercial.
• Deacordocomostermosseguintes:– Atribuição:vocêdevedarocréditoapropriado,proverumlinkpara
alicençaeindicarsemudançasforamfeitas.Vocêdevefazê-loemqualquercircunstânciarazoável,masdemaneiraalgumaquesugiraaolicencianteaapoiarvocêouoseuuso;
– CompartilhaIgual:sevocêremixar,transformar,oucriarapartirdomaterial,temdedistribuirassuascontribuiçõessobamesmalicençaqueooriginal.
Março2016 OO&Java- Orientaçãoaobjetosbásica 2
Mais informações podem ser encontradas em:http://creativecommons.org/licenses/by-sa/4.0/
Conteúdodocurso
• OqueéJava;• Variáveisprimitivasecontroledefluxo;
• Orientaçãoaobjetosbásica;
• Umpoucodevetores;• Modificadoresdeacessoeatributosdeclasse;
• Herança,reescritaepolimorfismo;
• Classesabstratas;• Interfaces;• Exceçõesecontroledeerros;
• UtilitáriosdaAPIJava.
Março2016 OO&Java- Orientaçãoaobjetosbásica 3
EstesslidesforambaseadosnaapostiladocursoFJ-11:JavaeOrientaçãoaObjetosdaCaelum ena apostila ProgramaçãoOrientada aObjetos em Javadoprof.FlávioMiguelVarejão.
Questão deresponsabilidade• Imagineumsistema...
– Dezenas deformulários;– CPFssão validados – função validar(cpf) deve serchamada em cada formulário;
– Todos osdesenvolvedoressão responsáveis!– Define-seque idade deve ser >=18.Validaçãosimples(umif),masonde adicioná-la?
• Procedural:responsabilidade espalhada;• OO:responsabilidade concentrada,polimorfismo.
Março2016 OO&Java- Orientaçãoaobjetosbásica 4
Classeseobjetos• DesdeAristótelesqueoserhumanoclassifica osobjetos domundo;
• Juntamosobjetoscommesmascaracterísticas emcategorias quechamamosde“classes”:– Todasascontasdebanco temumsaldo,mascadacontapodeterumsaldodiferente;
– Todasascontasdebanco podemsofrerdepósitos ouseremencerradas.
• Classes sãousadasporlinguagensOOparamodelartiposcompostos.Sãomodelosabstratos quedefinemosobjetos daclasse.
Março2016 OO&Java- Orientaçãoaobjetosbásica 5
Classeseobjetos
Classes são projetos / especificações
Objetos são instânciasde 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
Março2016 OO&Java- Orientaçãoaobjetosbásica 6
Definem um conjunto de características e comportamentos comuns.
Possuem valores para as características (olhos verdes, calda de chocolate, cor azul) e podem realizar o comportamento(correr, ser comido, abrir a porta)
Definiçãodeumaclasse• Usodapalavrareservadaclass;• Significado:“segueabaixoaespecificação decomoobjetosdestetipodevemsecomportar”;
• Depois dedefinidaaclasse,podemosdefinirvariáveis(referências)ecriarobjetos:
Março2016 OO&Java- Orientaçãoaobjetosbásica 7
class NomeDaClasse {/* Especificação da classe vai aqui. */
}
NomeDaClasse obj = new NomeDaClasse();
Membrosdaclasse• Umaclassepodeterdois tiposdemembro:
– Variáveis (emjargãoOO:“atributos”);– Funções (emjargãoOO:“métodos”).
• Atributossãocomopartes deumtipocomposto;• Métodossãofunções quesãoexecutadasnocontextodeumaclasse/objeto.
Março2016 OO&Java- Orientaçãoaobjetosbásica 8
Atributos• Definidoscomovariáveis noescopodaclasse:
Março2016 OO&Java- Orientaçãoaobjetosbásica 9
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.
Atributos• Acessoviaoperador deseleção (“.”):
Março2016 OO&Java- Orientaçãoaobjetosbásica 10
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);}
}
Métodos• Ummétodo éumafunçãoqueoperanocontexto deumaclasse (mensagemqueoobjetorecebe);
• É amaneira (método)desefazer algo num objeto:
Março2016 OO&Java- Orientaçãoaobjetosbásica 11
class Conta {// Atributos já declarados...
void sacar(double qtd) {double novoSaldo = this.saldo - qtd;this.saldo = novoSaldo;
}
void depositar(double qtd) {this.saldo += qtd;
}}
Métodos
Março2016 OO&Java- Orientaçãoaobjetosbásica 12
class Conta {// Atributos já declarados...
void sacar(double qtd) {double novoSaldo = this.saldo - qtd;this.saldo = novoSaldo;
}
void depositar(double qtd) {this.saldo += qtd;
}}
Não retorna valor. Argumento(s) Variável local
Atributo (neste caso, this é opcional)
Métodos• E/Invocação também viaoperador deseleção (“.”):
Março2016 OO&Java- Orientaçãoaobjetosbásica 13
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.0System.out.println("Saldo: " + minhaConta.saldo);
}}
Métodos• Ummétodo pode retornar umvalor:
Março2016 OO&Java- Orientaçãoaobjetosbásica 14
class Conta {// Atributos já declarados...
boolean sacar(double qtd) {if (saldo < qtd) return false;
saldo = saldo - qtd;return true;
}}
Umaclasse,múltiplas instâncias• Podemos criar quantos objetos quisermos…
Março2016 OO&Java- Orientaçãoaobjetosbásica 15
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();
}}
ManipulaçãodeobjetosemJava• EmJavatrabalhamoscomreferências paraobjetos,aocontrá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
Março2016 OO&Java- Orientaçãoaobjetosbásica 17
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;
}}
Atribuiçãodevalores• Quandorealizamosumaatribuição:
• Javafazacópia dovalor davariáveldadireitaparaavariáveldaesquerda;– Paratiposprimitivos,issosignificaquealterações emx nãoimplicamalteraçõesemy;
– Paraobjetos,comooqueécopiadoéareferênciaparaomesmoobjeto,alterações noobjetoquexreferenciaaltera oobjetoquey referencia,poiséomesmo objeto!
Março2016 OO&Java- Orientaçãoaobjetosbásica 18
x = y;
Atribuiçãodevaloresprimitivos
Março2016 OO&Java- Orientaçãoaobjetosbásica 19
int x = 10;
int y = x;
y = 20;
Atribuiçãodeobjetos
Março2016 OO&Java- Orientaçãoaobjetosbásica 20
Coordenada c1;c1 = new Coordenada();c1.x = 10;c1.y = 20;c1.z = 30;
Coordenada c2;
// Erro comum:// c2 = new Coordenada();
c2 = c1;
Atribuiçãodeobjetos
Março2016 OO&Java- Orientaçãoaobjetosbásica 21
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)
Comparações entreobjetos
Março2016 OO&Java- Orientaçãoaobjetosbásica 22
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
Comparações entreobjetos
Março2016 OO&Java- Orientaçãoaobjetosbásica 23
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
Métodos==funções declasse• Métodos são funções que executam nocontexto deuma classe:
Março2016 OO&Java- Orientaçãoaobjetosbásica 24
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?
Armazenamentoemmemória
Março2016 OO&Java- Orientaçãoaobjetosbásica 25
Classe Conta
sacar()depositar()transferir()
saldo = 1_000_000_000
saldo = 1_000
meuSonhominhaConta
Chamandométodosemobjetos• Ocódigo compiladodosmétodosficanaáreadememória daclasse;
• Sendoassim,comoJavasabe emqualobjeto estouchamandoumdeterminadométodo?
Março2016 OO&Java- Orientaçãoaobjetosbásica 26
class Num {int i = 5;void somar(int j) { i += j; }
}public class Testepublic static void main(String[] args) {
Num m = new Num(), n = new Num();m.somar(10); n.somar(5);
}}
Chamandométodosemobjetos• Internamente écomoseométodo fosse:
• Eachamada fosse:
Março2016 OO&Java- Orientaçãoaobjetosbásica 27
// Como chamaríamos a função em programação estruturada.somar(m, 10);somar(n, 5);
// Imagina uma "função global", como em C:void somar(Num this, int j) { this.i += j;
}
Apalavrareservadathis• Javafazestatransformação paravocê,deformaqueoobjetoque“recebeuamensagem”estádisponível pelapalavra-chavethis:
• Não énecessáriousarthis quandoacessamosmembrosdoobjetodedentro domesmo(comonoexemploacima).
Março2016 OO&Java- Orientaçãoaobjetosbásica 28
class Num {int i = 5;void somar(int j) { this.i += j; }
}
Apalavrareservadathis• this podeserusadoparadiferenciar umatributo doobjetodeumparâmetro dométodo:
• Nestecaso,othis énecessário!
Março2016 OO&Java- Orientaçãoaobjetosbásica 29
class Num {int i = 5;void somar(int i) { this.i += i; }
}
Apalavrareservadathis
Março2016 OO&Java- Orientaçãoaobjetosbásica 30
class Num {int i = 5;Num somar(int j) {
i += j;return this; // Aqui, this é útil!
}}public class Testepublic static void main(String[] args) {
Num m = new Num();m.somar(10).somar(5).somar(1);System.out.println(m.i); // 21
}}
Valoresdefault paraatributos• Umatributopodeserinicializado:
• Quandonão inicializamosexplicitamente,umvalordefault éatribuídoaele:
Março2016 OO&Java- Orientaçãoaobjetosbásica 31
class Conta {int numero; // 0String dono; // nulldouble saldo; // 0.0double limite = 1000.0;
}
Tipo Valorboolean false
char ’\u0000'
byte (byte) 0
short (short) 0
Tipo Valorint 0
long 0l
float 0.0f
double 0.0
Implementando associações entreclasses• Atributos podem ser referências paraobjetos deoutrasclasses(ou damesma classe):
Março2016 OO&Java- Orientaçãoaobjetosbásica 32
class Conta {int numero;double saldo;double limite = 1000.0;Cliente titular;
}
class Cliente {String nome;String sobrenome;String cpf;
}
// ...
Implementando associações entreclasses• Atributos podem ser referências paraobjetos deoutrasclasses(ou damesma classe):
Março2016 OO&Java- Orientaçãoaobjetosbásica 33
public class Testepublic 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);
}}
Ovalornull• Ovalordefault parareferências (objetos)énull;• Um“objetonulo”éumareferênciaquenãoapontaparanenhumobjeto;
• Usar umareferêncianulacomoseelaapontasseparaumobjetocausa NullPointerException.
Março2016 OO&Java- Orientaçãoaobjetosbásica 34
public class Testepublic 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
Valoresdefaultparavariáveis locais• Variáveislocais nãosão“zeradas”automaticamenteegeramerros decompilaçãoseutilizadas semvalor:
Março2016 OO&Java- Orientaçãoaobjetosbásica 35
public class Testepublic 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;// ^
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/