TrabalhosGratuitos.com - Trabalhos, Monografias, Artigos, Exames, Resumos de livros, Dissertações
Pesquisar

Programacao Java

Trabalho Escolar: Programacao Java. Pesquise 860.000+ trabalhos acadêmicos

Por:   •  11/10/2013  •  8.627 Palavras (35 Páginas)  •  389 Visualizações

Página 1 de 35

Novatec

Programação Java

com Ênfase em Orientação a Objetos

Douglas Rocha Mendes

16

capítulo 1

Introdução à linguagem Java

O capítulo 1 inclui o histórico da linguagem Java, detalhes que formam a linguagem,

a plataforma Java, uma breve descrição sobre orientação a objetos, operadores

matemáticos, tipos de dados primitivos e, por fim, as estruturas de controle e repetição.

No final do capítulo está disponível uma lista de exercícios e o laboratório 1,

que exercita a teoria apresentada no capítulo. Esse laboratório será progressivo e

se estenderá até o capítulo 9.

1.1 Histórico da linguagem

A tecnologia Java foi criada como uma ferramenta de programação de um projeto

da Sun Microsystems, chamado The Green Project, iniciado por Patrick Naughton,

Mike Sheridan e James Gosling, em 1991. Esse projeto tinha como principal objetivo

criar uma nova plataforma para a computação interativa, ou seja, a linguagem de

programação não era o principal objetivo do projeto. No verão de 1992 foi gerada

a primeira demonstração do projeto, que representou um sistema executando em

um handheld com capacidade de controle remoto que ainda oferecia uma interface

sensível ao toque (touchscreen) interativa. Esse handheld foi chamado de *7 (star

seven), por esta ser a forma de atender (ou puxar) chamadas telefônicas entre os

telefones dos integrantes da equipe. A figura 1.1 apresenta um exemplo da aparência

do *7.

O *7 foi capaz de controlar uma grande variedade de dispositivos de uso doméstico,

enquanto apresentava uma interface com animação. O sistema criado para o

handheld foi executado em um novo processador independente de linguagem de

programação. A linguagem utilizada nesse sistema foi chamada de Oak (“carvalho”,

em inglês), com base na paisagem que James Gosling tinha de sua janela.

Capítulo 1 ■ Introdução à linguagem Java 17

Figura 1.1 – Handheld *7(Star seven).

Em 23 de maio de 1995, John Gage, diretor da Sun Microsystems, e Marc

Andreessen, um executivo da Netscape, anunciaram o lançamento da plataforma

Java, composta pela Java Virtual Machine (JVM) e pela API (Application Programming

Interface) Java. Tal plataforma foi, então, inserida no Netscape Navigator, o

principal browser de acesso à Internet usado na época.

1.2 Características da linguagem de programação Java

A linguagem de programação Java representa uma linguagem simples, orientada a

objetos, multithread, interpretada, neutra de arquitetura, portável, robusta, segura

e que oferece alto desempenho. É importante observar que a tecnologia Java é composta

de uma linguagem de programação e de uma plataforma (API e a máquina

virtual). A seguir, cada uma das características citadas é descrita.

1.2.1 Simples

A linguagem Java é considerada simples porque permite o desenvolvimento de

sistemas em diferentes sistemas operacionais e arquiteturas de hardware, sem que

o programador tenha que se preocupar com detalhes de infra-estrutura. Dessa

forma, o programador consegue desempenhar seu trabalho de uma forma mais

produtiva e eficiente.

Pensando em tornar a linguagem o mais simples possível, os projetistas da linguagem

Java optaram por não implementar o uso do conceito de herança múltipla,

de sobrecarga de operadores, ponteiros nem a operação aritmética com esse tipo

de dado. Essas características podem ser encontradas em outras linguagens, como

C ou C++.

18 Programação Java com Ênfase em Orientação a Objetos

1.2.2 Orientada a objetos

A linguagem Java foi criada seguindo o paradigma da orientação a objetos e, por isso,

traz de forma nativa a possibilidade de o programador usar os conceitos de herança,

polimorfismo e encapsulamento. O paradigma da orientação a objetos existe desde

a década de 70, mas somente após o sucesso da linguagem Java é que o paradigma

ganhou credibilidade. O paradigma de orientação a objetos traz um enfoque diferente

da programação estruturada, no sentido de adotar formas mais próximas do

mecanismo humano para gerenciar a complexidade de um sistema. Nesse paradigma,

o mundo real é visto como sendo constituído de objetos autônomos, concorrentes,

que interagem entre si, e cada objeto tem seu próprio estado (atributos) e comportamento

(métodos), semelhante a seu correspondente no mundo real.

Quando desenvolvemos programas orientados a objetos e estruturados temos

dois paradigmas totalmente diferentes. A forma de pensar e escrever o código são

diferentes. É importante observar que muitos programadores usam a linguagem Java,

mas continuam pensando no formato estruturado. Essa má prática de programação

é muito freqüente em estudantes e profissionais que utilizam Java diariamente.

Este livro objetiva minimizar esta má prática do uso da linguagem Java. A seguir

é apresentada uma comparação entre o desenvolvimento de um sistema bancário

usando o paradigma da programação estruturada e o paradigma da programação

orientada a objetos.

1.2.2.1 Comparação entre o paradigma da programação estruturada e paradigma da orientação

a objetos

Considere o exemplo de um sistema bancário com os seguintes requisitos funcionais:

■ Manter o cliente (envolvendo inserir cliente, remover cliente, selecionar cliente

e atualizar cliente).

■ Manter conta (envolvendo abrir conta, fechar conta, alterar conta, pesquisar

conta e remover conta).

■ Movimentar caixa (envolvendo sacar, depositar e transferir).

■ Registrar movimento (envolvendo gerar histórico).

■ Emitir relatórios contábeis.

No paradigma utilizado pelo modelo estruturado seria necessário criar um programa

para manter clientes, um programa para manter conta, um programa para

movimentar caixa e um programa para emitir os relatórios. Cada programa deverá

Capítulo 1 ■ Introdução à linguagem Java 19

ser executado por um programa principal, ou seja, um programa com o método

main(). Cada programa e também o programa principal têm um conjunto de variáveis

específicas para suas necessidades. Cada variável que precisar ser compartilhada com

outros programas deve ser criada como global e, se estivermos usando a linguagem

C, esta deveria ser externalizada (definir a variável como extern em outro programa)

para outros programas. Um ambiente estruturado nos limita apenas a identificar

os programas que serão envolvidos na implementação do sistema.

Neste modelo de programação, a reutilização é pequena, e a redundância é

grande. No paradigma procedural, quando existe alguma modificação, muitas vezes

pelo alto acoplamento entre os programas, é necessário alterar vários programas

e novamente testar todo o sistema. No modelo estruturado ficamos limitados a

identificar os programas necessários e, no máximo, a criar funções que possam ser

reutilizadas em outros programas. No paradigma da orientação a objetos temos

outras possibilidades, tais como o uso de encapsulamento para oferecer segurança

à classe, herança que permite a reutilização de código, polimorfismo e padrões de

projeto, todos explorados de forma detalhada neste livro.

No caso do paradigma da orientação a objetos, inicialmente precisamos identificar

nossas classes com seus atributos e métodos. Como técnica para identificar

classes temos a análise dos substantivos e locuções substantivas (dois substantivos

juntos), listados pelos requisitos funcionais (Use Cases). Assim, para o exemplo

apresentado, teríamos as classes Conta, Pessoa, Cliente, Gerente de Relacionamento,

Contabilidade, Movimentação e Histórico, entre outras. Percebam que nesta

abordagem identificamos os substantivos e locuções substantivas descritos pelos

requisitos funcionais.

É importante observar que no paradigma da programação orientada a objetos

não nos preocupamos em definir quantos programas seriam necessários e sim

quais seriam os substantivos utilizados pelo sistema. Cada substantivo representa

um objeto no mundo real e uma classe em nosso sistema. Cada classe seria representada

por um novo programa Java. Outra vantagem do paradigma da orientação

