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/