1. O documento apresenta os conceitos básicos de programação orientada a objetos, incluindo classes, objetos, métodos e variáveis de instância.
2. Vários exemplos são fornecidos para demonstrar esses conceitos, incluindo classes GradeBook e Account.
3. O documento também discute diagramas de classes UML para modelar classes em Java.
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Introdução a classes e objetos
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Engenharia da Computação
Prof. Cícero Quarto – cicero.uema@gmail.com
47
A classe GradeBook3Test que demonstra a
classe GradeBook3Test
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.