a objetos é a possibilidade de usar uma ferramenta de modelagem para a geração

de código.

1.2.3 Multithread

A plataforma Java permite a criação de programas que implementam o conceito

multithread, incluindo sofisticados mecanismos de sincronização entre processos.

O multithreading é uma técnica de programação concorrente, que permite projetar

e implementar aplicações paralelas de forma eficiente.

20 Programação Java com Ênfase em Orientação a Objetos

1.2.4 Interpretada

A linguagem Java é interpretada, ou seja, após a compilação é gerado um arquivo

intermediário (nem texto nem executável) no formato bytecode, que poderá ser

executado em qualquer arquitetura (Windows, Linux, Mac e Unix) que tenha uma

máquina virtual Java instalada. A linkedição do programa no formato bytecode é

realizada no momento de sua execução de forma simples e totalmente gerenciada

pela JVM (Java Virtual Machine).

1.2.5 Independência de arquitetura

A linguagem Java está projetada para dar suporte a sistemas que serão implementados

em plataformas heterogêneas (hardware e software), como ambiente Unix,

Linux e Mainframe. Nesses ambientes, o sistema deve ser capaz de ser executado

em diferentes hardwares, como servidor Unix da HP ou servidor Unix da IBM. Para

acomodar essa situação de interoperabilidade, o compilador Java gera os programas

em um formato conhecido por bytecode (um formato intermediário de código projetado

para permitir que múltiplos hardwares e softwares executem o mesmo código),

permitindo que um programa Java seja executado em qualquer arquitetura.

1.2.6 Portabilidade

O que garante a portabilidade dos programas desenvolvidos em Java é a Máquina

Virtual Java (Java Virtual Machine – JVM). Trata-se de uma especificação na qual o

compilador Java de cada plataforma irá se basear para gerar o código em bytecode.

Na linguagem de programação Java, todo código-fonte deve ser primeiramente

escrito em um arquivo no formato de texto e ser gravado em um arquivo com a

extensão .java. Após a compilação desse arquivo pelo compilador (javac.exe), um

novo arquivo será automaticamente criado com o mesmo nome do arquivo-fonte,

entretanto, com a extensão .class. O arquivo com extensão .class gerado representa

um arquivo no formato bytecode e poderá ser executado em qualquer plataforma

que tiver uma JVM instalada. Uma vez gerado o arquivo no formato bytecode, será

possível executar o programa com o arquivo java.exe. O programa java.exe executa

um programa Java como uma instância da JVM. A figura 1.2 apresenta as etapas

para compilação e execução de um programa Java.

Na figura 1.2 há um programa Java sendo submetido ao compilador que irá

gerar um arquivo bytecode com a extensão .class independente da arquitetura do

sistema operacional utilizado. Esse .class poderá ser executado por qualquer JVM

em qualquer ambiente operacional.

Capítulo 1 ■ Introdução à linguagem Java 21

Compilação

MeuPrograma.java MeuPrograma.class

Execução

Compilador

MeuPrograma.class Meu Programa

0100101...

Máquina

Virtual Java

Figura 1.2 – Etapas para compilação e execução de um programa Java.

Devido à JVM estar disponível em inúmeras plataformas, o mesmo arquivo com

extensão .class poderá ser executado em diferentes sistemas operacionais, como

Windows, Solaris, Linux ou Mac OS. A figura 1.3 apresenta um ambiente onde o mesmo

programa .class poderia estar em execução em múltiplos sistema operacionais.

Compilador

Windows UNIX MacOS

Programa Java

class OlaMundo {

public static void main(String[] args) {

System.out.print1n("Hello World!");

}

}

OlaMundo.java

Máquina

Virtual Java

Máquina

Virtual Java

Máquina

Virtual Java

Figura 1.3 – Etapas para compilação e execução de um programa Java.

1.2.7 Alto desempenho

O desempenho sempre foi um fator de comparação entre a linguagem Java, que

é interpretada, e as linguagens compiladas. A plataforma Java oferece um bom

desempenho, pois executa um código que foi previamente analisado e convertido

para um formato intermediário. Outro elemento que auxilia no bom desempenho

é o recurso de garbage collector (coletor de lixo), que é executado em segundo plano

22 Programação Java com Ênfase em Orientação a Objetos

como uma thread com baixa prioridade, procurando liberar memória que não está

sendo mais utilizada. Isso faz com que a memória liberada seja reutilizada por outra

parte do sistema, gerando um bom desempenho do sistema.

A linguagem Java também permite que um programa seja compilado em uma

plataforma (Windows, Linux ou Unix) específica. Entretanto, nesse caso o programa

não poderá ser portado em outra plataforma automaticamente, exigindo a necessidade

de uma nova compilação.

1.2.8 Robusta

A linguagem Java foi projetada para gerar sistemas confiáveis, pois fornece já em

tempo de compilação, por exemplo, uma checagem para identificar código não-alcançável.

Entenda-se como código não-alcançável uma linha de código que por algum

motivo na lógica de programação nunca será executada. Como exemplo podemos

ter um comando return e logo abaixo a impressão de uma string. Nesse caso, a string

nunca seria impressa, por isso o compilador java gera um erro. A linguagem java

também oferece uma checagem para identificar variáveis que foram definidas, porém

não foram inicializadas. O modelo de gerenciamento de memória é extremamente

simples, sendo que após a alocação de memória por meio do operador new não é

necessário que o programador libere esse espaço alocado, pois o garbage collector

realiza essa atividade.

Outros fatores que contribuem para o rótulo de linguagem robusta são:

■ Sistema de tipo rígido que, em tempo de compilação, verifica erros comuns,

como if (cpf = 1). Nesse caso estamos atribuindo um valor, e não realizando

a comparação. O correto seria apresentar o comando if (cpf == 1).

■ Inicialização das variáveis e atributos inteiros com o valor 0 automaticamente

ou com vazio no caso de variáveis ou atributos do tipo string.

■ Manipulação de exceções é parte integrante da linguagem.

1.2.9 Segura

A linguagem Java foi criada para operar em ambientes distribuídos, o que significa

que segurança é de extrema importância. Com as características projetadas na

linguagem Java, e principalmente na JVM, podemos garantir que em um ambiente

de rede nenhum programa Java permitirá que outro programa escrito em qualquer

outra linguagem possa se esconder em um código Java a fim de se instalar automaticamente.

Capítulo 1 ■ Introdução à linguagem Java 23

1.3 Plataforma Java

O termo genérico plataforma representa o hardware e o software onde um programa

Java pode ser executado. Como exemplo de plataformas temos: o Windows, HPUX

– Unix da HP, AIX – Unix da IBM, Linux, Solaris e Mac OS. Muitas plataformas

podem ser descritas como uma combinação do sistema operacional e do hardware

que oferece o suporte. No caso do Java o termo plataforma refere-se somente ao

software onde são executados os programas Java. A plataforma Java é composta de

Java Virtual Machine (JVM) e Java Application Programming Interface (API).

A JVM representa a base da plataforma Java e pode ser instalada na maioria dos

sistemas operacionais disponíveis no mercado. A API Java representa uma grande

coleção de classes prontas que fornecem uma grande quantidade de facilidades

ao programador. Esse conjunto de classes deve ser instalado no computador por

meio do download do J2SDK na versão desejada. Tais classes são agrupadas em

bibliotecas conhecidas como pacotes. Conforme apresentado na figura 1.4 vemos

que a plataforma Java corresponde a uma API (conjunto de classes) e uma máquina

virtual, que é responsável por executar um programa Java, ficando disponível ao

usuário após a instalação no computador do J2SDK na versão escolhida.

Plataforma Java

MeuPrograma.java

API

Plataforma baseada em hardware

Máquina virtual Java

Figura 1.4 – Plataforma Java.

1.4 Por que usar Java?

A plataforma Java oferece aos programadores e analistas de sistemas um conjunto

completo de classes para o desenvolvimento de sistemas web (Servlet, JSP, JavaServer

Faces (JSF)), desktop (Swing, SWT) e batch (método main()). Com essas classes, o tempo

