Introdução a classes e objetos

718 visualizações

Publicada em

Introdução a classes e objetos em Java.

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
718
No SlideShare
0
A partir de incorporações
0
Número de incorporações
13
Ações
Compartilhamentos
0
Downloads
17
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Introdução a classes e objetos

  1. 1. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 1 Capítulo 3 Introdução a classes e objetos PROGRAMAÇÃO ORIENTADA A OBJETOS POO
  2. 2. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Sumário Classes, objetos, métodos e variáveis de instâncias Declarando um método com um parâmetro Variáveis de instância, métodos set e get Tipos primitivos vs. Tipos por referência Inicializando objetos com construtores Números de ponto flutuante e tipo double Estudo de caso de GUI e imagens gráficas utilizando caixas de diálogo Declarando uma classe com um método e instanciando um objeto de uma classe 2
  3. 3. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância O que é uma classe na LPOO? Conjunto de objetos com características afins; Define o comportamento dos objetos através de seus métodos, e quais estados ele é capaz de manter através de seus atributos. Classes objetos atributos métodos Exemplo: Os seres humanos 3
  4. 4. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Para ajudar a entender classes e seu conteúdo, consideremos o contexto abaixo: “Suponha que você queira guiar um carro e fazê-lo andar mais rápido pisando no pedal acelerador”. O que deve acontecer antes que você possa fazer isso? Alguém tem que projetá-lo (desenho de engenharia, semelhantes às plantas utilizadas para projetar uma casa). Os desenhos de engenharia incluem o projeto de um pedal acelerador para aumentar a velocidade do carro. O pedal acelerador “oculta” do motorista os complexos mecanismos que realmente fazem o carro ir mais rápido, assim como o pedal de freio “oculta” os mecanismos que diminuem a velocidade do carro e a direção “oculta” os mecanismos que mudam a direção do carro. Isso permite que as pessoas com pouco ou nenhum conhecimento de como os motores funcionam dirijam um carro facilmente. Classes, objetos, métodos e variáveis de instância 4
  5. 5. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância O carro acelerará por conta própria? 5
  6. 6. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Introdução aos conceitos da POO O carro acelerará por conta própria? 6
  7. 7. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Para realizar uma tarefa em um programa é necessário um método. O método descreve os mecanismos que realmente realizam suas tarefas. O método oculta de seu usuário as tarefas complexas que ele realiza, assim como o pedal acelerador de um carro oculta do motorista os complexos mecanismos que fazem o carro andar mais rápido. Em Java, primeiro criamos uma unidade de programa chamada classe para abrigar um método, assim como os desenhos de engenharia do carro abrigam o projeto de um pedal acelerador. 7
  8. 8. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Em uma classe, você fornece um ou mais métodos que são projetados para realizar as tarefas da classe. Exemplo: uma classe que representa uma conta bancária poderia conter um método para fazer depósitos de dinheiro em uma conta, outro para fazer saques e um terceiro para perguntar qual é o saldo atual. Assim como você não pode dirigir um desenho de engenharia de um carro, você não pode “dirigir” uma classe. Assim como alguém tem de construir um carro a partir de seus desenhos de engenharia antes de poder realmente guiar o carro, você deve construir um objeto de uma classe antes de fazer um programa realizar as tarefas que a classe descreve como fazer. 8
  9. 9. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Ao dirigir um carro, o ato de pressionar o acelerador envia uma mensagem para o carro realizar uma tarefa – isto é, fazer o carro andar mais rápido. De maneira semelhante, você envia mensagens para um objeto – cada mensagem é implementada como uma chamada de método que instrui um método do objeto a realizar sua tarefa. Um carro, além de suas capacidades, também tem muitos atributos, como cor, número de portas, a quantidade de gasolina no tanque, a velocidade atual e o total de quilômetros percorridos. Cada carro mantém seus próprios atributos. 9
  10. 10. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Um objeto tem atributos que são carregados com o objeto quando ele é utilizado em um programa. Os atributos do objeto são especificados como parte da classe do objeto. Por exemplo, um objeto conta bancária tem um atributo ‘saldo’ que representa a quantidade de dinheiro na conta. Cada objeto ‘conta bancária’ sabe o saldo da conta que ele representa, mas não sabe os saldos de outras contas no banco. Os atributos são especificados pelas variáveis de instância da classe. 10
  11. 11. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Resumo dos exemplos para demonstrar os conceitos de OO 1. O primeiro exemplo apresenta uma classe GradeBook com um método que simplesmente exibe uma mensagem de boas-vindas quando é chamado. Então é mostrado como criar um objeto dessa classe e chamar o método para ele exibir a mensagem de boas-vindas. 2. O segundo exemplo aprimora o primeiro para permitir ao método receber o nome de um curso como argumento e exibe o nome como parte da mensagem de boas-vindas. 3. O terceiro exemplo mostra como armazenar o nome do curso em um objeto GradeBook. Para essa versão da classe, é mostrado como utilizar métodos para configurar o nome do curso e obter seu nome. 11
  12. 12. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Resumo dos exemplos para demonstrar os conceitos de OO 4. O quarto exemplo demonstra como os dados em um objeto GradeBook podem ser inicializados quando o objeto é criado. O último exemplo apresenta uma classe Account que reforça os conceitos apresentados nos quatro primeiros exemplos e introduz número de ponto flutuante. A classe Account representa uma conta bancária e mantém seu saldo como um número de ponto flutuante. A classe contém dois métodos – um que credita um depósito à conta, aumentando assim o saldo, e outro número que recupera o saldo. 12
  13. 13. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Classes, objetos, métodos e variáveis de instância Resumo dos exemplos para demonstrar os conceitos de OO O construtor da classe permite que o saldo de cada objeto Account seja inicializado quando o objeto é criado. São criados dois objetos Account e são feitos depósitos em cada um para mostrar que cada objeto mantém seu próprio saldo. O exemplo também demonstra como inserir e exibir números de ponto flutuante. 13
  14. 14. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 14 Declarando uma classe com um método e instanciando um objeto de uma classe Em seções anteriores, aprendeu-se como criar um objeto da classe Scanner e, então, utilizar esse objeto para ler dados a partir do teclado. Nesta seção, criar-se-á uma nova classe e usar-se-á para criar um objeto. Iniciaremos com um exemplo que consiste em classes GradeBook (Figura 3.1) e GradeBookTest (Figura 3.2). A classe GradeBook (declarada no arquivo GradeBook.java) será utilizada para exibir uma mensagem na tela (Figura 3.2) que dá boas-vindas ao instrutor do aplicativo livro de notas.
  15. 15. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 15 A classe GradeBook A declaração de classe GradeBook (Figura 3.1) contém um método displayMessage (linha 17) que exibe uma mensagem na tela. Lembre-se que uma classe é como uma planta arquitetônica – precisamos criar um objeto dessa classe e chamar seu método para executar a linha 18 e exibir a mensagem. Figura 3.1 | Declaração de classe com um método.
  16. 16. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 16Figura 3.1 | Declaração de classe com um método. Comentando o código da classe GradeBook Declaração de classe inicia na linha 15; A palavra-chave public é um modificador de acesso; Par de chaves { e } – corpo de cada classe (linhas 15-22); A declaração do método começa com a palavra-chave public (linha 17) para indicar que o método está “disponível para o público” – ele pode ser chamado a partir de métodos de outras classes.
  17. 17. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 17Figura 3.1 | Declaração de classe com um método. Comentando o código da classe GradeBook Palavra-chave void (linha 17) especifica o tipo de retorno do método, que define o tipo de dados que o método retorna depois de realizar sua tarefa; O tipo de retorno void indica que esse método (linha 17) realizará uma tarefa, mas não retornará (isto é, devolverá) nenhuma informação para seu método chamador ao completar sua tarefa;
  18. 18. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 18 Figura 3.1 | Declaração de classe com um método. Comentando o código da classe GradeBook O nome do método, displayMessage, segue o tipo de retorno (linha 17); Por convenção, os nomes de método iniciam com a primeira letra minúscula e as palavras subsequentes do nome iniciam com uma maiúscula; Os parênteses depois do nome do método indicam que isso é um método. Os parênteses vazios, como na linha 17, indicam que esse método não requer informações adicionais para realizar sua tarefa;
  19. 19. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 19Figura 3.1 | Declaração de classe com um método. Comentando o código da classe GradeBook A linha 17 é comumente referida como o cabeçalho de método; O corpo de cada método é delimitado pelas chaves esquerda e direita { e }, como nas linhas 17 – 20; O corpo de um método contém uma ou mais instruções que realizam a tarefa do método. No exemplo, o método contém uma instrução (linha 18) que exibe a mensagem “Welcome to the GradeBook!”
  20. 20. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 20 Comentando o código da classe GradeBook A classe GradeBook não é um aplicativo Java porque não contém o método principal main, o qual inicia a execução de um aplicativo Java; Se tentarmos executar GradeBook usando o NetBeans, obteríamos uma mensagem de erro como é mostrada na figura abaixo: Devemos declarar uma classe separada que contenha um método main Como resolver o problema? Colocar um método main na classe GradeBook
  21. 21. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 21 A classe GradeBookTest A declaração de classe GradeBookTest(Figura 3.2) contém o método main que controlará a execução do aplicativo. Figura 3.2 | Criando um objeto GradeBook e chamando seu método displayMessage. A declaração de classe GradeBookTest inicia na linha 14 e termina na linha 25; A classe contém somente um método GradeBookTest, que é típico de muitas classes que iniciam a execução de um aplicativo Java; As linhas 14 – 23 declaram o método main, que é um método static; Um método static é especial, porque pode ser chamado sem primeiro criar um objeto da classe em que o método é declarado.
  22. 22. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 22 Comentando a classe GradeBookTest Na classe GradeBookTest, gostaríamos de chamar o método displayMessage da classe GradeBook (Figura 3.1) para exibir a mensagem de boas-vindas na janela de comando; Em geral, não podemos chamar um método que pertence a outra classe até que seja criado um objeto dessa classe, como mostrado na linha 18 da Figura 3.2. Figura 3.1 | Declaração de classe com um método.
  23. 23. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 23 Comentando a classe GradeBookTest Linha 18 – declaração da variável myGradeBook, que é do tipo GradeBook – a classe que foi declarada na Figura 3.1; A variável myGradeBook é inicializada com o resultado da expressão de criação de instância de classe new GradeBook(). Figura 3.2 | Criando um objeto GradeBook e chamando seu método displayMessage. Assim como podemos usar o objeto System.out para chamar os métodos print, printf e println, também podemos usar o objeto myGradeBook para chamar o método displayMessage; A instrução da linha 21 myGradeBook.displayMessage() ; é uma chamada de método, fazendo com que o método displayMessage realize sua tarefa.
  24. 24. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 24 Diagrama de classes UML para a classe GradeBook A Figura 3.3 apresenta um diagrama de classes UML para a classe GradeBook da Figura 3.1. GradeBook + displayMessage( ) Figura 3.3 | Diagrama de classe UML indicando que a classe GradeBook tem uma operação public displayMessage.
  25. 25. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 25 Diagrama de classes UML para a classe GradeBook Na UML, cada classe é modelada em um diagrama de classe como um retângulo com três compartimentos. Compartimento superior Compartimento do meio Compartimento inferior Contém o nome da classe centralizado horizontalmente no tipo negrito Contém os atributos da classe (variáveis de instâncias) em Java GradeBook + displayMessage( ) O compartimento está vazio porque essa classe GradeBook não tem nenhum atributo. Contém as operações da classe, que correspondem aos métodos em Java Figura 3.3 | Diagrama de classe UML indicando que a classe GradeBook tem uma operação public displayMessage.
  26. 26. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 26 Comentando o Diagrama de classes UML para a classe GradeBook A UML modela operações listando o nome da operação precedido por um modificador de acesso (nesse caso +) e seguido por um conjunto de parênteses (ver Figura 3.3); A classe GradeBook tem um método, displayMessage, então o compartimento inferior da Figura 3.3 lista uma operação com esse nome; O método displayMessage não requer informações adicionais para executar suas tarefas, portanto os parênteses depois do nome do método no diagrama de classe estão vazios;
  27. 27. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 27 Comentando o Diagrama de classes UML para a classe GradeBook O sinal de adição ( + ) na frente do nome da operação indica que displayMessage é uma operação public na UML (isto é, um método public no Java). Usaremos com freqüência os diagramas de classe UML para resumir os atributos e as operações de uma classe Java. GradeBook + displayMessage( ) Figura 3.3 | Diagrama de classe UML indicando que a classe GradeBook tem uma operação public displayMessage.
  28. 28. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 28 Declarando um método com um parâmetro Em analogia com o carro, discutimos o fato de que pressionar o acelerador de um carro envia uma mensagem para ele realizar uma tarefa – fazer o carro andar mais rápido. Mas quanto o carro deve acelerar? Quanto mais pressionarmos o pedal, mais rápido o carro irá acelerar; • Então a mensagem para o carro na verdade inclui a tarefa a ser realizada e informações adicionais que ajudam o carro a executar essa tarefa. Essas informações adicionais são conhecidas como parâmetro – o valor do parâmetro ajuda o carro a determinar com que rapidez acelerar.
  29. 29. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 29 Declarando um método com um parâmetro De maneira semelhante, um método pode exigir um ou mais parâmetros que representam informações adicionais necessárias para realizar a tarefa; Os parâmetros são definidos em uma lista de parâmetros separados por vírgula, que está localizada nos parênteses depois do nome do método; Todo parâmetro deve especificar um tipo e um identificador; A lista de parâmetros pode conter qualquer número de parâmetros, inclusive nenhum parâmetro; Os parênteses vazios que se seguem ao nome de método indicam que um método não requer nenhum parâmetro.
  30. 30. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 30 Declarando um método com um parâmetro Uma chamada de método fornece valores – chamados argumentos – para cada um dos parâmetros do método; • Por exemplo, o método System.out.println exige um argumento que especifica que dados enviar para a saída em uma janela de comando; • De maneira semelhante, para fazer um depósito em uma conta bancária, um método deposit especifica um parâmetro que representa a quantidade de depósito; Quando o método deposit é chamado um valor de argumento que representa a quantidade de depósito é atribuído ao parâmetro do método. O método então faz um depósito dessa quantia.
  31. 31. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 31 Laboratório - declarando um método com um parâmetro Declarar uma classe GradeBook2 com um método displayMessage que exibe o nome do curso como parte da mensagem de boas-vindas. O novo método displayMessage requer um parâmetro que representa o nome do curso a ser enviado para a saída. Ferramenta: NetBeans IDE 7.0
  32. 32. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 32 Saída do programa Figura 3.5 | Criando um objeto GradeBook2 e passando uma String ao seu método displayMessage.
  33. 33. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 33 Comentando as classes GradeBook2 e GradeBook2Test Classe GradeBook2 Classe GradeBook2Test Figura 3.4 Figura 3.5
  34. 34. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 34 Comentando as classes GradeBook2 e GradeBook2Test Linha 24: System.out.println( “Please enter the course name:” ); exibe um prompt que pede para o usuário inserir o nome do curso; Linha 25: String nameOfCourse = input.nextLine( ); mostra o nome do usuário e o atribui à variável nameOfCourse, utilizando o método Scanner nextLine para realizar a tarefa; Linha 30: myGradeBook2.displayMessage( nameOfCourse ); chama o método displayMessage de myGradeBook. A variável nameOfCourse entre parênteses é o argumento que é passado ao método displayMessage para o método realizar sua tarefa.
  35. 35. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 35 Mais sobre argumentos e parâmetros Na Figura 3.4, a lista de parâmetros de displayMessage (linha 15) public void displayMessage( String courseName) { declara um parâmetro indicando que o método requer uma String para executar sua tarefa. Quando o método é chamado, linha 30 (Figura 3.5), myGradeBook2.displayMessage( nameOfCourse );, o valor de argumento na chamada é atribuído ao parâmetro correspondente (nesse caso, courseName) no cabeçalho do método (linha 15) da Figura 3.4; Public void displayMessage( String courseName ){; O número de argumentos em uma chamada de método deve corresponder ao número de parâmetros na lista de parâmetros da declaração do método.
  36. 36. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 36 Diagrama de classes UML para a classe GradeBook2 O diagrama de classe UML da Figura 3.6 modela a classe GradeBook2 da Figura 3.4. Como a Figura 3.3, essa classe GradeBook2 contém displayMessage, uma operação public e um parâmetro. A UML modela um parâmetro de um modo pouco diferente do Java listando o nome de parâmetro, seguido por dois pontos e pelo tipo de parâmetro nos parênteses que seguem o nome da operação; GradeBook2 + displayMessage( courseName: String ) Figura 3.6 | Diagrama de classe UML indicando que a classe GradeBook2 tem uma operação displayMessage com um parâmetro courseName de tipo UML String.
  37. 37. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 37 Variáveis de instância, métodos set e get Nos exemplos já vistos, declaramos todas as variáveis de um aplicativo no método main do aplicativo. As variáveis declaradas no corpo de um método particular são conhecidas como variáveis locais e só podem ser utilizadas nesse método. Um objeto tem atributos que são carregados com o objeto quando ele é utilizado em um programa. • Os atributos de um objeto existem antes de um método ser chamado em um objeto e depois de o método completar a execução. Os atributos são representados como variáveis em uma declaração de classe.
  38. 38. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com Instância da classe 38 Classe Cadeira Objetos (material, braço, cor, tipo, etc) Atributos (madeira, plano, verde, diretor) Métodos (displayCor) Campos: variáveis que representam atributos de um objeto em uma declaração de classe, mas fora do corpo das declarações de método da classe; Variáveis de instâncias: campos que representam as cópias dos atributos de um objeto. Um exemplo nessa seção demonstra uma classe GradeBook que contém uma variável de instância courseName para representar o nome do curso de um objeto GradeBook particular. Instâncias da classe
  39. 39. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 39 Classe GradeBook3 com uma variável de instância, um método set e um método get No próximo aplicativo (Figuras 3.7 e 3.8), a classe GradeBook3 (Figura 3.7) mantém o nome do curso como uma variável de instância para que ele possa ser utilizado ou modificado a qualquer hora durante a execução de um aplicativo; A classe contém três métodos – setCourseName, getCourseName e displayMessage; método setCourseName – armazena o nome de um curso de um GradeBook3; método getCourseName – obtém o nome do curso de um GradeBook3; método displayMessage – exibe uma mensagem de boas-vindas que inclui o nome do curso. O método obtém o nome do curso chamando outro método na mesma classe – getCourseName.
  40. 40. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 40 Comentando a classe GradeBook3 Figura 3.7 | A classe GradeBook3 que contém uma variável de instância coursename e métodos para configurar e obter seu valor
  41. 41. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 41 COMENTANDO O CÓDIGO Linha 16: private String courseName; declara que courseName é uma variável de tipo String, dentro do corpo da classe, mas fora dos corpos de seus métodos; Toda instância (isto é, objeto) de classe GradeBook3 contém uma cópia de cada variável de instância. Figura 3.7 | A classe GradeBook3 que contém uma variável de instância courseName e métodos para configurar e obter seu valor.
  42. 42. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 42 Modificadores de acesso public e private A maioria das declarações de variável de instância é precedida pela palavra-chave private (linha 16); Como public, a palavra-chave private é um modificador de acesso; Dessa forma, a variável courseName só pode ser utilizada nos métodos setCourseName, getCourseName e displayMessage da classe GradeBook3; A declaração de variáveis de instância com o modificador de acesso private é conhecida como ocultamento de dados ou ocultamento de informações; Quando um programa cria (instancia) um objeto de classe GradeBook3, a variável courseName é encapsulada (ocultada) no objeto e pode ser acessada apenas por métodos da classe do objeto.
  43. 43. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 43 Métodos setCourseName e getCourseName O método setCourseName (linhas 19-21) não retorna quaisquer dados quando ele completa sua tarefa, portanto, seu tipo de retorno é void; O método recebe um parâmetro - name – que representa o nome do curso que será passado para o método como um argumento; A linha 20 atribui name à variável de instância courseName; O método getCourseName (linhas 24-26) devolve um objeto courseName específico de GradeBook3; O método tem uma lista vazia de parâmetros, então não exige informações adicionais para realizar sua tarefa. Figura 3.7 | A classe GradeBook3 que contém uma variável de instância courseName e métodos para configurar e obter seu valor.
  44. 44. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 44 Métodos setCourseName e getCourseName O método getCourseName especifica (linha 25) que ele retorna uma String – esse é o tipo de retorno do método; A instrução return na linha 25 passa o valor da variável de instância courseName de volta à instrução que chama o método getCourseName; Considere, a linha 31 do método displayMessage, que chama o método getCourseName. Quando o valor é retornado, a instrução na linha 31 utiliza esse valor para gerar o nome do curso. Figura 3.7 | A classe GradeBook3 que contém uma variável de instância courseName e métodos para configurar e obter seu valor.
  45. 45. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 45 Laboratório – Classe com uma variável de instância, um método set e um método get Crie duas classes Java ClasseLab2 e ClasseLab2Teste, respectivamente, com o seguinte cenário: Você tem um método square que retorna o quadrado de seu argumento, onde você esperaria que a instrução: int result = square( 2 ); retornasse 4 a partir do método square e atribuísse 4 à variável result. int biggest = maximum( 27, 114, 51 ); retornasse 114 a partir do método maximum e atribuísse 114 à variável biggest. Ferramenta: NetBeans IDE 7.0
  46. 46. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 46 O método displayMessage O método displayMessage (linhas 29-31) não retorna quaisquer dados quando ele completa sua tarefa, portanto, seu tipo de retorno é void; O método não recebe parâmetros, então, a lista de parâmetros está vazia. Figura 3.7 | A classe GradeBook3 que contém uma variável de instância courseName e métodos para configurar e obter seu valor.
  47. 47. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 47 A classe GradeBook3Test que demonstra a classe GradeBook3Test
  48. 48. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 48 A classe GradeBook3Test (Figura 3.8) cria um objeto da classe GradeBook3 e demonstra seus métodos; A linha 23 cria um objeto GradeBook3 e o atribui à variável local myGradeBook3 de tipo GradeBook3; A linha 26 exibe o nome do curso inicial que chama o método getCourseName do objeto; Observe que a primeira linha de saída mostra o nome “null”. Diferentemente das variáveis locais, que não são automaticamente inicializadas, todo campo tem um valor inicial padrão – um valor fornecido pelo Java quando você não especifica o valor inicial do campo; O valor padrão de um campo do tipo String (como courseName nesse exemplo) é null; A linha 29 exibe um prompt que pede para o usuário inserir o nome de um curso; A variável String theName local (declarada na linha 30) é inicializada com o nome do curso inserido pelo usuário, que é retornado pela chamada ao método nextLine do objeto Scanner input; A linha 31 chama o método setCourseName do objeto myGradeBook3 e armazena theName como o argumento do método.
  49. 49. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 49 Métodos set e get Os campos private de uma classe só podem ser manipulados pelos métodos de classe; Um cliente de um objeto – isto é, qualquer classe que chama os métodos do objeto – chama métodos public da classe para manipular os campos private de um objeto da classe; As classes costumam fornecer métodos public para permitir a clientes configurar (set, isto é, atribuir valores a) ou obter (get, isto é, obter os valores de) variáveis de instância private; Os nomes desses métodos não precisam começar com set ou get, mas essa convenção de atribuição de nomes é recomendada e requerida para componentes de software Java especiais, denominados JavaBeans, que podem simplificar a programação em muitos ambientes de desenvolvimento integrado Java (Integrated Development Environments – IDEs). O método que configura (set) a variável de instância courseName nesse exemplo chama-se setCourseName e o método que obtém (get) o valor de courseName chama-se getCourseName.
  50. 50. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 50 Diagrama de classe UML do GradeBook3 com uma variável de instância e os métodos set e get A Figura 3.9 contém um diagrama de classe UML atualizado para a versão da classe GradeBook; Esse diagrama modela a variável de instância courseName da classe GradeBook3 como um atributo no compartimento no meio da classe. GradeBook3 - courseName: String + setCourseName( name: String ) + getCourseName( ): String + displayMessage( ) Figura 3.9 | O diagrama de classes UML que indica que a classe GradeBook3 tem um atributo courseName privado do tipo UML String e três operações públicas – setCourseName (com um parâmetro name do tipo UML String, getCourseName (que retorna o tipo UML String e displayMessage.
  51. 51. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 51 GradeBook3 - courseName: String + setCourseName( name: String ) + getCourseName( ): String + displayMessage( ) Considerações sobre o diagrama da Figura 3.9 A UML representa as variáveis de instância como atributos listando o nome do atributo, seguido por um caractere de dois-pontos e o tipo de atributo; O tipo UML do atributo courseName é String; A variável de instância courseName é private em Java, portanto, o diagrama de classe lista um modificador de acesso com o sinal de subtração ( - ) na frente do nome do atributo correspondente; A classe GradeBook3 contém três métodos public, então o diagrama de classe lista três operações no terceiro compartimento; A operação setCourseName tem um parâmetro String chamado name; A UML indica o tipo de retorno de uma operação colocando um dois-pontos e o tipo de retorno depois dos parênteses que se seguem ao nome da operação. Figura 3.9 | O diagrama de classes UML que indica que a classe GradeBook3 tem um atributo courseName privado do tipo UML String e três operações públicas – setCourseName (com um parâmetro name do tipo UML String, getCourseName (que retorna o tipo UML String e displayMessage.
  52. 52. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 52 Tipos primitivos vs. tipos por referência Os tipos do Java são divididos em tipos primitivos e tipos por referência; Os tipos primitivos são: boolean byte char short int long float double Todos os tipos não primitivos são tipos por referência, portanto, as classes, que especificam os tipos de objeto, são tipos por referência.
  53. 53. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 53 Tipos primitivos vs. tipos por referência Uma variável de tipo primitivo pode armazenar exatamente um valor de seu tipo declarado por vez. Por exemplo, uma variável int pode armazenar um número inteiro (como 7) por vez; As variáveis de instância de tipo primitivo são inicializadas por padrão – as variáveis dos tipos byte, char, short, int, long, float e double são inicializadas como 0, e as variáveis do tipo boolean são inicializadas como false; Lembre-se de que as variáveis locais não são inicializadas por padrão; Os programas utilizam as variáveis de tipos por referência (normalmente chamadas referências) para armazenar as localizações de objetos na memória do computador. Diz-se que tal variável referencia um objeto no programa.
  54. 54. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 54 Tipos primitivos vs. tipos por referência A linha 23 da Figura 3.8, GradeBook3 myGradeBook3 = new GradeBook3();, cria um objeto de classe GradeBook3 e a variável myGradeBook3 contém uma referência a esse objeto GradeBook3; As variáveis de instância de tipo por referência são inicializadas por padrão com um valor null – uma palavra reservada que representa uma “referência a nada”. Essa é a razão por que a primeira chamada a getCourseName na linha 26 da Figura 3.8 retornou null – o valor de courseName não foi configurado, assim o valor inicial padrão null foi retornado; Na Tabela a seguir, são mostradas as palavras reservadas e palavras-chave da linguagem Java.
  55. 55. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 55 Palavras reservadas e palavras-chave do Java Palavras-chave do Java abstract assert boolean break byte case catch char class continue default do double else enum extends final finally float for if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronnized this throw throws transient try void volatile while Palavras-chave que não são atualmente utilizadas const goto O Java também contém as palavras reservadas true e false, que são literais boolean e null, que é o literal que representa uma referência a nada. Assim como as palavras-chave, essas palavras reservadas não podem ser utilizadas como identificadores.
  56. 56. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 56 Inicializando objetos com construtores Como vimos, quando um objeto de classe GradeBook3 (Figura 3.7) é criado, sua variável de instância courseName é inicializada como null por padrão; E se quisermos fornecer o nome de um curso quando criarmos um objeto GradeBook3? Cada classe declarada pode fornecer um método especial chamado construtor que pode ser utilizado para inicializar um objeto desta classe, isso é um padrão Java; Um construtor deve ter o mesmo nome que a classe; A Figura 3.10 contém uma classe GradeBook4 com um construtor que inicializa um objeto desta classe.
  57. 57. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 57 Comentando a classe GradeBook4 Figura 3.10 | A classe GradeBook4 com um construtor para inicializar o nome do curso. As linhas 18 a 22 declaram o construtor de GradeBook4; Como um método, a lista de parâmetros de um construtor especifica os dados que ele requer para realizar sua tarefa; A linha 18 indica que o construtor tem um parâmetro String chamado name; O name passado para o construtor é atribuído à variável de instância courseName na linha 19; A Figura 3.11 inicializa os objetos GradeBook4 utilizando o construtor.
  58. 58. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 58 O construtor de GradeBook4 usado para especificar o nome do curso a partir de seus objetos criados Figura 3.11 | O construtor de GradeBook4. Saída do programa.
  59. 59. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 59 Comentando a classe GradeBook4Test Figura 3.11 | O construtor de GradeBook4. As linhas 18-19 criam e inicializam um objeto GradeBook4 gradeBook1; O construtor de GradeBook4 é chamado com o argumento “CS101 Introduction to Java Programming” para inicializar o nome do curso; A expressão de criação de instância de classe nas linhas 18-19 retorna uma referência ao novo objeto, que é atribuído à variável gradeBook1; As linhas 20-21 repetem esse processo, dessa vez passando o argumento “CS102 Data Structures in Java” para inicializar o nome do curso de gradeBook2; As linhas 24-27 utilizam o método getCourseName de cada objeto para obter os nomes de curso e mostrar que eles foram inicializados quando os objetos foram criados. Nota: Uma diferença importante entre construtores e métodos é que os construtores não podem retornar valores, portanto, não podem especificar um tipo de retorno (nem mesmo void).
  60. 60. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 60 Adicionando o construtor ao diagrama de classe UML da classe GradeBook4 O diagrama de classe UML da Figura 3.12 modela a classe GradeBook4 da Figura 3.10, que tem um construtor que possui um parâmetro name de tipo String; Assim como operações, a UML modela construtores no terceiro compartimento de uma classe em um diagrama de classe; Para distinguir entre um construtor e operações de uma classe, a UML requer que a palavra “constructor” seja colocada entre aspas francesas (<< e >>) antes do nome do construtor; É habitual listar construtores antes de outras operações no terceiro compartimento.
  61. 61. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 61 GradeBook4 - courseName: String <<constructor>> GradeBook4( name: String ) + setCourseName( name: String ) + getCourseName( ): String + displayMessage( ) Figura 3.12 | Diagrama de classe UML que indica que a classe GradedeBook4 tem um construtor com um parâmetro name de tipo UML String. Diagrama de classe UML da classe GradeBook4
  62. 62. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 62 Construtores com múltiplos parâmetros Às vezes é recomendável inicializar objetos com múltiplos dados. Por exemplo, o Exercício 3.11, Deitel – Java – Como Programar, edição 8, p. 79, solicita que você armazene o nome do curso e o nome do instrutor em um objeto GradeBook. Nesse caso, o construtor de GradeBook seria modificado para receber duas Strings, como em: public GradeBook4( String courseName, String instructorName ) e você chamaria o construtor de GradeBook4 desta maneira: GradeBook4 gradebook = new GradeBook4( “CS101 Introduction to Java Programming”, “Sue Green” );
  63. 63. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 63 Números de ponto flutuante e tipo double Agora, temporariamente deixamos de lado nosso estudo de caso GradeBook para declarar uma classe Account que mantém o saldo de uma conta bancária; A maioria dos saldos de conta não é constituída de números inteiros (por exemplo, 0, -22 e 1024); Por essa razão, a classe Account representa o saldo de conta como um número de ponto flutuante (isto é, um número com um ponto de fração decimal, como 7,33, 0,0975 ou 1.000, 12345); O Java fornece dois tipos primitivos para armazenar números de ponto flutuante na memória – float e double; A principal diferença entre eles é que as variáveis double podem armazenar números com maior magnitude e mais detalhes (isto é, mais dígitos à direita do ponto de fração decimal – também conhecido como a precisão do número) do que as variáveis float.
  64. 64. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 64 Precisão de número de ponto flutuante e requisitos de memória As variáveis do tipo float representam números de ponto flutuante de precisão simples e podem representar até sete dígitos significativos; As variáveis do tipo double representam números de ponto flutuante de precisão dupla. Essas requerem duas vezes a quantidade de memória das variáveis float e fornecem 15 dígitos significativos – aproximadamente o dobro da precisão de variáveis float; Por padrão, o Java trata todos os números de ponto flutuante como do tipo double, pois variáveis double podem representar números de ponto flutuante com mais exatidão. Para números de ponto flutuante precisos, o Java fornece a classe BigDecimal (pacote java.math).
  65. 65. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 65 A classe Account com uma variável de instância do tipo double Nosso próximo aplicativo (Figuras 3.13-3.14) contém uma classe chamada Account (Figura 3-13) que mantém o saldo de uma conta bancária; Um banco típico atende muitas contas, cada uma com um saldo próprio, portanto a linha 15 Declara uma variável de instância chamada balance do tipo double; A variável balance é uma variável de instância porque é declarada no corpo da classe, mas fora das declarações de método da classe (linhas 18-23, 26-28 e 31-33); Cada instância (isto é, objeto) de classe Account contém sua própria cópia de balance.
  66. 66. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 66 Comentando a classe Account A classe tem um construtor e dois métodos; É comum que alguém abre uma conta deposite o dinheiro imediatamente, assim o construtor (linhas 18-23) recebe um parâmetro initialBalance do tipo double e que representa o saldo inicial; As linhas 21-22 asseguram que initialBalance seja maior do que 0.0. Se for, o valor de initialBalance é atribuído à variável de instância balance. Caso contrário, balance permanece em 0.0 – seu valor inicial padrão; O método credit (linhas 26-28) não retorna quaisquer dados quando ele completa sua tarefa, portanto, seu tipo de retorno é void; Figura 3.13 | A classe Account com um construtor para validar e inicializar a variável de instância balance do tipo double.
  67. 67. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 67 Comentando a classe Account O método credit (linhas 26-28) recebe um parâmetro chamado amount – um valor double que será adicionado ao saldo; A linha 27 adiciona amount ao valor atual de balance, então atribui o resultado ao balance (substituindo assim a quantia do saldo anterior); O método getBalance (linhas 31- 33) permite aos clientes da classe (isto é, outras classes que utilizam essa classe) obter o valor do balance de um objeto Account particular. O método especifica o tipo de retorno double e uma lista vazia de parâmetros; Observe que as instruções nas linhas 22, 27 e 32 utilizam a variável de instância balance mesmo se ela não tiver sido declarada em nenhum dos métodos, ela é uma variável de instância da classe Account. Figura 3.13 | A classe Account com um construtor para validar e inicializar a variável de instância balance do tipo double.
  68. 68. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 68 A classe AccountTest para utilizar a classe Account A classe AccountTest (Figura 3.14) cria dois objetos Account (linhas 17- 18) e os inicializa com 50.00 e -7.53, respectivamente; As linhas 21-24 geram a saída do saldo em cada Account chamando o método getBalance da Account; Quando o método getBalance é chamado por account1, a partir da linha 22, o valor do saldo da account1 é retornado da linha 32 da Figura 3.13 e exibido pela instrução System.out.printf (Figura 3.14, linhas 23-24); De maneira semelhante, quando o método getBalance for chamado por account2, da linha 24, o valor do saldo da account2 é retornado da linha 32 da Figura 3.13 e exibido pela instrução System.out.printf (Figura 3.14, linhas 23-24)Figura 3.14 | Entrada e saída de números de ponto flutuante com objetos Account.
  69. 69. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 69 A classe AccountTest para utilizar a classe Account Observe que o saldo de account2 é 0.00, porque o construtor assegurou que a conta não poderia iniciar com um saldo negativo; A saída do valor é gerada por printf com o especificador de formato %.2f; O especificador de formato %f é utilizado para gerar saída de valores de tipo float ou double; 0.2 entre % e f representa o número de casas decimais (2) que devem ser enviadas para a saída à direita do ponto de fração decimal no número de ponto flutuante – também conhecido como a precisão do número; Qualquer saída de valor de ponto flutuante com %.2f será arredondada para a casa decimal dos centésimos – por exemplo, 123,457 seria arredondado para 123,46.Figura 3.14 | Entrada e saída de números de ponto flutuante com objetos Account.
  70. 70. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 70 A classe AccountTest para utilizar a classe Account A linha 28 declara a variável local depositAmount para armazenar cada quantia de depósito inserida pelo usuário; Ao contrário da variável de instância balance na classe Account, a variável local depositAmount em main não é inicializada como 0.0 por padrão. Entretanto, essa variável não precisa ser inicializada aqui porque seu valor será determinado pela entrada do usuário; A linha 30 pede ao usuário para inserir uma quantia de depósito para account1; A linha 31 obtém a entrada do usuário chamando o método nextDouble do objeto input de Scanner, que retorna um valor double inserido pelo usuário; Figura 3.14 | Entrada e saída de números de ponto flutuante com objetos Account.
  71. 71. Engenharia da Computação Prof. Cícero Quarto – cicero.uema@gmail.com 71 A classe AccountTest para utilizar a classe Account As linhas 32-33 exibem o quanto foi depositado; A linha 34 chama o método credit do objeto account1 e armazena depositAmount como argumento do método. Quando o método é chamado, o valor do argumento é atribuído ao parâmetro amount (linha 26 da Figura 3.13) do método credit (linhas 26-28 da Figura 3.13), então o método credit adiciona esse valor ao balance (linha 27 da Figura 3.13); Figura 3.14 | Entrada e saída de números de ponto flutuante com objetos Account.

×