Baixe o app para aproveitar ainda mais
Prévia do material em texto
Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 1 Centro Paula Sousa Orientação a objetos com java Celio Assunção Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 2 1.1. Introdução 07 1.2. Breve história do Java 07 1.3. Java Virtual Machine 08 1.4. Java lento? Hotspot e JIT 09 1.5. Bibliotecas de classes 09 1.6. Linguagens 10 1.7. Plataformas similares 10 2.1 Algoritmo e Implementação 10 2.2 Compilando o primeiro programa 11 2.3 Exercícios: Modificando o Hello World 12 3.1 Variáveis primitivas e Controle de fluxo 12 3.2 Outros tipos primitivos 14 3.3 Exercícios: Variáveis e tipos primitivos 14 4.1 O If-Else 14 4.2 O laço While 15 4.3 O laço For 15 4.4 Escopo das variáveis 17 4.5 Exercícios: Fixação de sintaxe 18 5.1 Orientação a objetos básica 21 5.2 Exercícios 24 5.3 Classes 24 5.4 Exercícios classes e subclasses 24 5.5 Classes, Atributos e Métodos 25 5.6 Objetos são acessados por referências 26 5.7 O Método transfere() 27 5.8 Para saber mais: Uma Fábrica de Carros 28 5.9 Exercícios: Orientação a Objetos 31 5.10 Exercício de fixação 32 6.1 Construção De Programas Em Java 36 6.2 Métodos Construtores e Overloading 37 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 3 6.3 Utilização das API’s 39 6.4 Utilizando gestores de erro 39 6.5 Entrada dados com GET 40 6.6 Conceito De Pacote 41 6.7 Métodos: Públicos, Privados E Protegidos 41 6.8 Exercícios de fixação 41 6.9 Chamando método de outra classe 42 6.10 Passando valores por parâmetro 42 6.11 Função retorna valores 42 6.12 Usando o conceito de pacote 44 6.13 Desafio 44 6.14 Fixando o conhecimento 45 7.1. Programação orientada a objetos 46 7.2. Criando nova classe para Vendas 46 7.3. Exercício de fixação 47 7.4. Modificadores de acesso 47 7.5. Encapsulamento 50 7.6. Exemplo com encapsulamento 51 7.7. Alterando uma variável private 52 7.8. Getters e Setters 52 7.9. Construtores 54 7.10. A necessidade de um construtor 55 7.11. Exemplo usando construtor 56 7.12. Implementando vários Construtores 57 7.13. Atributos de Classe 60 7.14. Exercícios: Encapsulamento 61 8.1. Composição e Herança 62 8.2. Construindo exemplo Herança 62 8.3. Criando classe filha 64 8.4. Classe sistema void 64 8.5. Método para private 65 8.6. Exercício de fixação 67 8.7. Polimorfismo 68 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 4 8.8. Implementando polimorfismo 70 8.9. Outro exemplo polimorfismo 70 9.1. Formulários 72 9.2. Jframe setSize/setLocation 73 9.3. Jfrane setDefautCloseOperation/ setResizable 73 9.4. Manipulando cores getContentPane 74 9.5. Inserindo mais componentes 74 Dicas Eclipse 76 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 5 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 6 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 7 1.1 Introdução Plataforma Java é o nome dado ao ambiente computacional, ou plataforma, da empresa estadunidense Sun Microsystems. A plataforma permite desenvolver aplicativos utilizando qualquer uma das linguagens criadas para a plataforma Java, sendo a linguagem padrão a que leva seu próprio nome: Linguagem Java. Uma grande vantagem da plataforma é a de não estar presa a um único sistema operacional ou hardware, pois seus programas rodam através de uma máquina virtual que pode ser emulada em qualquer sistema que suporte a linguagem C++. 1.2 Breve história do Java A Sun criou um time (conhecido como Green Team) para desenvolver inovações tecnológicas em 1992. Esse time foi liderado por James Gosling, considerado o pai do Java. O time voltou com a ideia de criar um interpretador (já era uma máquina virtual, veremos o que é isso mais a frente) para pequenos dispositivos, facilitando a reescrita de software para aparelhos eletrônicos, como vídeo cassete, televisão e aparelhos de TV a cabo. A ideia não deu certo. Tentaram fechar diversos contratos com grandes fabricantes de eletrônicos, como Panasonic, mas não houve êxito devido ao conflito de interesses e custos. Hoje, sabemos que o Java domina o mercado de aplicações para celulares com mais de 2.5 bilhões de dispositivos compatíveis, porém em 1994 ainda era muito cedo para isso. Com o advento da web, a Sun percebeu que poderia utilizar a idéia criada em 1992 para rodar pequenas aplicações dentro do browser. A semelhança era que na internet havia uma grande quantidade de sistemas operacionais e browsers, e com isso seria grande vantagem poder programar numa única linguagem, independente da plataforma. Foi aí que o Java 1.0 foi lançado: focado em transformar o browser de apenas um cliente fino (thin client ou terminal burro) para uma aplicação que possa também realizar operações, não apenas renderizar html. Atualmente os applets realmente não são o foco da Sun. É curioso notar que a tecnologia Java nasceu com um objetivo em mente, foi lançado com outro, mas, no final, decolou mesmo no desenvolvimento de aplicações do lado do servidor. Sorte? Você pode ler a história da linguagem Java em: http://www.java.com/en/javahistory/ E um vídeo interessante: http://tinyurl.com/histjava Em 2009 a Oracle comprou a Sun, fortalecendo a marca. A Oracle sempre foi, junto com a IBM, uma das empresas que mais investiram e fizeram negócios através do uso da plataforma Java. No Brasil, diversos grupos de usuários se formaram para tentar disseminar o conhecimento da linguagem. Um deles é o GUJ (http://www.guj.com.br), uma comunidade virtual com artigos, tutoriais e fórum para tirar dúvidas, o maior em língua portuguesa com mais de cem mil usuários e 1 milhão de mensagens. Encorajamos todos os alunos a usar muito os fóruns do mesmo, pois é uma das melhores maneiras para achar soluções para pequenos problemas que acontecem com grande frequência. O universo Java é um vasto conjunto de tecnologias, composto por três plataformas principais que foram criadas para segmentos específicos de aplicações: • Java SE (Java Platform, Standard Edition). É a base da plataforma; inclui o ambiente de execução e as bibliotecas comuns. http://pt.wikipedia.org/wiki/Computador http://pt.wikipedia.org/wiki/Java_SE http://pt.wikipedia.org/wiki/Linguagem_C%2B%2B http://pt.wikipedia.org/wiki/Emulador http://pt.wikipedia.org/wiki/M%C3%A1quina_virtual http://pt.wikipedia.org/wiki/Hardware http://pt.wikipedia.org/wiki/Sistema_operativo http://pt.wikipedia.org/wiki/Java_(linguagem_de_programa%C3%A7%C3%A3o) http://pt.wikipedia.org/wiki/Sun_Microsystems http://pt.wikipedia.org/wiki/EUA http://pt.wikipedia.org/wiki/Plataforma_(inform%C3%A1tica) Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 8 • Java EE (Java Platform, Enterprise Edition). A edição voltada para o desenvolvimento de aplicações corporativas e para internet. • Java ME (Java Platform, Micro Edition). A edição para o desenvolvimento de aplicações para dispositivos móveis e embarcados. • JavaFX. Plataforma para desenvolvimento de aplicações multimídia em desktop/web (JavaFX Script) e dispositivos móveis (JavaFX Mobile). Tecnologias Java A plataforma Java é constituída de um grande número de tecnologias, cada uma provê uma porção distinta de todo o ambiente de desenvolvimento e execução de software. Os usuários finais, tipicamente, interagem com a máquina virtual Java (Java Virtual Machine, ou JVM) e um conjunto padrão de bibliotecas de classe. Existe um grande número de maneiras de se utilizar uma aplicação Java, incluindo applets embutidas em páginas web, aplicativos de uso geral em desktops, aplicativos em aparelhoscelulares e em servidores de aplicações para Internet. Os desenvolvedores de aplicações em Java utilizam um conjunto de ferramentas de desenvolvimento, o JDK. Um programa escrito para a plataforma Java necessita de dois componentes para ser executado: a máquina virtual Java, e um conjunto de bibliotecas de classe que disponibilizam um série de serviços para esse programa. O pacote de software que contém a máquina virtual e esta biblioteca de classes é conhecido como JRE (Java Runtime Environment). 1.3 Java Virtual Machine Em uma linguagem de programação como C e Pascal, temos a seguinte situação quando vamos compilar um programa: O código fonte é compilado para código de máquina específico de uma plataforma e sistema operacional. Muitas vezes o próprio código fonte é desenvolvido visando uma única plataforma! Esse código executável (binário) resultante será executado pelo sistema operacional e, por esse motivo, ele deve saber conversar com o sistema operacional em questão. Codigo Fonte em C Codigo Binário para Determinado SOcompilador http://pt.wikipedia.org/wiki/Java_Runtime_Environment http://pt.wikipedia.org/wiki/Java_Development_Kit http://pt.wikipedia.org/wiki/Internet http://pt.wikipedia.org/wiki/Telefone_celular http://pt.wikipedia.org/wiki/Desktop http://pt.wikipedia.org/wiki/Web http://pt.wikipedia.org/wiki/Applet http://pt.wikipedia.org/wiki/Classe http://pt.wikipedia.org/wiki/M%C3%A1quina_virtual_Java http://pt.wikipedia.org/w/index.php?title=JavaFX_Mobile&action=edit&redlink=1 http://pt.wikipedia.org/wiki/JavaFX_Script http://pt.wikipedia.org/wiki/JavaFX http://pt.wikipedia.org/wiki/Sistemas_embarcados http://pt.wikipedia.org/wiki/Java_ME http://pt.wikipedia.org/wiki/Java_EE Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 9 Isto é, temos um código executável para cada sistema operacional. É necessário compilar uma vez para Windows, outra para o Linux, e assim por diante, caso a gente queira que esse nosso software possa ser utilizado em várias plataformas. Esse é o caso de aplicativos como o OpenOffice, Firefox e outros. Como foi dito anteriormente, na maioria das vezes, a sua aplicação se utiliza das bibliotecas do sistema operacional, como, por exemplo, a de interface gráfica para desenhar as “telas”. A biblioteca de interface gráfica do Windows é bem diferente das do Linux: como criar então uma aplicação que rode de forma parecida nos dois sistemas operacionais? Precisamos reescrever um mesmo pedaço da aplicação para diferentes sistemas operacionais, já que eles não são compatíveis. Já o Java utiliza do conceito de máquina virtual, onde existe, entre o sistema operacional e a aplicação, uma camada extra responsável por “traduzir” - mas não apenas isso - o que sua aplicação deseja fazer para as respectivas chamadas do sistema operacional onde ela está rodando no momento: Dessa forma, a maneira com a qual você abre uma janela no Linux ou no Windows é a mesma: você ganha independência de sistema operacional. Ou, melhor ainda, independência de plataforma em geral: não é preciso se preocupar em qual sistema operacional sua aplicação está rodando, nem em que tipo de máquina, configurações, etc. Repare que uma máquina virtual é um conceito bem mais amplo que o de um interpretador. Como o próprio nome diz, uma máquina virtual é como um “computador de mentira": tem tudo que um computador tem. Em outras palavras, ela é responsável por gerenciar memória, threads, a pilha de execução, etc. Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM). 1.4 - Java lento? Hotspot e JIT Bytecode java Maquina Virtual java Para Linux Linux Bytecode java Maquina Virtual java Para Windows Windows Sistema Operacional Windows Codigo Binario Para Windows Linux Codigo Binario Para Linux Aplicação Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 10 Hotspot é a tecnologia que a JVM utiliza para detectar os pontos mais utilizados da sua aplicação: código que é executado muito, provavelmente dentro de um ou mais loops. Quando a JVM julgar necessário, ela vai compilar estes códigos para instruções realmente nativas, em linguagem de máquina da plataforma, tendo em vista que isso vai provavelmente melhorar a performance da sua aplicação. Esse compilador é o JIT: Just inTime Compiler, o compilador que aparece “bem na hora” que você precisa. 1.5 Bibliotecas de classes Na maioria dos sistemas operacionais modernos, um corpo formado por código reusável é organizado e disponibilizado para simplificar o trabalho do programador. Este código encontra- se, normalmente, na forma de bibliotecas dinâmicas que a aplicação utiliza durante a sua execução. Como a plataforma Java não é dependente de qualquer sistema operacional, as aplicações não podem depender das bibliotecas destes sistemas. Ao contrário, a plataforma Java disponibiliza um grande conjunto padronizado de bibliotecas de classe, que contém praticamente o mesmo número de funções encontradas nos sistemas operacionais modernos. Uma classe de biblioteca Java serve a três propósitos dentro da plataforma Java. Como outras bibliotecas padrão, elas disponibilizam ao programador um conjunto de funções bem conhecidas que realizam tarefas comuns, como a manutenção de listas de elementos ou manipulação de strings. Em adição, a biblioteca contém uma interface para tarefas que dependem do hardware e do sistema operacional. Tarefas como acesso a rede e a arquivos são altamente dependentes das capacidades nativas do ambiente. As bibliotecas java.net e java.io implementam o código necessário internamente, e disponibilizam uma interface padrão para que as aplicações Java possam executar estas tarefas. Finalmente, se alguma plataforma não suportar alguma função que uma aplicação Java necessita, as bibliotecas implementam esta funcionalidade usando os recursos disponíveis, ou disponibilizam um meio consistente para que a aplicação verifique a presença de determinada funcionalidade. 1.6Linguagens A palavra Java usualmente é uma referência a linguagem de programação Java, que é a primeira linguagem criada pela Sun Microsystems para a JVM. A segunda linguagem criada pela Sun Microsystems para a JVM é chamada de Groovy, uma linguagem mais dinâmica, inspirada em linguagens como Python, Ruby e Smalltalk. Também existem implementações para a linguagem Python, a Jython, e para a linguagem Ruby, a JRuby. 1.7 Plataformas similares O sucesso da plataforma Java e o seu conceito write once, run anywhere levaram a outros esforços similares. O mais notável destes esforços é a plataforma .NET, da Microsoft, que utilizou muitos dos conceitos e inovações da plataforma Java sem, contudo, implementar os recursos de portabilidade entre sistemas operacionais e plataformas que a plataforma Java possui 2.1- Algoritmo e Implementação Um algoritmo é uma sequência de passos que resolve algum problema ou alcança algum objetivo, . É importante salientar que um algoritmo simplesmente diz o que deve ser feito. Considere o problema de descobrir a altura da pessoa mais alta de um grupo de pessoas. Suponha Figura 2.1: Fila de pessoas que estas pessoas estão em sequência, como em uma fila de banco, e que esta fila não está vazia. http://pt.wikipedia.org/wiki/Microsoft http://pt.wikipedia.org/wiki/.Net http://pt.wikipedia.org/wiki/Ruby http://pt.wikipedia.org/wiki/Jython http://pt.wikipedia.org/wiki/Python http://pt.wikipedia.org/wiki/Smalltalk http://pt.wikipedia.org/wiki/Ruby http://pt.wikipedia.org/wiki/Python http://pt.wikipedia.org/wiki/Groovy http://pt.wikipedia.org/wiki/Sun_Microsystems http://pt.wikipedia.org/wiki/Arquivohttp://pt.wikipedia.org/wiki/Rede_de_computadores http://pt.wikipedia.org/wiki/Interface http://pt.wikipedia.org/wiki/String http://pt.wikipedia.org/wiki/Biblioteca_de_rotinas Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 11 Vamos elaborar uma estratégia para resolver este problema. Uma solução bem simples seria fazer o seguinte: 1) Pegue a altura da primeira pessoa. A única informação que você tem é que esta altura é a máxima até o momento. Então, “guarde” em algum lugar esta informação. 2) Percorra cada uma das próximas pessoas e faça o seguinte: 1) Pegue a altura da pessoa, esta é a altura atual. 2) Compare a altura atual com a máxima até o momento. Esta comparação pode resultar em três possibilidades: a altura atual é menor, é igual ou é maior. 3) Se a altura atual for maior, então faça o valor da altura máxima ser igual a atual. Será que este procedimento é bom? Nesse caso temos de percorrer todas as pessoas da fila até ter certeza que encontramos a maior pessoa, pois a única invariante que temos, a cada passo do procedimento, é que até aquele momento todas as pessoas percorridas tem tamanho igual ou menor a um determinado número. Existe solução melhor? E se tivéssemos as pessoas organizadas de alguma maneira especial, chegaríamos a solução em um menor tempo? E se houveram empates, quais outras pessoas são tão altas quanto essa nossa resposta? 2.2 - Compilando o primeiro programa Vamos para o nosso primeiro código! O programa que imprime uma linha simples. Para mostrar uma linha, podemos fazer: System.out.println("Minha primeira aplicação Java!"); Mas esse código não será aceito pelo compilador java. O Java é uma linguagem bastante burocrática, e precisa de mais do que isso para iniciar uma execução. Veremos os detalhes e os porquês durante os próximos capítulos. O mínimo que precisaríamos escrever é algo como: class MeuPrograma { public static void main(String[] args) { System.out.println("Minha primeira aplicação Java!"); } } Após digitar o código acima, grave-o como MeuPrograma.java em algum diretório. Para compilar, você deve pedir para que o compilador de Java da Sun, chamado javac, gere o bytecode correspondente ao seu código Java. Os procedimentos para executar seu programa são muito simples. O javac é o compilador Java, e o java é o responsável por invocar a máquina virtual para interpretar o seu programa. 1 class MeuPrograma { 2 public static void main(String[] args) { 3 4 // miolo do programa começa aqui! 5 System.out.println("Minha primeira aplicação Java!!"); Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 12 6 // fim do miolo do programa 7 8 } 9 } O miolo do programa é o que será executado quando chamamos a máquina virtual. Por enquanto, todas as linhas anteriores, onde há a declaração de uma classe e a de um método, não importam para nós nesse momento. Mas devemos saber que toda aplicação Java começa por um ponto de entrada, e este ponto de entrada é o método main. Ainda não sabemos o que é método, mas veremos no capítulo 4. Até lá, não se preocupe com essas declarações. Sempre que um exercício for feito, o código que nos importa sempre estará nesse miolo. 2.3 Exercícios: Modificando o Hello World 1) Altere seu programa para imprimir uma mensagem diferente. 2) Altere seu programa para imprimir duas linhas de texto usando duas linhas de código System.out. 3) Sabendo que os caracteres \n representam uma quebra de linhas, imprima duas linhas de texto usando uma única linha de código System.out. 3.1. Variáveis primitivas e Controle de fluxo Declarando e usando variáveis Dentro de um bloco, podemos declarar variáveis e usá-las. Em Java, toda variável tem um tipo que não pode ser mudado, uma vez que declarado tipoDaVariavel nomeDaVariavel; Por exemplo, é possível ter uma idade que guarda um número inteiro: int idade; Com isso, você declara a variável idade, que passa a existir a partir daquela linha. Ela é do tipo int, que guarda um número inteiro. A partir daí, você pode usá-la, primeiramente atribuindo valores. A linha a seguir é a tradução de: “idade deve valer quinze”. Idade = 15; Além de atribuir, você pode utilizar esse valor. O código a seguir declara novamente a variável idade com valor 15 e imprime seu valor na saída padrão através da chamada a System.out.println. // declara a idade int idade; idade = 15; Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 13 // imprime a idade System.out.println(idade); Por fim, podemos utilizar o valor de uma variável para algum outro propósito, como alterar ou definir uma segunda variável. O código a seguir cria uma variável chamada idadeNoAnoQueVem com valor de idade mais um. // calcula a idade no ano seguinte int idadeNoAnoQueVem; idadeNoAnoQueVem = idade + 1; No mesmo momento que você declara uma variável, também é possível inicializá-la por praticidade: int idade = 15; Você pode usar os operadores +, -, / e * para operar com números, sendo eles responsáveis pela adição, subtração, divisão e multiplicação, respectivamente. Além desses operadores básicos, há o operador % (módulo) que nada mais é que o resto de uma divisão inteira. Veja alguns exemplos: int quatro = 2 + 2; int tres = 5 – 2; int oito = 4 * 2; int dezesseis = 64 / 4; int um = 5 % 2; // 5 dividido por 2 dá 2 e tem resto 1; // o operador % pega o resto da divisão inteira Representar números inteiros é fácil, mas como guardar valores reais, tais como frações de números inteiros e outros? Outro tipo de variável muito utilizado é o double, que armazena um número com ponto flutuante (e que também pode armazenar um número inteiro). double pi = 3.14; double x = 5 * 10; O tipo boolean armazena um valor verdadeiro ou falso, e só: nada de números, palavras ou endereços, como em algumas outras linguagens. boolean verdade = true; true e false são palavras reservadas do Java. É comum que um boolean seja determinado através de uma expressão booleana, isto é, um trecho de código que retorna um booleano, como o exemplo: int idade = 30; boolean menorDeIdade = idade < 18; O tipo char guarda um, e apenas um, caractere. Esse caractere deve estar entre aspas simples. Não se esqueça dessas duas características de uma variável do tipo char! Por exemplo, ela não pode guardar um código como ” pois o vazio não é um caractere! char letra = ’a’; System.out.println(letra); Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 14 3.2. Outros tipos primitivos Vimos aqui os tipos primitivos que mais aparecem. O Java tem outros, que são o byte, short, long e float. Cada tipo possui características especiais que, para um programador avançado, podem fazer muita diferença 3.3. Exercícios: Variaveis primitivas 1) Na empresa onde trabalhamos, há tabelas com o quanto foi gasto em cada mês. Para fechar o balanço do primeiro trimestre, precisamos somar o gasto total. Sabendo que, em Janeiro, foram gastos 15000 reais, em Fevereiro, 23000 reais e em Março, 17000 reais, faça um programa que calcule e imprima o gasto total no trimestre. Siga esses passos: a) Crie uma classe chamada BalancoTrimestral com um bloco main, como nos exemplos anteriores; b) Dentro do main (o miolo do programa), declare uma variável inteira chamada gastosJaneiro e inicialize-a com 15000; c) Crie também as variáveis gastosFevereiro e gastosMarco, inicializando-as com 23000 e 17000, respectivamente, utilize uma linha para cada declaração; d) Crie uma variável chamada gastosTrimestre e inicialize-a com a soma das outras 3 variáveis: int gastosTrimestre = gastosJaneiro + gastosFevereiro + gastosMarco; e) Imprima a variável gastosTrimestre. 2) Adicione código (sem alterar as linhas quejá existem) na classe anterior para imprimir a média mensal de gasto, criando uma variável mediaMensal junto com uma mensagem. Para isso, concatene a String com o valor, usando "Valor da média mensal = "+ mediaMensal. Agora aquela perguntinha que não quer calar, Entenderam??? Durante o curso veremos outros tipos de variáveis primitivas, não se preocupem que chegaremos lá. 4.1. O if – elese A sintaxe do if no Java é a seguinte: if (condicaoBooleana) { codigo; } Uma condição booleana é qualquer expressão que retorne true ou false. Para isso, você pode usar os Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 15 operadores <, >, <=, >= e outros. Um exemplo: int idade = 15; if (idade < 18) { System.out.println("Não pode entrar"); } Além disso, você pode usar a cláusula else para indicar o comportamento que deve ser executado no caso da expressão booleana ser falsa: int idade = 15; if (idade < 18) { System.out.println("Não pode entrar"); } else { System.out.println("Pode entrar"); } Você pode concatenar expressões booleanas através dos operadores lógicos “E” e “OU”. O “E” é representado pelo && e o “OU” é representado pelo ||. Um exemplo seria verificar se ele tem menos de 18 anos e se ele não é amigo do dono: int idade = 15; boolean amigoDoDono = true; if (idade < 18 && amigoDoDono == false) { System.out.println("Não pode entrar"); } else { System.out.println("Pode entrar"); } Esse código poderia ficar ainda mais legível, utilizando-se o operador de negação, o !. Esse operador transforma o resultado de uma expressão booleana de false para true e vice versa. 1 int idade = 15; 2 boolean amigoDoDono = true; 3 if (idade < 18 && !amigoDoDono) { 4 System.out.println("Não pode entrar"); 5 } else { 7 System.out.println("Pode entrar"); 8 } Repare na linha 3 que o trecho amigoDoDono == false virou !amigoDoDono. Eles têm o mesmo valor. Para comparar se uma variável tem o mesmo valor que outra variável ou valor, utilizamos o operador ==. Repare que utilizar o operador = dentro de um if vai retornar um erro de compilação, já que o Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 16 operador = é o de atribuição. int mes = 1; if (mes == 1) { System.out.println("Você deveria estar de férias"); 4.2. O laço while O while é um comando usado para fazer um laço (loop), isto é, repetir um trecho de código algumas vezes. A idéia é que esse trecho de código seja repetido enquanto uma determinada condição permanecer verdadeira. int idade = 15; while (idade < 18) { System.out.println(idade); idade = idade + 1; } O trecho dentro do bloco do while será executado até o momento em que a condição idade < 18 passe a ser falsa. E isso ocorrerá exatamente no momento em que idade == 18, o que não o fará imprimir 18. int i = 0; while (i < 10) { System.out.println(i); i = i + 1; } Já o while acima imprime de 0 a 9. 4.3. O laço For Outro comando de loop extremamente utilizado é o for. A idéia é a mesma do while: fazer um trecho de código ser repetido enquanto uma condição continuar verdadeira. Mas além disso, o for isola também um espaço para inicialização de variáveis e o modificador dessas variáveis. Isso faz com que fiquem mais legíveis, as variáveis que são relacionadas ao loop: for (inicializacao; condicao; incremento) { codigo; } Um exemplo é o a seguir: Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 17 for (int i = 0; i < 10; i = i + 1) { System.out.println("olá!"); } Repare que esse for poderia ser trocado por: int i = 0; while (i < 10) { System.out.println("olá!"); i = i + 1; } 4.4. Escopo das variáveis No Java, podemos declarar variáveis a qualquer momento. Porém, dependendo de onde você as declarou, ela vai valer de um determinado ponto a outro. // aqui a variável i não existe int i = 5; // a partir daqui ela existe O escopo da variável é o nome dado ao trecho de código em que aquela variável existe e onde é possível acessá-la. Quando abrimos um novo bloco com as chaves, as variáveis declaradas ali dentro só valem até o fim daquele bloco. // aqui a variável i não existe int i = 5; // a partir daqui ela existe while (condicao) { // o i ainda vale aqui int j = 7; // o j passa a existir } // aqui o j não existe mais, mas o i continua dentro do escopo No bloco acima, a variável j pára de existir quando termina o bloco onde ela foi declarada. Se você tentar acessar uma variável fora de seu escopo, ocorrerá um erro de compilação. O mesmo vale para um if: if (algumBooleano) { int i = 5; } else { Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 18 int i = 10; } System.out.println(i); // cuidado! Aqui a variável i não existe fora do if e do else! Se você declarar a variável antes do if, vai haver outro erro de compilação: dentro do if e do else a variável está sendo redeclarada! Então o código para compilar e fazer sentido fica: int i; if (algumBooleano) { i = 5; } else { i = 10; } System.out.println(i); Uma situação parecida pode ocorrer com o for: for (int i = 0; i < 10; i++) { System.out.println("olá!"); } System.out.println(i); // cuidado! Neste for, a variável i morre ao seu término, não podendo ser acessada de fora do for, gerando um erro de compilação. Se você realmente quer acessar o contador depois do loop terminar, precisa de algo como: int i; for (i = 0; i < 10; i++) { System.out.println("olá!"); } System.out.println(i); 4.5. Exercícios de fixação: Sintaxe Mais exercícios de fixação de sintaxe. Para quem já conhece um pouco de Java, pode ser muito simples; mas recomendamos fortemente que você faça os exercícios para se acostumar com erros de compilação, mensagens do javac, convenção de código, etc... Apesar de extremamente simples, precisamos praticar a sintaxe que estamos aprendendo. Para cada exercício, crie um novo arquivo com extensão .java, e declare aquele estranho cabeçalho, dando nome a uma classe e com um bloco main dentro dele: class ExercicioX { public static void main(String[] args) Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 19 { // seu exercicio vai aqui } } NÃO copie e cole de um exercício já existente! Aproveite para praticar. Quando você estiver familiarizado com os procedimentos tudo bem, por enquanto escreva os códigos. Tá bom? 1) Imprima todos os números de 150 a 300. 2) Imprima a soma de 1 até 1000. 3) Imprima todos os múltiplos de 3, entre 1 e 100. 4) Imprima os fatoriais de 1 a 10. O fatorial de um número n é n * n-1 * n-2 ... até n = 1. Lembre-se de utilizar os parênteses. O fatorial de 0 é 1 O fatorial de 1 é (0!) * 1 = 1 O fatorial de 2 é (1!) * 2 = 2 O fatorial de 3 é (2!) * 3 = 6 O fatorial de 4 é (3!) * 4 = 24 Faça um for que inicie uma variável n (número) como 1 e fatorial (resultado) como 1 e varia n de 1 até 10: for (int n = 1, fatorial = 1; n <= 10; n++) { } 5) Aumente a quantidade de números que terão os fatoriais impressos, até 20, 30, 40. Em um determinado momento, além desse cálculo demorar, vai começar a mostrar respostas completamente erradas. Porque? Mude de int para long, e você poderá ver alguma mudança. 6) (opcional) Imprima os primeiros números da série de Fibonacci até passar de 100. A série de Fibonacci é a seguinte: 0, 1, 1, 2, 3, 5, 8, 13, 21, etc... Para calculá-la, o primeiro e segundo elementos valem 1, daí por diante, o n-ésimo elemento vale o (n-1)-ésimo elemento somado ao (n-2)-ésimo elemento (ex: 8 = 5 + 3). 7) (opcional) Escreva um programa que, dada uma variável x (com valor 180, por exemplo), temos y de acordo com a seguinte regra: # se x é par, y = x / 2 # se x é impar, y = 3 * x + 1 # imprime y # O programa deve então jogar o valor de y em x e continuar até que y tenhao valor final de 1. Por exemplo, para x = 13, a saída será: Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 20 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 Imprimindo sem pular linha Um detalhe importante é que uma quebra de linha é impressa toda vez que chamamos println. Para não pular uma linha, usamos o código a seguir: System.out.print(variavel); 8) (opcional) Imprima a seguinte tabela, usando fors encadeados: 1 2 4 3 6 9 4 8 12 16 n n*2 n*3 .... n*n Fazer esses exercícios é importante para praticar algoritmos. Mais exercícios de algoritmos peça para o e-mail (celioassuncao54@hotmail.com) assunto exercícios algoritmo mailto:celioassuncao54@hotmail.com Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 21 5.1. Orientação a objetos básica O Que São Objetos ? Quando temos um problema e queremos resolvê-lo usando um computador, necessariamente temos que fazer um programa. Este nada mais é do que uma serie de instruções que indicam ao computador como proceder em determinadas situações. Assim, o grande desafio do programador é estabelecer a associação entre o modelo que o computador usa e o modelo que o problema lhe apresenta. Isso geralmente leva o programador a modelar o problema apresentado para o modelo utilizado em alguma linguagem. Se a linguagem escolhida for LISP, o problema será traduzido como listas encadeadas. Se for Prolog, o problema será uma cadeia de decisões. Assim, a representação da solução para o problema é característica da linguagem usada, tornando a escrita difícil. A orientação a objetos tenta solucionar esse problema. A orientação a objetos é geral o suficiente para não impor um modelo de linguagem ao programador, permitindo a ele escolher uma estratégia, representando os aspectos do problema em objetos. Assim, quando se "lê" um programa orientado a objeto, podemos ver não apenas a solução, mas também a descrição do problema em termos do próprio problema. O programador consegue "quebrar" o grande problema em pequenas partes que juntas fornecem a solução. Olhando à sua volta é possível perceber muitos exemplos de objetos do mundo real: seu cachorro, sua mesa, sua televisão, sua bicicleta. Esses objetos tem duas características básicas, que são o estado e o comportamento. Por exemplo, os cachorros tem nome, cor, raça (estados) e eles balançam o rabo, comem, e latem (comportamento). Uma bicicleta tem 18 marchas, duas rodas, banco (estado) e elas brecam, aceleram e mudam de marcha (comportamento). De maneira geral, definimos objetos como um conjunto de variáveis e métodos, que representam seus estados e comportamentos. Veja a ilustração: Temos aqui representada (de maneira lógica) a idéia que as linguagens orientadas a objeto utilizam. Tudo que um objeto sabe (estados ou variáveis) e tudo que ele podem fazer Variáveis Métodos Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 22 (comportamento ou métodos) está contido no próprio objeto. No exemplo da bicicleta, poderemos representar o objeto como no exemplo abaixo: Temos métodos para mudar a marcha, a cadência das pedaladas, e para brecar. A utilização desses métodos altera os valores dos estados. Ao brecar, a velocidade diminui. Ao mudar a marcha, a cadência é alterada. Note que os diagramas mostram que as variáveis do objeto estão no centro do mesmo. Os métodos cercam esses valores e os “escondem” de outros objetos. Deste modo, só é possível ter acesso a essas variáveis através dos métodos. Esse tipo de construção é chamada de encapsulamento, e é a construção ideal para objetos. Exercício - Imagine um exemplo de objeto diferente dos vistos até agora. Para esse objeto, relacione possíveis métodos e atributos. Mas um objeto sozinho geralmente não é muito útil. Ao contrário, em um programa orientado a objetos temos muitos objetos se relacionando entre si. Uma bicicleta encostada na garagem nada mais é que um pedaço de ferro e borracha. Por si mesma, ela não tem capacidade de realizar nenhuma tarefa. Apenas com outro objeto (você) utilizando a bicicleta, ela é capaz de realizar algum trabalho. freios Modificar marchas Modificar Engrenagens Modificar marchas 50 rpm 5th eqp 10 Mpm Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 23 A interação entre objetos é feita através de mensagens. Um objeto “chama” os métodos de outro, passando parâmetros quando necessário. Quando você passa a mensagem “mude de marcha” para o objeto bicicleta você precisa dizer qual marcha você deseja. A figura a seguir mostra os três componentes que fazem parte de uma mensagem: · objeto para o qual a mensagem é dirigida (bicicleta) · nome do método a ser executado (mudamarcha) · os parâmetros necessários para a execução do método. A troca de mensagens nos fornece ainda um benefício importante. Como todas as interações são feitas através delas, não importa se o objeto faz parte do mesmo programa; ele pode estar até em outro computador. Existem maneiras de enviar essas mensagens através da rede, permitindo a comunicação remota entre objetos. Assim, um programa orientado a objetos nada mais é do que um punhado de objetos dizendo um ao outro o que fazer. Quando você quer que um objeto faca alguma coisa, você envia a ele uma "mensagem" informando o que quer fazer, e o objeto faz. Se ele precisar de outro objeto que o auxiliar a realizar o "trabalho", ele mesmo vai cuidar de enviar mensagem para esse outro objeto. Deste modo, um programa pode realizar atividades muito complexas baseado apenas em uma mensagem inicial. Você pode definir vários tipos de objetos diferentes para seu programa. Cada objeto terá suas próprias características, e saberá como interpretar certos pedidos. A parte interessante é que objetos de mesmo tipo se comportam de maneira semelhante. Assim, você pode ter funções genéricas que funcionam para vários tipos diferentes, economizando código. voce Mudar marcha (Torre de engrenagens) Sua Bicicleta Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 24 Vale lembrar que métodos são diferentes de procedimentos e funções das linguagens procedurais, e é muito fácil confundir os conceitos. Para evitar a confusão, temos que entender o que são classes. 5.2 Exercícios – Imagine dois objetos que se relacionam. Mostre como é possível através de mensagens o relacionamento entre eles. 5.3 Classes Até agora, comentamos sobre o que é um objeto e como ele se relaciona com outros objetos. Falaremos agora a respeito de classes. Sua bicicleta é apenas uma das várias que existem. A sua bicicleta específica foi feita por um fabricante, e tem certas características que seguem uma linha ou modelo. Assim, é possível ir a uma loja e comprar várias unidades de bicicletas essencialmente idênticas. Mas não podemos dizer que todas são o mesmo objeto, simplesmente por serem parecidas. Em orientação a objetos, dizemos que um (ou mais) objetos pertencem a uma classe quando eles são muito semelhantes, de acordo com certos padrões. Assim, dependendo da situação, alguém pode dizer que sua bicicleta é um veículo, pois ele anda sobre rodas e carrega uma pessoa. Se seguirmos esse padrão, uma motocicleta também é um veículo, assim como um automóvel ou até um avião (ué, não anda sobre rodas quando decola ou pousa ? Não carrega uma pessoa ?). Na verdade, quando programamos em linguagens orientadas a objetos, antes de tudo nós construímos as classes, os modelos, para depois usá-las na criação de objetos daquele tipo. Voltando ao nosso exemplo das bicicletas. Quando elas são construídas, os fabricantes tiram vantagem do fato que elas tem as mesmas características,e podem construir várias delas a partir de uma mesma planta. Seria muito custoso fazer um novo projeto para cada bicicleta que eles fossem construir. 6.1 Exercícios classes e subclasses - Agrupe em classes os objetos abaixo: avião elefante computador tigre calculadora motocicleta formiga Na orientação a objetos, quando programamos, tentamos visualizar os objetos necessários para resolver um problema. Se eu estou criando um programa de controle de estoque, eu vou necessitar de uma classe que represente os itens que tenho nesse estoque. Outra classe que represente as ordens de compra. E assim por diante. Nota: A classe é um modelo ou protótipo, que define as variáveis e comportamentos em comum que um certo tipo de objeto específico contém. No nosso exemplo, depois de criada a classe bicicleta, nos é possível criar a partir dela objetos que serão cópias idênticas da classe, mas cada uma delas terá seus próprios estados. O modelo pode fornecer dados que serão compartilhados entre todos os objetos ou permitir que estes tenham dados própiros. Nota: Objetos “derivados” de uma classe são chamados instância de classe. Para tornar o entendimento mais fácil, vamos ver um exemplo mais fácil e prático. Inicialmente vamos pensar em um objeto bem simples, como uma lâmpada. As lâmpadas podem ter diversos formatos, cores e tamanhos, mas basicamente elas tem apenas uma função, que é iluminar o ambiente. Assim, imagine uma classe lâmpada. Essa classe pressupõe apenas 2 estados. Um objeto derivado dessa classe pode estar Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 25 ligado ou desligado. Mas a lâmpada por si só não decide quando vai ligar ou desligar. Quem liga ou desliga esse objeto lâmpada é um interruptor, acionado normalmente por uma pessoa. Para resolver esse problema, teremos que definir um objeto baseado na classe lâmpada. Teremos ainda um objeto da classe interruptor e outro da classe pessoa. Pessoa irá enviar uma mensagem ao interruptor que por sua vez irá enviar uma mensagem para a lâmpada. Uma coisa interessante é que não interessa para a pessoa que está ligando a lâmpada como o interruptor funciona: importa que quando pressionado, a lâmpada acenda. Esta é uma das grandes vantagens de se utilizar o conceito de objetos em informática. Um objeto é como uma caixa preta: não me importa como ele faz as coisas, apenas o que tenho que fazer para que as coisas aconteçam. Ou seja, a classe é o construtor de objetos, eu defino o objeto como sendo o ente físico que possui todas as propriedades da classe a qual pertence. Voltando ao exemplo da lâmpada, em Java eu poderia definir uma lâmpada assim: lampada sala_de_aula = new lampada(); Se eu quiser ligar a lâmpada, é só informar a ela o meu desejo, através de uma mensagem: sala_de_aula.ligar(); E a lâmpada vai acender. Não me importa como ela fez isso, me importa apenas que ela faça Exemplo 2 Construa um código java que leia duas notas, calcule a média e apresente o resultado. Double.parseDouble é um metodo que transforma String em double. import javax.swing.JOptionPane;//biblioteca javax.swing public class EntradaDadosMedia{ public static void main(String[] args) { double nota1,nota2,media; nota1 = Double.parseDouble(JOptionPane.showInputDialog("Digite nota1:")); nota2 = Double.parseDouble(JOptionPane.showInputDialog("digite nota2:")); media = (nota1+nota2)/2; JOptionPane.showMessageDialog(null, "media : " + media); } } Classes instanciação Não basta um objeto estar definido para ser utilizado. Se eu pretendo usar um objeto, eu preciso cria-lo, e atribuir o controle desse objeto a um nome. A criação de objetos em Java é sempre necessária, e é chamada de instanciação (por isso o objeto é chamado de instância). Quando eu crio o objeto sala_de_aula, eu digo que ele é do tipo lâmpada e que eu quero que ele seja instanciado nesse momento (new lampada()). A partir de agora, sala_de_aula é um objeto do tipo definido e tem como funções tudo que uma lâmpada pode fazer. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 26 5.5 Classes, Atributos e Métodos Uma das grandes vantagens do Java e nosso propósito de estudo é a capacidade de você definir seus próprios objetos. Como já comentado, um objeto contém atributos (dados) e métodos (funções para manipulação dos dados). Esses objetos irão ajudá-lo a resolver o problema apresentado e tornarão seu trabalho mais fácil. Vamos inicialmente criar um objeto simples, que contenha apenas dados. class meuObjeto { String nome; int idade; String telefone; } Você acabou de definir um objeto chamado meuObjeto. Temos nome, idade e telefone como dados deste objeto. Mas não basta defini-lo para que ele nos seja útil. Para isso, você deve instanciá-lo,assim: meuObjeto amigo = new meuObjeto(); A partir de agora, meu objeto amigo pode ser utilizado para guardar dados. Eu posso incluir dados assim: amigo.nome = "Joao"; amigo.idade = 33; amigo.telefone = "2223311"; E quando eu precisar dos valores, eu simplesmente os imprimo. Nota: para facilitar nosso aprendizado, o comando para imprimir um dado é System.out.println, e pode ser utilizado assim: System.out.println (amigo.nome) ou usando JOptionPane Vamos agora criar um método para o meuObjeto. Esse método vai se chamar aniversario, e ele serve para aumentar em 1 ano a idade do objeto. Então, meu objeto ficaria: class meuObjeto { String nome; int idade; String telefone; public void aniversario() { idade = idade + 1; } } Agora, para um teste, poderíamos fazer: meuObjeto amigo = new meuObjeto(); amigo.nome = "Joao"; amigo.idade = 33; amigo.telefone = "2223311"; System.out.println ("Idade antiga"+amigo.idade); amigo.aniversario(); Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 27 System.out.println ("Nova idade"+amigo.idade); Percebam que o valor da idade foi alterado. 5.6. Objetos são acessados por referências Quando declaramos uma variável para associar a um objeto, na verdade, essa variável não guarda o objeto, e sim uma maneira de acessá-lo, chamada de referência. É por esse motivo que, diferente dos tipos primitivos como int e long, precisamos dar new depois de declarada a variável: 1 public static void main(String args[]) { 2 Conta c1; 3 c1 = new Conta(); 4 5 Conta c2; 6 c2 = new Conta(); 7 } O correto aqui, é dizer que c1 se refere a um objeto. Não é correto dizer que c1 é um objeto, pois c1 é uma variável referência, apesar de, depois de um tempo, os programadores Java falarem “Tenho um objeto c do tipo Conta”, mas apenas para encurtar a frase “Tenho uma referência c a um objeto do tipo Conta”. Basta lembrar que, em Java, uma variável nunca é um objeto. Não há, no Java, uma maneira de criarmos o que é conhecido como “objeto pilha” ou “objeto local”, pois todo objeto em Java, sem exceção, é acessado por uma variável referência. Esse código nos deixa na seguinte situação: Conta c1; c1 = new Conta(); Conta c2; c2 = new Conta(); Internamente, c1 e c2 vão guardar um número que identifica em que posição da memória aquela Conta se encontra. Dessa maneira, ao utilizarmos o “.” para navegar, o Java vai acessar a Conta que se encontra naquela posição de memória, e não uma outra. Para quem conhece, é 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.Um outro exemplo: 1 class TestaReferencias { 2 public static void main(String args[]) { 3 Conta c1 = new Conta(); 4 c1.deposita(100); 5 Conta Memória Conta c1 c2 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 28 6 Conta c2 = c1; // linha importante! 7 c2.deposita(200); 8 9 System.out.println(c1.saldo); 10 System.out.println(c2.saldo); 11 } 12 } Qual é o resultado do código acima? O que apareceao rodar? O que acontece aqui? O operador = copia o valor de uma variável. Mas qual é o valor da variável c1? É o objeto? Não. Na verdade, o valor guardado é a referência (endereço) de onde o objeto se encontra na memória principal. Na memória, o que acontece nesse caso: Conta c1 = new Conta(); Conta c2 = c1; Quando fizemos c2 = c1, c2 passa a fazer referência para o mesmo objeto que c1 referencia nesse instante. Então, nesse código em específico, quando utilizamos c1 ou c2 estamos nos referindo exatamente ao mesmo objeto! Elas são duas referências distintas, porém apontam para o mesmo objeto! Compará-las com “==” irá nos retornar true, pois o valor que elas carregam é o mesmo! Outra forma de perceber, é que demos apenas um new, então só pode haver um objeto Conta na memória. Atenção: não estamos discutindo aqui a utilidade de fazer uma referência apontar pro mesmo objeto que outra. Essa utilidade ficará mais clara quando passarmos variáveis do tipo referência como argumento para métodos. new O que exatamente faz o new? O new executa uma série de tarefas, que veremos mais adiante. Mas, para melhor entender as referências no Java, saiba que o new, depois de alocar a memória para esse objeto, devolve uma “flecha”, isto é, um valor de referência. Quando você atribui isso a uma variável, essa variável passa a se referir para esse mesmo objeto. Podemos então ver outra situação: 1 public static void main(String args[]) { 2 Conta c1 = new Conta(); 3 c1.dono = "Duke"; 4 c1.saldo = 227; 5 6 Conta c2 = new Conta(); 7 c2.dono = "Duke"; 8 c2.saldo = 227; 9 Memória Conta c1 c2 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 29 10 if (c1 == c2) { 11 System.out.println("Contas iguais"); 12 } 13 } O operador == compara o conteúdo das variáveis, mas essas variáveis não guardam o objeto, e sim o endereço em que ele se encontra. Como em cada uma dessas variáveis guardamos duas contas criadas diferentemente, eles estão em espaços diferentes da memória, o que faz o teste no if valer false. As contas podem ser equivalentes no nosso critério de igualdade, porém elas não são o mesmo objeto. Quando se trata de objetos, pode ficar mais fácil pensar que o == compara se os objetos (referências, na verdade) são o mesmo, e não se são iguais. dono Celio saldo 12000 limite 20000 c1 c2 dono Celio saldo 12000 limite 20000 Para saber se dois objetos têm o mesmo conteúdo, você precisa comparar atributo por atributo. Veremos uma solução mais elegante para isso também 5.7 O Método transfere() E se quisermos ter um método que transfere dinheiro entre duas contas? Podemos ficar tentados a criar um método que recebe dois parâmetros: conta1 e conta2 do tipo Conta. Mas cuidado: assim estamos pensando de maneira procedural. A ideia é que, quando chamarmos o método transfere, já teremos um objeto do tipo Conta (o this), portanto o método recebe apenas um parâmetro do tipo Conta, a Conta destino (além do valor): class Conta { // atributos e metodos... void transfere(Conta destino, double valor) { this.saldo = this.saldo - valor; destino.saldo = destino.saldo + valor; } Conta + numero : int + saldo: double + limite: double + nome: String + saca (valor : double) :boolean + deposita (valor double) + transfere (destino : Conta, valor: double Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 30 } Para deixar o código mais robusto, poderíamos verificar se a conta possui a quantidade a ser transferida disponível. Para ficar ainda mais interessante, você pode chamar os métodos deposita e saca já existentes para fazer essa tarefa: class Conta { // atributos e metodos... boolean transfere(Conta destino, double valor) { boolean retirou = this.saca(valor); if (retirou == false) { // não deu pra sacar! return false; } else { destino.deposita(valor); return true; } } } Conta + numero : int + saldo: double + limite: double + nome: String + saca (valor : double) :boolean + deposita (valor double) + transfere (destino : Conta, valor: double): boolean Quando passamos uma Conta como argumento, o que será que acontece na memória? Será que o objeto é clonado? No Java, a passagem de parâmetro funciona como uma simples atribuição como no uso do “=”. Então, esse parâmetro vai copiar o valor da variável do tipo Conta que for passado como argumento. E qual é o valor de uma variável dessas? Seu valor é um endereço, uma referência, nunca um objeto. Por isso não há cópia de objetos aqui. Esse último código poderia ser escrito com uma sintaxe muito mais sucinta. Como? Vamos lá façam esse exercício, tá bom? 5.8 Transfere Para Perceba que o nome deste método poderia ser transferePara ao invés de só transfere. A chamada do método fica muito mais natural, é possível ler a frase em português que ela tem um sentido: conta1.transferePara(conta2, 50); A leitura deste código seria “Conta1 transferePara Conta2 50 reais”. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 31 5.9. Para saber mais: Uma Fábrica de Carros Além do Banco que estamos criando, vamos ver como ficariam certas classes relacionadas a uma fábrica de carros. Vamos criar uma classe Carro, com certos atributos, que descrevem suas características, e com certos métodos, que descrevem seu comportamento. 1 class Carro { 2 String cor; 3 String modelo; 4 double velocidadeAtual; 5 double velocidadeMaxima; 6 7 //liga o carro 8 void liga() { 9 System.out.println("O carro está ligado"); 10 } 11 12 //acelera uma certa quantidade 13 void acelera(double quantidade) { 14 double velocidadeNova = this.velocidadeAtual + quantidade; 15 this.velocidadeAtual = velocidadeNova; 16 } 17 18 //devolve a marcha do carro 19 int pegaMarcha() { 20 if (this.velocidadeAtual < 0) { 21 return -1; 22 } 23 if (this.velocidadeAtual >= 0 && this.velocidadeAtual < 40) { 24 return 1; 25 } 26 if (this.velocidadeAtual >= 40 && this.velocidadeAtual < 80 { 27 return 2; 28 } 29 return 3; 30 } 31 } Vamos testar nosso Carro em um novo programa: 1 class TestaCarro { 2 public static void main(String[] args) { 3 Carro meuCarro; 4 meuCarro = new Carro(); 5 meuCarro.cor = "Verde"; 6 meuCarro.modelo = "Fusca"; 7 meuCarro.velocidadeAtual = 0; 8 meuCarro.velocidadeMaxima = 80; 9 10 // liga o carro 11 meuCarro.liga(); 12 Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 32 13 // acelera o carro 14 meuCarro.acelera(20); 15 System.out.println(meuCarro.velocidadeAtual); 16 } 17 } Nosso carro pode conter também um Motor: 1 class Motor { 2 int potencia; 3 String tipo; 4 } 1 class Carro { 2 String cor; 3 String modelo; 4 double velocidadeAtual; 5 double velocidadeMaxima; 6 Motor motor; 7 8 // .. 9} 5.10 - Exercícios: Orientação a Objetos O modelo de funcionários a seguir será utilizado para os exercícios de alguns dos posteriores capítulos. O objetivo aqui é criar um sistema para gerenciar os funcionários do Banco. Os exercícios desse capítulo são extremamente importantes. 1) Modele um funcionário. Ele deve ter o nome do funcionário, o departamento onde trabalha, seu salário (double), a data de entrada no banco (String), seu RG (String) e um valor booleano que indique se o funcionário ainda está ativo na empresa ou se já foi mandado embora. Você deve criar alguns métodos de acordo com sua necessidade. Além deles, crie um método bonifica que aumenta o salario do funcionário de acordo com o parâmetro passado como argumento. Crie, também, um método demite, que não recebe parâmetro algum, só modifica o valor booleano indicando que o funcionário não trabalha mais aqui. A idéia aqui é apenas modelar, isto é, só identifique que informações são importantes e o que um funcionário faz. Desenhe no papel tudo o que um Funcionario tem e tudo que ele faz. 2)Transforme o modelo acima em uma classe Java. Teste-a, usando uma outra classe que tenha o main. Você deve criar a classe do funcionário chamada Funcionario, e a classe de teste você pode nomear como quiser. A de teste deve possuir o método main. Um esboço da classe: class Funcionario { double salario; // seus outros atributos e métodos void bonifica(double aumento) { // o que fazer aqui dentro? } void demite() { // o que fazer aqui dentro? } } Você pode (e deve) compilar seu arquivo java sem que você ainda tenha terminado sua Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 33 classe Funcionario. Isso evitará que você receba dezenas de erros de compilação de uma vez só. Crie a classe Funcionario, coloque seus atributos e, antes de colocar qualquer método, compile o arquivo java. Funcionario.class será gerado, não podemos “executá-la” pois não há um main, mas assim verificamos que nossa classe Funcionário já está tomando forma. Funcionario + nome : String + departamento : String + salario : double + dataEntrada : String + rg : String + cpf : String + bonifica(aumento double) + demite( ) Esse é um processo incremental. Procure desenvolver assim seus exercícios, para não descobrir só no fim do caminho que algo estava muito errado. Um esboço da classe que possui o main: 1 class TestaFuncionario { 2 3 public static void main(String[] args) { 4 Funcionario f1 = new Funcionario(); 5 6 f1.nome = "Gesebelo Silva"; 7 f1.salario = 100; 8 f1.bonifica(50); 9 10 System.out.println("salario atual:" + f1.salario); 11 12 } 13 } Incremente essa classe. Faça outros testes, imprima outros atributos e invoque os métodos que você criou a mais, tá bom?. Lembre-se de seguir a convenção java, isso é importantíssimo. Isto é, nomeDeAtributo, nomeDeMetodo, nomeDeVariavel, NomeDeClasse, etc... Todas as classes no mesmo arquivo? Por enquanto, você pode colocar todas as classes no mesmo arquivo e apenas compilar esse arquivo. Ele vai gerar os dois .class. Porém, é boa prática criar um arquivo .java para cada classe e, em determinados casos, você será obrigado a declarar uma classe em um arquivo separado, como veremos no parte 2. Isto não é importante para o aprendizado no momento. 5.11 Exercício de fixação Digitem o exemplo acima e façam o mesmo funcionar. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 34 Nota: o esquema geral para a definição de um método é tipo_do_dados_de_retorno nome_do_metodo (argumentos) { corpo_do_metodo } No caso do método aniversario definido acima, não temos nenhum tipo de retorno, por isso ele é do tipo void. Se precisarmos algum resultado de retorno, temos que indicar qual o tipo desse resultado. Vamos definir outro método, que me retorna o numero de meses baseado na idade. O método poderia ser definido assim: int idadeEmMeses() { return (idade * 12); } A instrução return vai indicar qual o valor a ser retornado na chamada do método. Como temos um retorno, ele dever ser utilizado ou apresentado. Podemos apresentá-lo assim: System.out.println (amigo.idadeEmMeses()); Nota: Se o valor for utilizado para outros fins, devemos definir uma variável do mesmo tipo do retorno para conter o resultado: int idade_em_meses = amigo.idadeEmMeses(); Às vezes, necessitamos do envio de argumentos (também chamados parâmetros) para um método para que ele possa executar seu trabalho. A passagem de parâmetro é feita na hora da chamada, e temos que criar o método já levando em consideração a quantidade de parâmetros que iremos passar. Assim, caso eu queira alterar ao atributo idade do objeto, eu poderia criar um método assim: void alteraIdade(int nova_idade) { idade = nova_idade; } E a chamada ao método ficaria: amigo.alteraIdade(30); - Implemente o exemplo acima. Nota: Caso eu tenha mais de um argumento, eles devem ser separados por virgulas. Nota2: Na definição do método com mais de um argumento, eu tenho que prever as variáveis a serem recebidas. Exemplo: void qualquerCoisa (String nome, int idade, String telefone) Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 35 A chamada é amigo.qualquerCoisa ("paulo", 24, "2221133"); Exemplo 2 escreva métodos para a classe EntradaDadosMedia import javax.swing.JOptionPane; public class MetodosSimples { static double nota1,nota2,media; public static void main(String[] args) { LerNotas(); CalculaMedia(); Mensagem(); } public static void LerNotas(){ nota1 = Double.parseDouble(JOptionPane.showInputDialog("Digite nota1:")); nota2 = Double.parseDouble(JOptionPane.showInputDialog("digite nota2:")); } public static void CalculaMedia(){ media = (nota1+nota2)/2; } public static void Mensagem(){ JOptionPane.showMessageDialog(null, "media : " + media); } } Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 36 6.1 Construção De Programas Em Java Vocês podem estar se perguntando qual a finalidade de criar métodos para alterar valores dentro de um objeto. Nesses exemplos fica fácil perceber que é muito mais fácil fazer uma atribuição simples (amigo.idade=34) do que criar um método só para alterar a idade. Mas isso tem sentido de ser, em linguagens orientadas a objetos. A idéia é que o objeto deve gerenciar seus próprios dados, que só devem ser acessíveis ao "mundo exterior" através de seus métodos (excetuando-se aqui os métodos e variáveis estáticas). Então, pelo menos em teoria, cada atributo do meu objeto deve ter um método para gravar dados e outro para devolver o dado gravado. Isso vai permitir que esse objeto seja utilizado por qualquer um, a qualquer tempo. Vamos passar então um pequeno código de um programa completo em Java para que possamos ir comentando e esclarecendo. import java.util.*; public class Propriedades { public static void main (String[] args) { System.out.println ("Bom dia... Hoje é dia\n"); System.out.println ("Bom dia... Hoje é dia\n"); System.out.println(new Date()); } } Logo na primeira linha temos "import...". É normal nas primeiras linhas de um programa em Java a colocação da instrução import. Essa instrução serve para que nosso programa possa utilizar qualquer classe externa que ele necessite. No caso, meu programa usa uma função que retorna a data do sistema, e essa função faz parte de java.util. Assim, eu preciso importar essas funções para que meu programa funcione. Isso será explicado melhor quando falarmos a respeito de API's. Na segunda linha, definimos o nome desse objeto (em Java, chamado de classe). É importante notar que o objeto deve ter o mesmo nome do arquivo no disco, caso contrário o programa não irá funcionar. Notamos ainda nessa mesma linha que essa classe é do tipo publica (public). Isso quer dizer que esse objeto é acessível por outros objetos, que ele pode ser importado e usado. Na próxima linha, temos a definição do método main. Vemos novamente o public, e a palavra static, indicando que esse método não pode ser instanciado, apenas usado do jeito que esta. Vemos que o método main admite uma lista de Strings como argumentos (chamado de args). Esses argumentos não são necessários nesse programa, mas caso necessitássemos de passar algum tipo de informação para o programa, essas informações estariam armazenadas na variável args. Na próxima linha, temos a impressão de umtexto na tela. Aúnica novidade é a presença de um sinal \n no final do texto. Ele indica ao Java para pular de linha depois de escrever o texto indicado. Na ultima linha temos outra impressão. Dessa vez, temos a instanciação de um objeto do tipo Date, e seu valor é imediatamente impresso. Como não necessitamos do objeto, apenas queremos um valor impresso, não é necessário criar uma variável apenas para isso. Note que nem sempre isso é possível. InstitutoPaula Sousa – Orientação a objetos com java Celio Assunção 37 6.2 Métodos Construtores e Overloading Como já apresentado, é sempre necessário instanciar um objeto para poder utilizá-lo. Existe um método especial em uma classe que fornece instruções a respeito de como devemos instanciar o objeto. Esse método é chamado de construtor. A função do construtor é garantir que o objeto associado à variável definida será inciada corretamente. Sempre é necessário ter um construtor, e como na maioria das vezes esse construtor não faz nada (além de instanciar o objeto), não é necessário declará-lo. O Java faz isso automaticamente para nos. Nota: O método construtor tem exatamente o mesmo nome da classe. Assim, no exemplo: class meuObjeto { String nome; int idade; String telefone; public void aniversario() { idade = idade + 1; } } Não temos construtor definido. Mas existem casos onde teremos necessidade de um construtor que faz algo, como na definição de String. Eu posso definir uma String assim: String nome = new String(); Ou assim: Stirng nome = new String ("Joao"); Isso quer dizer que o objeto String tem pelo menos 2 construtores; um que inicia o objeto sem argumentos e outro que inicia com argumentos. Esse tipo de artificio é chamado de sobrecarga (em inglês, Overloading). Se eu quiser que meuObjeto tenha o mesmo tipo de funcionalidade do String, eu defino dois construtores, assim: class meuObjeto { String nome; int idade; String telefone; meuObjeto() // Esse é o construtor sem argumentos { } meuObjeto(String _nome, int _idade, String _telefone) // Construtor com argumentos { nome = _nome; idade = _idade; telefone = _telefone; } public void aniversario() Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 38 { idade = idade + 1; } } Agora meuObjeto pode ser instanciado como meuObjeto amigo = new meuObjeto(); ou meuObjeto amigo = new meuObjeto("Joao", 32, "2223311"); A sobrecarga é um dos recursos mais interessantes da orientação a objetos. E não esta restrito aos construtores; podermos definir o mesmo nome de método para qualquer método. Assim, tornamos o programa mais legível e temos menos nomes para "inventar". Nota: Como os dois (ou mais) métodos tem o mesmo nome, a diferenciação de qual método é executado depende da quantidade e do tipo dos argumentos enviados. Nota2: Quando não definimos construtores, o Java cria um sem argumentos para nos. Quando eu escolho definir o construtor, tenho que definir para todos os tipos, inclusive o sem argumentos. Para entender melhor o conceito de sobrecarga vamos fazer alguns exercícios. import javax.swing.JOptionPane; public class MetodosSimples { static double nota1,nota2,media; public static void main(String[] args) { LerNotas(); CalculaMedia(); Mensagem(); } public static void LerNotas(){ nota1 = Double.parseDouble(JOptionPane.showInputDialog("Digite nota1:")); nota2 = Double.parseDouble(JOptionPane.showInputDialog("digite nota2:")); } public static void CalculaMedia(){ media = (nota1+nota2)/2; } public static void Mensagem(){ JOptionPane.showMessageDialog(null, "media : " + media); } } Na classe MetodosSimples use uma estrutura de repetição para que o programa seja executado mais de uma vez. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 39 import javax.swing.JOptionPane; public class MetodosSimples2 { static double nota1,nota2,media; public static void main(String[] args) { for (int i = 0;i<3;i++){ LerNotas(); CalculaMedia(nota1,nota2); Mensagem(media); } } public static void LerNotas(){ nota1 = Double.parseDouble(JOptionPane.showInputDialog("Digite nota1:")); nota2 = Double.parseDouble(JOptionPane.showInputDialog("digite nota2:")); } public static void CalculaMedia(double nt1,double nt2){ media = (nt1+nt2)/2; } public static void Mensagem(double CalculoMedia){ JOptionPane.showMessageDialog(null, "media : " + CalculoMedia); } } observe que neste caso o programa será executado tantas vezes quantas eu queira. 6.3 Utilização das API’s Como já falado, existem muitos objetos prontos que a linguagem Java nos proporciona. Como todos os objetos, eles podem conter dados e tem vários métodos para que possamos usa-los. É importante para um programador Java conhecer o máximo desses objetos que puder; eles facilitam o trabalho na medida que evitam que nos tenhamos o trabalho de inventar algo que já está pronto. Lembre que normalmente nós não temos acesso aos atributos dessa classe; apenas a seus métodos. Quando executamos um import ... no inicio do nosso programa, estamos informando ao compilador Java quais as classes que desejamos usar. Assim, um import java.util.*; quer dizer: "eu vou utilizar alguns objetos do pacote java.util". Um programa pode ter tantos import quanto necessário. Isso permite que você utilize componentes de pacotes baixados da Internet, com utilização mais restrita. Nota: Uma lista completa das API's existentes pode ser achada na lista de links no final do documento. 6.4 Utilizando gestores de erro O java tem a facilidade de excluir erros comuns gerados por imperícia dos usuários, uma das formas é o try catch. Veja no exemplo a seguir. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 40 6.5 Entrada dados com GET import javax.swing.JOptionPane; import java.io.*;; public class EntradaDadosComGet { public static void main(String[] args) { double nota1=0,nota2=0,media=0; BufferedReader dadoEntrada; String notaDigitada; try{// trecho principal sem erros System.out.println("digite n1"); dadoEntrada = new BufferedReader(new InputStreamReader(System.in)); notaDigitada = dadoEntrada.readLine(); nota1 = Double.parseDouble(notaDigitada); System.out.println("digite n2"); dadoEntrada = new BufferedReader(new InputStreamReader(System.in)); notaDigitada = dadoEntrada.readLine(); nota2 = Double.parseDouble(notaDigitada); media = (nota1+nota2)/2; System.out.println("a media é"+media); } catch(IOException erroIO){ System.out.println("erro entrada de dados "+erroIO); } catch(NumberFormatException erroNumber){ //caso digite numero invalido System.out.println("digite caracter valido "+erroNumber.getMessage()); System.out.println("digite caracter valido "+erroNumber.getStackTrace()); } //o que estiver no finally [e rodado mesmo com o catch, n'ao cai fora finally{ JOptionPane.showMessageDialog(null,"fim da aplicação Media sem tratamento"); } } } Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 41 6.6 Conceito De Pacote Um pacote pode ser entendido como uma serie de objetos agrupados por afinidade. Eles ficam "juntos" pois tem funções semelhantes (como por exemplo manipular texto). Quando nós vamos criar nossos próprios objetos para resolver um problema, normalmente esses objetos ficam todos no mesmo sub-diretorio; entre eles estabelecemos uma relação de "amizade", e podemos considera-los como parte do mesmo pacote (default). Estando no mesmo sub-diretorio, certas restrições de acesso entre esses objetos mudam. Explicamos restrição de acesso no tópico a seguir. 6.7 Tipos De Métodos: Públicos, Privados E Protegidos As restrições de acesso em Java existem por dois motivos. O primeiro é não permitir que o programador utilize meus objetos da maneira que quiser. Eu dito o que pode e o que não pode ser utilizado. E o segundo motivo é que tudo que não for publico (e consequentemente não permite acesso) pode ser alterado na hora que eu quiser. Contanto que os métodos de acesso (que são públicos) fiquem inalterados, ninguém vai perceber a diferença. Como exemplo, vejamos o objeto String. O String na verdade é um vetor de caracteres. Eu não tenho permissão para acessar os conteúdos internos desses caracteres;eu tenho que fazer isso utilizando um método. Assim, existem situações onde é interessante que meus objetos tenham um certo controle sobre o que o programador pode fazer com eles, para que não ocorram problemas. Para isso, temos três tipos de acesso a métodos e atributos. Quando utilizamos a palavra public, liberamos o acesso do atributo/método para ser utilizado por qualquer um que importe o pacote ou o objeto. No caso do private, ninguém pode acessar o método/atributo daquele objeto, nem mesmo os objetos daquele pacote ou objetos que herdam suas características. Isso evita que certos métodos sejam acessados diretamente, evitando erros. Métodos/atributos protected podem ser herdados, mas não alterados. Iremos comentar a respeito de herança mais à frente. Exemplo: class exemplo { public metodo1() { ... } private metodo2() { ... } } Nessa classe, o metodo1 pode ser executado por qualquer outro objeto. O método metodo2 só pode ser executado pelo próprio objeto.Primeiramente criaremos um método simples como exemplo, calcular uma soma simples 6.8 Exercícios de fixação Construa uma classe CalculaSoma implemente vários métodos e chame de outra classe chamada ChamaMetodosDeOutraClasse Este exercício possibilita chamar um método em outra classe. Primeiramente criaremos um método simples como exemplo, calcular uma soma simples. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 42 6.9 Chamando método de outra classe public class CalculaSoma { static double soma=0, valor1=0,valor2=0; public static void somar() { soma = valor1+valor2; } } Uma classe chama método de outra classe que vai utilizar o método criado na primeira classe, veja que utilizamos o static para ser usado em todo procedimento. import javax.swing.JOptionPane; public class MetodoOutraClasseSemParametro { public static void main(String[] args) { CalculaSoma.valor1 = 12; CalculaSoma.valor2 = 15; CalculaSoma.somar(); JOptionPane.showMessageDialog(null, "a soma é "+CalculaSoma.soma); } } 6.10 Passando valores por parâmetro Agora vamos fazer outro método passando por parâmetro os dois valores import javax.swing.JOptionPane; public class MetodoOutraClasseSemParametro { public static void main(String[] args) { CalculaSoma.valor1 = 12; CalculaSoma.valor2 = 15; CalculaSoma.somar(); JOptionPane.showMessageDialog(null, "a soma é "+CalculaSoma.soma); CalculaSoma.somar(8,55); JOptionPane.showMessageDialog(null, "a soma com parametro é "+CalculaSoma.soma); } } 6.11 Função retorna valores Posso agora fazer o método retornar um valor, vou ter uma função que vai retornar um double, neste caso posso deixar de executar public class CalculaSoma { static double soma=0, valor1=0,valor2=0; Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 43 public static void somar() { soma = valor1+valor2; } public static void somar(double vl1,double vl2) { soma = vl1+vl2; } public static double retornaSoma(double vl1,double vl2) { return vl1+vl2; } } import javax.swing.JOptionPane; public class ChamaMetodoDeOutraClasseComRetorno { public static void main(String[] args) { CalculaSoma.valor1=Double.parseDouble(JOptionPane.showInputDialog("digite parcela 1")); CalculaSoma.valor2=Double.parseDouble(JOptionPane.showInputDialog("digite parcela 2")); CalculaSoma.somar(); JOptionPane.showMessageDialog(null, "A soma é: "+CalculaSoma.soma); CalculaSoma.somar(3,2); JOptionPane.showMessageDialog(null, "A soma com parametro é: "+CalculaSoma.soma); JOptionPane.showMessageDialog(null, "A soma com retorno do metodo é: "+CalculaSoma.retornaSoma(12,33)); } } veja como em um único exemplo eu posso usar diversos métodos, muito facil, né? 6.12 Usando o conceito de pacote Agora vamos abrir um pacote (package) para organizar melhor meu diretório package MetodosClass; import javax.swing.JOptionPane; public class ChamaMetodoDeOutraClasse { public static void main(String[] args) { Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 44 CalculaSoma.valor1=Double.parseDouble(JOptionPane.showInputDialog("digite parcela 1")); CalculaSoma.valor2=Double.parseDouble(JOptionPane.showInputDialog("digite parcela 2")); CalculaSoma.somar(); JOptionPane.showMessageDialog(null, "A soma é: "+CalculaSoma.soma); CalculaSoma.somar(3,2); JOptionPane.showMessageDialog(null, "A soma com parametro é: "+CalculaSoma.soma); //JOptionPane.showMessageDialog(null, "A soma com retorno do metodo é: "+CalculaSoma.retornaSoma(12,33)); } } vai dar um erro pois o CalculaSoma não esta no pacote devo mudar package MetodosClass; public class CalculaSoma { static double soma=0, valor1=0,valor2=0; public static void somar() { soma = valor1+valor2; } public static void somar(double vl1,double vl2) { soma = vl1+vl2; } } 6.13 DESAFIO 1) Um método pode chamar ele mesmo. Chamamos isso de recursão. Você pode resolver a série de fibonacci usando um método que chama ele mesmo. O objetivo é você criar uma classe, que possa ser usada da seguinte maneira: Fibonacci fibo = new Fibonacci(); int i = fibo.calculaFibonacci(6); System.out.println(i); Aqui imprimirá 8, já que este é o sexto número da série. Este método calculaFibonacci não pode ter nenhum laço, só pode chamar ele mesmo como método. Pense nele como uma função, que usa a própria função para calcular o resultado. 2) Por que o modo acima é extremamente mais lento para calcular a série do que o modo iterativo (que se usa um laço)? 3) Escreva o método recursivo novamente, usando apenas uma linha. Para isso, pesquise Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 45 sobre o operador condicional ternário. (ternary operator) 6.14 Fixando o conhecimento O objetivo dos exercícios a seguir é fixar o conceito de classes e objetos, métodos e atributos. Dada a estrutura de uma classe, basta traduzí-la para a linguagem Java e fazer uso de um objeto da mesma em um programa simples. Se você está com dificuldade em alguma parte desse capítulo, aproveite e treine tudo o que vimos nos pequenos programas abaixo: 1) Programa 1 Classe: Pessoa Atributos: nome, idade. Método: void fazAniversario() Crie uma pessoa, coloque seu nome e idade iniciais, faça alguns aniversários (aumentando a idade) e imprima seu nome e sua idade. 2) Programa 2 Classe: Porta Atributos: aberta, cor, dimensaoX, dimensaoY, dimensaoZ Métodos: void abre(), void fecha(), void pinta(String s), boolean estaAberta() Crie uma porta, abra e feche a mesma, pinte-a de diversas cores, altere suas dimensões e use o método estaAberta para verificar se ela está aberta. 3) Programa 3 Classe: Casa Atributos: cor, porta1, porta2, porta3 Método: void pinta(String s), int quantasPortasEstaoAbertas() Crie uma casa e pinte-a. Crie três portas e coloque-as na casa; abra e feche as mesmas como desejar. Utilize o método quantasPortasEstaoAbertas para imprimir o número de portas abertas. Instituto Paula Sousa – Orientação a objetos com java Celio Assunção 46 7.1 PROGRAMAÇÃO ORIENTADA A OBJETOS Agora vamos criar um novo folder POO (new folder POO) onde iremos instanciar novos objetos e um new folder POO_class onde ficarão os arquivos .class. 7.2 Criando nova classe para Vendas iniciamos colocando a classe dentro do pacote, a classe venda deve ter o cliente, o produto e o valor pago package POO; public class Vendas { String cliente,produto; double valor; } Vamos criar a classe VendaEfetuada que deve ter o main, posso criar um objeto para manipular os atributos criados package POO; public class vendaEfetuada { public static void main(String[] args) { Vendas objVendas; objVendas = new Vendas(); } } Pronto o objeto foi criado e instanciado para ser usado Agora posso manipular as três variáveis package
Compartilhar