para o desenvolvimento é reduzido e a qualidade do sistema fica muito melhor.

Aprender a programar em Java pode ser uma tarefa fácil para quem já conhece as

linguagens C ou C++ e domina o paradigma da orientação a objetos. Programadores

experientes nessas linguagens percebem que em Java a quantidade de código que

deve ser construído é menor, bem como a legibilidade e qualidade são superiores. O

conceito de write once (escreva uma vez), run anywhere (execute em qualquer lugar)

pode realmente ser alcançado com programas escritos Java. É importante observar

24 Programação Java com Ênfase em Orientação a Objetos

que, para obter as vantagens da linguagem Java, precisamos conhecer muito bem

o paradigma da orientação a objetos, caso contrário o programador continuará

desenvolvendo programas com a linguagem Java em formato estruturado.

1.5 Meu primeiro programa Java

Antes de começar a escrever um programa Java é necessário garantir que esteja

instalado no sistema operacional o Java SE Development Kit (J2SDK) na versão

desejada. Caso não esteja, podemos realizar o download do site da Sun e realizar a

instalação. Neste livro, utilizamos o J2SDK na versão 1.5 para a compilação e execução

de nossos exemplos. Como segundo ponto importante, é preciso definir se esse

programa será desenvolvido em uma IDE (Integrated Development Environment)

ou iremos usar um bloco de notas oferecido pelo sistema operacional. Essa segunda

opção torna o desenvolvimento um pouco mais trabalhoso. Neste livro, usamos a

IDE do Eclipse, por tratar-se de uma IDE gratuita e estar presente nas principais

empresas de desenvolvimento de sistemas e instituições de ensino.

1.5.1 Dicas para o uso da IDE Eclipse

É importante observar que antes da execução do Eclipse precisamos garantir que

a versão 1.5 do J2SE ou superior já tenha sido instalada no computador. Alguns

métodos e classes usados nos exemplos deste livro fazem referência a essa versão.

Caso o leitor use uma versão anterior ao J2SE 1.5, teremos alguns exemplos apresentando

erro de compilação.

Quando executamos o ícone do Eclipse é necessário informar onde fica nossa

área de trabalho (workspace). Essa área é um diretório no sistema operacional, que

contém todos os nossos programas. Depois de definido onde ficará a workspace,

é necessário criar um projeto na IDE, por meio do menu de opções File > New >

Project > Java Project. Podemos dar o nome de livroJava ou qualquer outro nome

para nosso projeto. Lembre-se de que esse nome de projeto também será representado

no sistema operacional como um diretório.

A partir desse momento devemos clicar em cima do nome do projeto e criar um

pacote que será também representado no sistema operacional como um diretório. Em

seguida será possível criar uma classe que será representada no sistema operacional

por um arquivo com a extensão .java. O nome da classe escolhida deverá ser igual

ao usado no programa 01.01. O nome da classe HelloWorld deve ser igual ao nome do

arquivo .java criado dentro do diretório que representa o pacote, respeitando letras

maiúsculas e minúsculas.

Capítulo 1 ■ Introdução à linguagem Java 25

É importante observar que para executar o programa 01.01 sem erros precisamos

passar dois parâmetros no momento da execução. Temos duas opções para a execução

de um programa java, sendo a primeira a utilização do comando

java -cp . modulo01.HelloWorld 10 20

ou por meio da IDE Eclipse em Run > Run > Arguments > Program Arguments.

Visualize o espaço em branco e coloque os dois parâmetros no espaço vazio separados

por espaço. A seguir apresentamos detalhadamente o que cada linha desse

programa representa e como devemos proceder para sua execução.

 Programa 01.01

package modulo01;

1 // Imprime na tela os argumentos recebidos e a frase Hello World

2 public class HelloWorld {

3 public static void main(String args[]) {

4 System.out.println("Parâmetro 01: " + args [0]);

5 System.out.println("Parâmetro 02: " + args [1]);

6 System.out.println("Hello World");

}

}

A seguir, descreveremos o que cada parte do programa representa. A linha 1 representa

um comentário em Java. Os comentários são ignorados pelo compilador,

mas podem ajudar outros programadores a entender o propósito de seu programa.

Há dois tipos de comentários em Java. O primeiro é representado por /* e */. Esse

tipo de comentário oferece a possibilidade de comentar um bloco de informações,

que pode se estender por várias linhas. O segundo formato disponível é representado

por // e tem como objetivo comentar apenas uma linha do programa.

A linha 2 representa a definição da classe, que deve ser sempre seguida por {.

Em seguida, podemos criar métodos e atributos. Para cada método devemos ter

um { e, no final de cada método, devemos ter um } que formaliza o final do método.

Também no final da classe precisamos de um }, para formalizar que a classe se

encerra nesse ponto. Todo o código da classe deve ficar entre o { e o }. Qualquer

código colocado fora desses limites apresentará erro na compilação. Existem algumas

exceções que representam códigos que devem ser definidos fora desse limite.

São citados a seguir:

■ Código de inicialização estático ou não-estático.

■ Comando import.

■ Comando package.

26 Programação Java com Ênfase em Orientação a Objetos

O capítulo 2 apresenta os comandos import e package. O capítulo 3 descreve de

forma detalhada o código de inicialização.

A linha 3 apresenta a definição do método main(). Todo programa desenvolvido

para desktop ou batch (programas Java executados sem interatividade com o usuário)

deve ter o método main() definido.

A JVM inicia a execução do programa a partir desse método. A palavra reservada

public define que o método pode ser chamado por qualquer outro objeto e, nesse

caso, quem o faz é a JVM. A palavra reservada static define que o método poderá

ser executado sem a necessidade de criação de um objeto da classe. Um objeto

representa o modelo da classe em tempo de execução, e este livro realiza uma abordagem

completa desse conceito. A palavra reservada void informa o tipo de retorno

do método que, no caso do método main(), deve ser sempre void. A JVM não está

preparada para receber valores de retorno do programa executado. Em seguida, há

o nome do método e o parâmetro que recebe quando executado.

O método main() aceita um parâmetro do tipo vetor de strings. Cada string desse

array pode representar um parâmetro passado na execução do programa. Dessa forma,

é possível mudar o fluxo de execução do programa considerando os parâmetros

recebidos por meio desse parâmetro. Para usar esses parâmetros o programa Java

deve ser executado da seguinte forma, em uma linha de comando:

D:\workspace\livro>java -cp . modulo01.HelloWorld 10 20

Parâmetro 01: 10

Parâmetro 02: 20

Hello World

É importante observar que antes de executar o comando

java -cp . modulo01.HelloWorld 10 20

devemos nos posicionar no diretório do projeto e, em seguida, executar o comando

apresentado. Neste exemplo temos o diretório D:\workspace\livro>. Pode ser

que esse diretório seja diferente, dependendo do ambiente do leitor. Outro ponto

importante é o diretório que representa o nome do pacote. No diretório do pacote

(neste exemplo, modulo01) utilizado no comando deve estar gravado o arquivo com

o nome da classe seguido da extensão .class (HelloWorld.class). Caso contrário, um

erro será apresentado, e o programa não será executado.

O parâmetro 10 estará disponível no programa para ser acessado por meio da

posição 0 do vetor args (args[0]), enquanto o parâmetro 20 estará disponível para

ser acessado por meio da posição 1 do vetor args (args[1]), conforme as linhas 4 e

5 do programa 01.01.

Capítulo 1 ■ Introdução à linguagem Java 27

Nas linhas 4, 5 e 6 estamos realizando a impressão dos valores dos parâmetros

recebidos e também da frase “Hello World”, por meio do comando System.out.println.

Em que System representa o nome da classe, out representa um atributo estático do

tipo da classe PrintStream e println() representa um método do objeto out. O capítulo

8 apresenta detalhadamente a classe PrintStream.

O centro de qualquer aplicação Java é seu método main(), pois será a partir

dele que todos os outros métodos requeridos para executar uma aplicação serão

executados. Se o interpretador por meio da JVM não encontrar o método main(), o

programa não será executado.

1.6 Introdução à orientação a objetos

Muitos alunos que começam a estudar a linguagem Java têm grande dificuldade para

entender a diferença entre uma classe e um objeto, bem como qual o real significado

de um atributo e de um método. Para esclarecer tais dúvidas vamos comparar os

elementos contidos em uma classe com os elementos contidos no ambiente de um

banco de dados. Não que uma classe e uma tabela sejam iguais, apenas usaremos

essa comparação como um meio para que o leitor entenda o significado desses dois

importantes conceitos.

Podemos dizer que toda tabela de banco de dados tem um nome, assim como

uma classe também. No caso da classe, ela deve iniciar com letra maiúscula e ser um

substantivo ou locução substantiva (dois substantivos juntos). A tabela 1.1 apresenta

um exemplo de nomes para uma tabela e uma classe.

Tabela 1.1 – Relação entre nome de tabela e classe

CONTA_CORRENTE ContaCorrente

APOLICE_SEGURO ApoliceSeguro

VEICULO Veiculo

Uma tabela de banco de dados tem colunas, que representam a estrutura da

tabela. Uma classe tem o mesmo conceito, mas o chamamos de atributos, logo, uma

coluna de uma tabela representa um atributo de uma classe. É importante observar

que o atributo de uma classe deve começar com letra minúscula e, se for composto,

as próximas letras devem ser maiúsculas (recomendação que faz parte das práticas

recomendadas de programação). A tabela 1.2 apresenta exemplos de nomes usados

para colunas e atributos.

28 Programação Java com Ênfase em Orientação a Objetos

Tabela 1.2 – Exemplo de nomes de colunas e atributos

Tabela Classe

nome_cliente nomeCliente

saldo_conta saldoConta

numero_conta numeroConta

numero_agencia numeroAgencia

Uma tabela de banco de dados pode conter operações que venham a manipular

suas colunas a fim de gerar resultados que possam ser atualizados em outra tabela

ou gravados em um arquivo texto no formato de um relatório. Essas operações que

manipulam as colunas de uma tabela são conhecidas por stored procedures, e uma

tabela de banco de dados pode conter nenhuma ou várias dessas operações. Os métodos

em uma classe representam as operações que a classe contém. Tais operações

usam os atributos da classe, seja para alteração ou apenas para leitura, e processam

e geram resultados que podem ser usados para a geração de um relatório.

Como boa prática de programação Java, podemos definir o nome de um método

Java começando com letra minúscula e sendo um verbo no infinitivo (terminado

em ar, er, ir) seguido de um substantivo. Como exemplo de nomes de métodos podemos

ter: calcularPedido(), arquivarDocumento(), imprimirFichaCadastral(), efetuarSaque(),

efetuarDeposito(), entre outros. A tabela 1.3 apresenta exemplos de nomes usados para

stored procedures e métodos.

Tabela 1.3 – Exemplo de nomes de stored procedures e métodos

Tabela Classe

sp_recuperar_cliente_por_cpf(int cpf) recuperarClienteporCPF (int cpf)

sp_recuperar_cliente_por_nome (varchar nome) recuperarClienteporNome (String nome)

sp_atualizar_saldo (decimal valor) atualizarSaldo (double valor)

sp_remover_tansacoes (int cpf) removerTansacoes (int cpf)

Não podemos esquecer que uma tabela contém linhas, e estas representam os registros

gravados na tabela. Podemos ter milhares de linhas gravadas em uma tabela sendo

que o limite seria a capacidade do disco rígido do servidor de banco de dados.

Em um ambiente orientado a objetos essas linhas das tabelas representarão

nossos objetos quando o programa estiver em execução, ou seja, quando iniciar

sua execução, o programador poderá selecionar uma ou mais linhas da tabela e,

para tratá-las em memória, o programa Java atribuirá a elas um objeto do tipo da

classe correspondente. Esse objeto representa o modelo da classe no qual ele está

Capítulo 1 ■ Introdução à linguagem Java 29

baseado. Na tabela 1.4 cada linha da tabela corresponde a um registro da tabela

e, quando tratado pelo programa Java no ambiente de produção, será processado

como um objeto.

Tabela 1.4 – Exemplo de registros e objetos

Tabela Classe

nome_cliente

saldo_conta

numero_conta

numero_agencia

nomeCliente

saldoConta

numeroConta

numeroAgencia

Mauricio Oliveira 1000 9876543 1996 Mauricio Oliveira 1000 9876543 1996

Carlos Chiarello 9000 1234531 0003 Carlos Chiarello 9000 1234531 0003

Daniela Freire 850 9087670 0057 Daniela Freire 850 9087670 0057

Domingos Lucio 8569 9878652 0015 Domingos Lucio 8569 9878652 0015

Hideson Alves 1234 7654321 0090 Hideson Alves 1234 7654321 0090

1.6.1 Classes em Java

Uma classe define o modelo de um objeto, ou seja, todas as características que o

objeto contém foram definidas pela classe. É importante considerar que uma classe

não representa nenhum objeto em particular, pois é só um modelo. O programa

01.02 apresenta como criar uma classe em Java. Não podemos esquecer que o nome

da classe e o nome do arquivo .java devem ser exatamente iguais. Uma classe pode

definir entre o abre e fecha chaves ({ e }) somente atributos, métodos e códigos de

inicialização.

 Programa 01.02

package modulo01;

// Representação de uma classe com atributos e métodos

public class ContaCorrente {

int conta;

int agencia;

double saldo;

static double cpmf; // atributo estático

String nome;

public String getNome() {

return this.nome;

}

public void setNome(String nome) {

this.nome = nome;

}

30 Programação Java com Ênfase em Orientação a Objetos

void efetuarSaque(double valor) {

this.saldo = this.saldo - valor;

}

void efetuarDeposito(double valor) {

this.saldo = this.saldo + valor;

}

void imprimirSaldo() {

System.out.println(this.saldo);

}

public int getAgencia() {

return this.agencia;

}

public void setAgencia(int agencia) {

this.agencia = agencia;

}

public int getConta() {

return this.conta;

}

public void setConta(int conta) {

this.conta = conta;

}

public double getCpmf() {

return cpmf;

}

public void setCpmf(double cpmf) {

ContaCorrente.cpmf = cpmf;

}

public double getSaldo() {

return this.saldo;

}

public void setSaldo(double saldo) {

this.saldo = saldo;

}

} // Nenhuma linha de código poderá ser definida abaixo deste símbolo de fecha chaves

A classe do programa 01.02 representa uma conta corrente com seus atributos,

métodos de acesso (getXXX()) e métodos modificadores (setXXX()). Os métodos de

acesso e os modificadores de uma classe devem ser usados para que o programador

acesse ou altere seus atributos, sem a necessidade de fazê-lo de forma direta. Apesar

de ser possível realizar o acesso ou alteração de forma direta, segundo as boas práticas

de programação e o conceito de encapsulamento, um atributo deve ser sempre

acessado por meio de seus métodos de acesso ou métodos modificadores. Outro

elemento que também fortalece esse modo de programação é o uso de frameworks

como o Spring, que exige que um atributo tenha seus métodos de acesso e seus

métodos modificadores.

A classe ContaCorrente apresentada no programa 01.02 representa exatamente uma

tabela do banco de dados, onde definimos suas colunas (atributos) para receberem

registros. Em uma classe Java, diferentemente do ambiente de banco de dados, que

Capítulo 1 ■ Introdução à linguagem Java 31

usa comandos SQL (select, update, insert etc.) e stored precedures para acessar suas

colunas, para acessar ou alterar os atributos de uma classe, podemos usar os métodos

de acesso (getXXX()) ou os métodos modificadores (setXXX()). Em um método

modificador podemos definir regras de validação para os atributos, evitando que

um valor inválido seja atribuído a um atributo.

Como exemplo de validação de um atributo, podemos especificar que a agência

não pode ser inicializada com um parâmetro (int agencia) com valor menor ou igual

a 0. Esse teste poderia ocorrer dentro do método setAgencia (int agencia). Todos os

programas que usarem a classe ContaCorrente automaticamente estarão se beneficiando

dessa regra de validação. Caso o teste seja realizado em cada uma das classes Java

que use este atributo, com certeza haverá redundância de código.

1.6.2 Objetos em Java

O termo objeto e instância são sinônimos, entretanto, este livro enfatiza o termo

objeto. A criação de um objeto na linguagem Java envolve o operador new e pode ser

feita por meio do comando

Classe variavel = new Classe();

O programa 01.03 apresenta a criação de objetos.

 Programa 01.03

package modulo01;

// Criação de objetos em Java

public class Principal {

public static void main(String args[]) {

ContaCorrente objeto1 = new ContaCorrente(); // criando o objeto 1

ContaCorrente objeto2 = new ContaCorrente(); // criando o objeto 2

}

}

Esse programa está representando apenas como devemos criar um objeto. Se

for executado não será exibido nenhum resultado na tela, pois seu objetivo foi

simplesmente apresentar a sintaxe usada na linguagem Java para realizar a criação

de objetos.

1.6.3 Mensagens em Java

Para usar um objeto após sua criação, devemos enviar mensagens. Uma mensagem

é a forma de comunicação entre objetos. Para isso é preciso criar um objeto, identificar

o nome do método a ser executado e, caso necessário, identificar também os

32 Programação Java com Ênfase em Orientação a Objetos

parâmetros que o método recebe ou retorna. Depois de ter esses dados em mãos

podemos enviar mensagens usando o seguinte comando:

objeto1.efetuarSaque(100,00);

Neste exemplo estamos enviando uma mensagem para que o objeto objeto1 efetue

um saque de R$ 100,00 reais.

O programa 01.04 apresenta a classe ExemploMensagem realizando dois saques, sendo

o primeiro por meio do objeto1 e, o segundo, por meio do objeto2.

 Programa 01.04

package modulo01;

// Envio de mensagens para o objeto

public class ExemploMensagem {

public static void main(String args[]) {

ContaCorrente objeto1 = new ContaCorrente();

objeto1.efetuarSaque(41.80);

ContaCorrente objeto2 = new ContaCorrente();

objeto2.efetuarSaque(131.10);

}

}

Esse programa apresenta a sintaxe para que o programador execute métodos em

Java. Primeiramente precisamos criar um objeto com o operador new e, em seguida,

podemos executar os métodos do objeto. A execução de um método em Java é semelhante

à execução de uma sub-rotina COBOL ou uma função C.

1.6.4 Métodos em Java

Toda classe Java contém pelo menos um método chamado de método construtor

(método com o mesmo nome da classe e sem parâmetros de entrada). Podem existir

vários outros construtores e métodos, mas o método construtor sem parâmetros, se

não for explicitamente criado pelo programador, será implicitamente criado pelo

compilador Java sempre que nenhum outro tiver sido criado. Caso o programador

crie um construtor diferente do construtor sem parâmetros, o compilador Java não

mais criará esse construtor de forma automática. Neste caso o programador também

deverá criar o construtor sem parâmetros explicitamente. O capítulo 3 deste livro

apresenta o uso do conceito de construtor de forma detalhada.

É importante observar que dentro dos métodos podemos criar variáveis, mas

estas têm validade (escopo) somente para uso dentro do método que as criou. Não

devemos confundir variáveis de um método com os atributos que são criados logo

abaixo da definição de uma classe. Percebam que os atributos não pertencem a

Capítulo 1 ■ Introdução à linguagem Java 33

nenhum método específico, logo, podem ser acessados por qualquer um deles. O

programa 01.05 apresenta uma classe Java com dois métodos, além da diferença

entre variáveis e atributos.

 Programa 01.05

package modulo01;

// Exemplo de métodos, variáveis e atributos

import java.util.Date;

public class ExemploMetodo {

private int meuAtributo = 0; // pode ser usado por qualquer método

public static void main(String[] args) {

Date today = new Date(); // today representa uma variável

System.out.println(today);

imprimir(); // executando o método imprimir

}

public static void imprimir() {

// esta variável poderá ser usada somente no método imprimir()

int minhaVariavel = 0;

System.out.println("método imprimir");

}

}

Esse programa cria um atributo chamado meuAtributo (private int meuAtributo = 0),

além dos métodos main() e imprimir(). O método imprimir() cria uma variável chamada

minhaVariavel. É importante observar que o método main() está executando o método

imprimir(). Como já informado, uma variável poderá ser utilizada somente dentro

de um método.

1.6.5 Assinatura de um método

Todo método definido tem uma assinatura que garante que não haja dois métodos

iguais no programa. Quando enviamos mensagens para um método, a JVM (Java

Virtual Machine) procura executar o método buscando identificá-lo pela sua assinatura.

Em Java é perfeitamente possível codificar em uma classe dois ou mais

métodos com o mesmo nome, mas com assinaturas diferentes.

Os elementos do método que fazem parte da sua assinatura são:

■ nome do método;

■ quantidade de parâmetros existentes;

■ tipo de cada parâmetro;

■ ordem desses parâmetros;

Obs.: o tipo de retorno de um método não faz parte de sua assinatura.

34 Programação Java com Ênfase em Orientação a Objetos

O programa 01.06 apresenta um problema na definição de métodos com assinaturas

iguais.

 Programa 01.06

package modulo01;

public class ContaCorrenteSobrecarga {

int conta;

int agencia;

double saldo;

void efetuarSaque(double valor) {

this.saldo = this.saldo - valor;

}

void efetuarDeposito(double valor) {

this.saldo = this.saldo + valor;

}

void imprimirSaldo() {

System.out.println(this.saldo);

}

void imprimirAtributos() {

System.out.println("Método imprimirAtributos()");

}

void imprimirAtributos(int a) {

System.out.println("Método imprimirAtributos (int a)");

}

void imprimirAtributos(char a) {

System.out.println("Método imprimirAtributos (char a)");

}

void imprimirAtributos(int a, char b) {

System.out.println("Método imprimirAtributos (int a, char b)");

}

void imprimirAtributos(char b, int a) {

System.out.println("Método imprimirAtributos (char b, int a)");

}

// int imprimirAtributos(char a) {}

/* a linha anterior irá gerar um erro por estar duplicando a definição

do método: void imprimirAtributos(char a). */

}

Esse programa apresenta o método imprimirAtributos() diversas vezes, mas todas

com assinaturas diferentes. Também apresenta um exemplo em que apenas alteramos

o tipo do retorno do método (// int imprimirAtributos (char a) {}), mantendo os outros

elementos intactos. É importante observar que o tipo de retorno do método não faz

parte da sua assinatura e, por isso, a linha int imprimirAtributos (char a) {} precisou

ser comentada. A definição desse método gera conflito com a definição do método

presente na linha void imprimirAtributos(char a). Nesse caso, para o compilador Java

os métodos são iguais, e um erro de compilação será indicado.

Capítulo 1 ■ Introdução à linguagem Java 35

1.7 Elementos básicos da linguagem Java

1.7.1 Variáveis em Java

Uma variável representa um endereço de memória no qual um valor está armazenado.

Quando definimos variáveis em Java devemos considerar seu nome, tipo e

um valor de inicialização. Lembre-se de que uma variável será definida dentro de

um método, enquanto um atributo é definido dentro da classe. O nome da variável

representa o rótulo usado para identificá-la no código. O tipo da variável determina

o conjunto de valores que ela pode assumir, e o valor de inicialização deve ser

atribuído à variável no momento de sua criação. É importante observar que uma

variável definida internamente a um método só será visível dentro do método, enquanto

um atributo será visível por todos os métodos da classe.

1.7.2 Atributos em Java

Conforme já informado, um atributo deve ser criado após a definição da classe e

fora de qualquer método, sendo que o atributo pode ser ainda classificado como

não-estático ou estático.

Um atributo não-estático existe enquanto o objeto estiver ativo, ou seja, seu valor

será liberado depois que o objeto não for mais usado. Um atributo estático existe

enquanto a classe na qual ele foi definido estiver carregada na JVM. O programa

01.07 mostra um exemplo do uso de atributo estático e não-estático.

 Programa 01.07

package modulo01;

// Representação de uma classe com atributos e métodos

public class ContaCorrente {

int conta;

int agencia;

double saldo;

static double cpmf; // atributo estático

String nome;

public String getNome() {

return this.nome;

}

public void setNome(String nome) {

this.nome = nome;

}

void efetuarSaque(double valor) {

this.saldo = this.saldo - valor;

}

36 Programação Java com Ênfase em Orientação a Objetos

void efetuarDeposito(double valor) {

this.saldo = this.saldo + valor;

}

void imprimirSaldo() {

System.out.println(this.saldo);

}

public int getAgencia() {

return this.agencia;

}

public void setAgencia(int agencia) {

this.agencia = agencia;

}

public int getConta() {

return this.conta;

}

public void setConta(int conta) {

this.conta = conta;

}

public double getCpmf() {

return cpmf;

}

public void setCpmf(double cpmf) {

ContaCorrente.cpmf = cpmf;

}

public double getSaldo() {

return this.saldo;

}

public void setSaldo(double saldo) {

this.saldo = saldo;

}

} // Nenhuma linha de código poderá ser definida abaixo deste símbolo de fecha chaves

Na classe ContaCorrente definimos o atributo cpmf como estático, assim, no método

setCpmf(double cpmf) fizemos a atribuição ao atributo estático por meio do nome

da classe (ContaCorrente.cpmf = cpmf), ou seja, um atributo estático deve sempre ser

acessado pelo nome da classe. Apesar de ser possível acessar um atributo estático

usando um objeto, devemos optar pelo nome da classe. O programa 01.08 mostra

um exemplo de uso do atributo estático apresentado no programa 01.07.

 Programa 01.08

package modulo01;

// Exemplo do uso de atributo estático

public class PrincipalEstatico {

public static void main(String args[]) {

ContaCorrente objeto1 = new ContaCorrente();

// acessando o atributo estático por meio do nome da classe

ContaCorrente.cpmf = 0.0038;

objeto1.saldo = 200;

ContaCorrente objeto2 = new ContaCorrente();

Capítulo 1 ■ Introdução à linguagem Java 37

objeto2.saldo = 400;

System.out.println("Manipulando objetos em Java\u2122");

System.out.println("\u00A9 Sun Microsystems, Inc.");

// atributo estático sendo acessado por um objeto

System.out.println("objeto1 atributo estático: " + objeto1.cpmf);

System.out.println("objeto1 atributo não estático: " + objeto1.saldo);

// acessando o atributo estático por meio de um objeto

System.out.println("objeto2 atributo estático: " + objeto2.cpmf);

System.out.println("objeto2 atributo não estático: " + objeto2.saldo);

objeto2.cpmf = 0.0010;

System.out.println("objeto1 atributo estático: " + objeto1.cpmf);

System.out.println("objeto1 atributo não estático: " + objeto1.saldo);

// acessando o atributo estático por meio do nome da classe

System.out.println("objeto1 atributo estático. Acessado pelo nome da classe: " + ContaCorrente.cpmf);

System.out.println("objeto1 atributo não estático: " + objeto1.saldo);

}

}

O resultado da execução do programa é:

Manipulando objetos em Java™

© Sun Microsystems, Inc.

objeto1 atributo estático: 0.0038

objeto1 atributo não estático: 200.0

objeto2 atributo estático: 0.0038

objeto2 atributo não estático: 400.0

objeto1 atributo estático: 0.0010

objeto1 atributo não estático: 200.0

objeto1 atributo estático. Acessado pelo nome da classe: 0.0010

objeto1 atributo não estático: 200.0

No programa 01.08 estamos acessando o atributo estático por meio de um objeto

(objeto2.cpmf = 0.0010) e do nome da classe (ContaCorrente.cpmf = 0.0038). O acesso

realizado por meio do nome do objeto foi usado apenas para demonstrar que,

quando alteramos o valor de um objeto, os outros objetos passam a visualizar o

valor alterado. Porém, de acordo com as boas práticas, devemos sempre acessar um

atributo estático por meio do nome da classe.

1.7.3 Tipos primitivos

Os tipos primitivos da linguagem Java são muito parecidos com os usados na linguagem

C, assim, se você tiver experiência com a linguagem C, não terá dificuldades

para entender os tipos primitivos da linguagem Java. A tabela 1.5 mostra os tipos

primitivos da linguagem Java.

38 Programação Java com Ênfase em Orientação a Objetos

Tabela 1.5 – Tabela dos tipos primitivos da linguagem Java

Tipo Tamanho/Formato Valores válidos

boolean 8 bits true ou false

byte 8 bits -128 a 127

short 16 bits -32.768 a +32.767

int 32 bits - 2.147.483.648 a +2.147.483.647

long 64 bits -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807

float 32 bits IEEE 754 floating point - 3,4028234663852886E+38 a 3,4028234663852886E+38

double 64 bits IEEE 754 floating point - 4,94065645841246544E-324 a 4,94065645841246544E-324

char 16 bits Caractere Unicode ‘\u0000’ a ‘\uFFFF’ – 0 a 65.535

1.7.4 Tipos de dados Referência

Toda classe criada pelo programador ou pela Sun representa um tipo de dado diferente

dos tipos primitivos (int, double, float etc.) já apresentados. Um exemplo é a

classe ContaCorrente. Ela representa um novo tipo de dado.

Quando criamos objetos do tipo da classe ContaCorrente estamos criando um

atributo ou variável do tipo referência. Uma variável do tipo referência, quando

passada como parâmetro, terá um comportamento diferente de um tipo de dado

primitivo, ou seja, caso o parâmetro passado seja alterado no método chamado, este

terá seu valor alterado também quando retornar a execução ao método ativador. Se

passarmos um parâmetro do tipo primitivo, as alterações realizadas neste não serão

refletidas no método ativador.

1.7.5 Operadores aritméticos

Os operadores aritméticos representam as operações básicas da matemática. A tabela

1.6 apresenta os operadores, seu uso e uma breve descrição.

Tabela 1.6 – Operadores aritméticos

Operador Uso Descrição

+ v1 + v2 Adição

- v1 - v2 Subtração

* v1 * v2 Multiplicação

/ v1 / v2 Divisão. A divisão entre dois números inteiros resulta em outro número inteiro.

Ex.: 11 / 3 = 3

% v1 % v2 Módulo. O operador % (módulo) retorna o resto da divisão. Ex.: 39 % 5 = 4

Capítulo 1 ■ Introdução à linguagem Java 39

O programa 01.09 mostra um exemplo do uso dos operadores aritméticos.

 Programa 01.09

package modulo01;

// Exemplo do uso dos operadores aritméticos

public class ExemploOperadorAritmetico {

public static void main(String args[]) {

int var1 = 5; // variável var1

int var2 = 2; // variável var2

System.out.println("var1 = " + var1);

System.out.println("var2 = " + var2);

System.out.println("-var2 = " + (-var2)); // imprime como valor negativo

System.out.println("var1+ var2 = " + (var1 + var2));

System.out.println("var1- var2 = " + (var1 - var2));

System.out.println("var1* var2 = " + (var1 * var2));

System.out.println("var1/ var2 = " + (var1 / var2));

System.out.println("(float) var1/ var2 = " + ((float) var1 / var2));

System.out.println("var1% var2 = " + (var1 % var2));

System.out.println("var2 = " + var2);

}

}

O resultado da execução do programa é:

var1= 5

var2 = 2

-var2 = -2

var1+ var2 = 7

var1- var2 = 3

var1* var2 = 10

var1/ var2 = 2

(float) var1/ var2 = 2.5

var1% var2 = 1

var2 = 2

1.7.6 Operadores unários

Os operadores unários realizam as operações básicas levando em consideração

apenas uma variável. A tabela 1.7 apresenta os operadores unários.

Tabela 1.7 – Operadores unários

Operador Uso Descrição

++ v1++

Incremento de uma unidade. Quando se coloca o operador após a variável, o

incremento será feito após o uso do valor da mesma na expressão (usa-se o valor e

depois ele é incrementado).

++v1 Quando se usa o operador antes da variável, o incremento será feito antes do uso

do valor da mesma na expressão (incrementa-se primeiro e depois se usa o valor).

-- v1-- Decremento de uma unidade.

--v1 Quando se usa o operador antes da variável, o decremento será feito antes do uso

do valor da mesma na expressão (decrementa-se primeiro e depois se usa o valor).

40 Programação Java com Ênfase em Orientação a Objetos

O programa 01.10 mostra um exemplo do uso dos operadores unários.

 Programa 01.10

package modulo01;

// Exemplo do uso dos operadores unários

public class ExemploOperadorUnario {

public static void main(String args[]) {

int var1 = 10;

int var2 = 20;

int res = 0;

res = var1 + var2;

System.out.println("res: " + res); // imprime 30

// após a execução do operador = será executado o operador ++ da variável var1

res = var1++ + var2; // var1 vai valer 11 após a execução do operador =

System.out.println("res: " + res); // imprime 30

res = var1 + var2;

System.out.println("res: " + res); // imprime 31

res = var1 + --var2;

System.out.println("res: " + res); // imprime 30

}

}

O resultado da execução do programa é:

res: 30

res: 30

res: 31

res: 30

1.7.7 Operadores relacionais

Os operadores relacionais realizam as operações de igualdade e comparação. A

tabela 1.8 apresenta os operadores relacionais.

Tabela 1.8 – Operadores relacionais

Operador Uso Descrição

== v1 == v2 Igualdade

!= v1 != v2 Desigualdade

< v1 < v2 Menor

<= v1 <= v2 Menor ou igual

> v1 > v2 Maior

>= v1 >= v2 Maior ou igual

Capítulo 1 ■ Introdução à linguagem Java 41

O programa 01.11 mostra um exemplo do uso dos operadores relacionais.

 Programa 01.11

package modulo01;

// Exemplo do uso dos operadores relacionais

public class ExemploOperadorRelacional {

public static void main(String args[]) {

int var1 = 27;

int var2 = 74;

System.out.println("var1 = " + var1);

System.out.println("var2 = " + var2);

System.out.println("var1 == var2 -> " + (var1 == var2));

System.out.println("var1 != var2 -> " + (var1 != var2));

System.out.println("var1 < var2 -> " + (var1 < var2));

System.out.println("var1 > var2 -> " + (var1 > var2));

System.out.println("var1 <= var2 -> " + (var1 <= var2));

System.out.println("var1 >= var2 -> " + (var1 >= var2));

}

}

O resultado da execução do programa é:

var1 = 27

var2 = 74

var1 == var2 -> false

var1 != var2 -> true

var1 < var2 -> true

var1 > var2 -> false

var1 <= var2 -> true

var1 >= var2 -> false

1.7.8 Operadores lógicos

Os operadores lógicos são muito usados em estruturas de controle e loop. A tabela

1.9 apresenta os operadores lógicos.

Tabela 1.9 – Operadores lógicos

Operador Uso Descrição

&& v1 && v2 “E” lógico

|| v1 || v2 “OU” lógico

! !(v1 < v2) Negação lógica

Os operadores apresentados têm como resultado um valor do tipo boolean.

42 Programação Java com Ênfase em Orientação a Objetos

1.7.9 Operadores de atribuição

Os operadores de atribuição são usados para atribuir um novo valor a uma variável.

A tabela 1.10 mostra os operadores de atribuição.

Tabela 1.10 – Operadores de atribuição

Operador Uso Equivale a:

= v1 = v2; Atribuição

+= v1 += v2; v1 = v1 + v2;

-= v1 -= v2; v1 = v1 - v2;

*= v1 *= v2; v1 = v1 * v2;

/= v1 /= v2; v1 = v1 / v2;

%= v1 %= v2; v1 = v1 % v2;

1.7.10 Estruturas de controle

A linguagem Java disponibiliza os comandos if e else que, de forma seletiva, definem

qual bloco de comandos deverá ser executado. Se a condição do comando if for

avaliada como verdadeira será executado o bloco de comandos dentro do if. Caso

contrário, o bloco de comandos dentro do else será executado. O programa 01.12

mostra um exemplo do comando if.

 Programa 01.12

package modulo01;

// Exemplo do comando if

public class ExemploIf {

public static void main(String args[]) {

int var1 = 20;

int var2 = 10;

// modo de uso: if (condicao)

if (var1 > var2) {

// bloco de comandos do if

System.out.println("var1 é maior que var2");

}

}

}

A condição (var1 > var2) sempre retornará um valor lógico, ou seja, verdadeiro ou

falso. Caso verdadeiro, o bloco de comandos abaixo da condição será executado, caso

contrário, não haverá execução. Caso o comando if retorne falso, podemos encadear

a execução de um segundo bloco de comandos do comando else. O programa 01.13

mostra um exemplo envolvendo o comando if e o else.

Capítulo 1 ■ Introdução à linguagem Java 43

 Programa 01.13

package modulo01;

// Exemplo comando if e do comando else

public class ExemploIfElse {

public static void main(String args[]) {

int var1 = 10;

int var2 = 20;

// modo de uso: if (condicao)

if (var1 > var2) {

// bloco de comandos do if

System.out.println("var1 é maior que var2");

} else { // condição avaliada como falso

// bloco de comandos do else

System.out.println("var1 é menor que var2");

}

}

}

Além dos comandos if e else há o comando switch, que também realiza a execução

de um bloco de comandos de acordo com uma decisão. Muitos programadores

se perguntam quando devem usar o switch e quando devem utilizar o comando if.

Qual dos dois comandos será mais útil?

O uso de cada um dos comandos depende da composição da estrutura de decisão.

Devemos optar por usar o comando switch quando, no teste realizado, usarmos

uma mesma variável, igualando-a com vários valores diferentes. O programa 01.14

mostra um exemplo do uso do comando if, enquanto o programa 01.15 mostra um

exemplo do mesmo programa com o comando switch.

Quando usamos o comando switch devemos também usar em conjunto o comando

case, que com base no valor da variável do comando switch define qual opção

será executada. Para que somente um entre os vários comandos case seja executado,

devemos executar o comando break, logo após a execução dos comandos contidos

no bloco do comando case selecionado.

Quando quisermos que um mesmo bloco de comandos seja executado, para dois

ou mais diferentes valores do comando switch, devemos encadear a execução dos

comandos case sem a execução do comando break entre eles. Somente executamos

um comando break ao final dos comandos executados. É importante observar que

o comando break interrompe a execução do case.

Há também o comando default, que representa uma exceção a todas as opções

listadas nos comandos case. É importante observar que no comando switch só são

aceitas variáveis do tipo int ou char. O uso de outro tipo primitivo gera um erro de

compilação.

44 Programação Java com Ênfase em Orientação a Objetos

 Programa 01.14

package modulo01;

// Exemplo do comando if

import java.io.IOException;

public class ExemploIf02 {

public static void main(String[] args) throws IOException {

System.out.println("Digite uma das letras da palavra Java: ");

int numero = System.in.read(); // lê do teclado apenas um caractere

if (((char) numero == 'J') || ((char) numero == 'j')

|| ((char) numero == 'A') || ((char) numero == 'a')

|| ((char) numero == 'V') || ((char) numero == 'v')) {

System.out.println("Letra digitada está correta.");

} else if ((char) numero == (char) 13) {

System.out.println("Foi digitado apenas um <enter>.");

} else {

System.out.println("Letra digitada está incorreta.");

}

}

}

Nesse programa leremos no teclado um caractere, e caso seja igual às letras

da palavra Java, exibirá a mensagem "Letra digitada está correta.". Caso contrário,

veremos Letra digitada está incorreta. A linha else if ((char) numero == (char) 13) do

programa 01.14 está verificando se o usuário digitou a tecla <enter>. O valor dessa

tecla na tabela ASCII é igual ao valor 13 no formato caractere. Ou seja, se o usuário

não digitar nenhuma letra e apenas teclar <enter> no teclado, será emitida uma

mensagem de alerta. Neste exemplo usamos o comando import java.io.IOException.

O comando considera dois elementos: o comando import e a classe de exceção

IOException. Este livro aborda o comando import e apresenta de forma detalhada, no

capítulo 7, todos os elementos necessários para o tratamento de exceções em Java.

O programa 01.15 representa outra forma de obter o mesmo resultado que tivemos

com o programa 01.14, usando o comando switch em vez do if.

 Programa 01.15

package modulo01;

// Exemplo do comando switch. Uma alternativa ao uso do comando if

import java.io.IOException;

public class ExemploSwitch {

public static void main(String[] args) throws IOException {

System.out.println("Digite uma das letras da palavra Java: ");

int numero = System.in.read(); // lê do teclado apenas um caractere

switch ((char) numero) {

case 'J':

case 'j':

case 'A':

case 'a':

Capítulo 1 ■ Introdução à linguagem Java 45

case 'V':

case 'v':

System.out.println("Letra digitada está correta.");

break;

case (char) 13: // utilizado para tratar o enter

System.out.println("Foi digitado apenas um <enter>.");

break;

default:

System.out.println("Letra digitada está incorreta.");

}

}

}

1.7.11.1 Processo de avaliação com os operadores &&, &, || e |

A linguagem Java realiza a avaliação curta quando usamos os operadores lógicos

&& e ||. Ou seja, dependendo da avaliação parcial do comando if, por exemplo, não

será necessário a avaliação da outra expressão. Quando usamos o operador &&, caso

a primeira condição avaliada em um comando if seja falsa, automaticamente a segunda

expressão não será avaliada. Quando usamos o operador ||, caso a primeira

condição avaliada em um comando if seja verdadeira, automaticamente a segunda

expressão não será avaliada. Caso seja necessário que toda a expressão seja avaliada

independentemente das validações anteriores, podemos usar os operadores & e |.

O programa 01.16 exemplifica o uso desses operadores. Neste exemplo usamos a

classe Console para enfatizar o comportamento dos operadores apresentados. A classe

Console poderá ser obtida na internet ou na página deste livro no site da Novatec.

É importante observar que até a versão 1.4 do J2SE os mecanismos de leitura de

dados a partir do teclado eram de uso complexo. Para contornar essa complexidade

foi criada a classe Console, que tem como objetivo facilitar a leitura dos dados em

programas Java.

É importante observar que a classe Console usada neste livro não corresponde à

classe Console presente no pacote java.io.Console. A classe java.io.Console foi criada na

versão 1.6 do J2SE e deve ser usada quando um programa java é executado a partir

de um console, ou seja, não atende às necessidade dos exemplos presentes neste

livro. A classe Console usada neste livro deverá ser obtida da internet ou do site da

editora Novatec, conforme comentado.

Para executar os exemplos deste livro será necessário que o leitor tenha a classe

Console em seu ambiente de desenvolvimento. É importante observar também que

em outros exemplos será necessário realizar o download de arquivos com a extensão

.jar, com o objetivo de evitar os erros de compilação causados pela falta deles.

Quando houver algum exemplo que use algum recurso especial, descreveremos no

46 Programação Java com Ênfase em Orientação a Objetos

próprio programa essa necessidade. Todos os recursos necessários para a execução

dos exemplos deste livro poderão ser obtidos na página da editora Novatec.

A partir da versão 1.5 do J2SE foi lançada a classe Scanner, que pode ser usada

como uma alternativa à classe Console. A vantagem de usá-la é que já está presente

na instalação do J2SE versão 1.5 ou superior, enquanto a classe Console deve ser obtida

em sites externos. O capítulo 8 apresenta de forma detalhada a classe Scanner.

Contudo, faremos um uso intensivo dessa classe para realizar a leitura de dados

por meio do teclado em diversos exemplos deste livro.

No exemplo apresentado no programa 01.16 usamos a classe Console para realizar

a leitura dos dados a partir do teclado. Como podemos observar, essa classe está

gravada no pacote modulo01.estudodecaso.util, ou seja, para que o exemplo funcione,

é necessário colocar a classe Console na mesma estrutura hierárquica de pacotes

usada neste exemplo, além de executar o comando import para evitar um erro de

compilação.

Para não gerar erro de compilação ao digitar o programa é preciso, a partir do

nome do projeto, criar o pacote modulo01.estudodecaso.util e copiar a classe Console

obtida do site para dentro do pacote. A partir desse momento, o exemplo funcionará

corretamente. É importante observar que esse mesmo procedimento será usado por

outros exemplos deste livro. O capítulo 2 apresenta de forma detalhada o conceito

de pacotes (package, em inglês) e o comando import.

 Programa 01.16

package modulo01;

// Exemplo do uso do comando if com os operadores &&, ||, &, e |

// A classe Console precisa estar disponível no pacote modulo01.estudodecaso.util

import modulo01.estudodecaso.util.Console;

public class ExemploOperadorLogico {

public static void main(String args[]) {

if (Console.readInt("\nNúmero 1: ") > 10 && Console.readInt("Número 2: ") > 10) {

System.out.println("Os dois números são maiores que 10");

} else {

System.out.println("O primeiro ou o segundo número não é maior que 10");

}

if (Console.readInt("\nNúmero 3: ") > 10 || Console.readInt("Número 4: ") > 10) {

System.out.println("Um dos números é maior que 10");

} else {

System.out.println("O terceiro ou o quarto número não é maior que 10");

}

if (Console.readInt("\nNúmero 5: ") > 10 & Console.readInt("Número 6: ") > 10) {

System.out.println("Os dois números são maiores que 10");

} else {

System.out.println("O quinto ou o sexto número não é maior que 10");

}

Capítulo 1 ■ Introdução à linguagem Java 47

if (Console.readInt("\nNúmero 7: ") > 10 | Console.readInt("Número 8: ") > 10) {

System.out.println("Um dos números é maior que 10");

} else {

System.out.println("O sétimo ou o oitavo número não é maior que 10");

}

}

}

1.7.11 Estruturas de repetição

O primeiro comando que abordaremos é o for, que executa um bloco de comandos

determinado várias vezes. A figura 1.5 apresenta a sintaxe do comando for, e a

representação gráfica do comando quando executado de forma procedural.

Código do comando for Representação gráfica

for (inicialização;

condição de fim;

incremento)

{

bloco de comandos

}

Inicialização das Variáveis

Condição de fim

Bloco de comandos

Incremento

Fim - }

V

F

Figura 1.5 – Comando for.

O programa 01.17 exemplifica o comando for.

 Programa 01.17

package modulo01;

// Exemplo do comando for

public class ExemploFor {

public static void main(String[] args) {

for (int var1 = 0; var1 < 27; var1++) {

System.out.println(var1);

}

}

}

O programa exibirá os números entre 0 e 26 na tela do computador.

48 Programação Java com Ênfase em Orientação a Objetos

Conforme comentado, devemos usar o comando for quando sabemos de antemão

quantas vezes o loop deverá ser executado. Quando o fim de um loop depender

da entrada do usuário devemos optar pelo uso do comando while, que executa um

bloco de comandos enquanto sua condição for verdadeira. A figura 1.6 mostra um

exemplo da sintaxe do comando while, e a representação gráfica do comando.

Código do comando while Representação gráfica

while (condição)

{

bloco de comandos

}

Inicio

Condição

Bloco de comandos

Fim - }

V

F

Figura 1.6 – Comando while.

O programa 01.18 mostra um exemplo do uso do comando while.

 Programa 01.18

package modulo01;

// Exemplo do comando while

import java.io

...

Baixar como  txt (63.8 Kb)  
Continuar por mais 34 páginas »