Vous êtes sur la page 1sur 137

PROF.

HILRIO SEIBEL JNIOR

LINGUAGEM DE PROGRAMAO I

SERRA 2011

Governo Federal Ministro de Educao Fernando Haddad IFES - Instituto Federal do Esprito Sando Reitor Denio Rebello Arantes Pr-Reitora de Ensino Cristiane Tenan Schlittler dos Santos Diretora do CEAD Centro de Educao a Distncia Yvina Pavan Baldo Coordenadores da UAB Universidade Aberta do Brasil Elton Siqueira Moura Danielli Veiga Carneiro Sondermann

Curso de Tecnologia em Anlise e Desenvolvimento de Sistemas Coordenao de Curso Andromeda Gorete Correa de Menezes Designer Instrucional Aline Freitas da Silva Professor Especialista/Autor Hilrio Seibel Jnior

Catalogao da fonte: Rogria Gomes Belchior - CRB 12/417 S45l Seibel Jnior, Hilrio Linguagem de programao I./ Hilrio Seibel Jnior . - Vitria: IFES, 2009 137p. : il 1.Linguagem de programao I (Computadores). 2 Java (Linguagem de programao de computador) I. Instituto Federal do Esprito Santo. II. Ttulo CDD 005.13
DIREITOS RESERVADOS IFES - Instituto Federal do Esprito Santo Avenida Rio Branco, n 50 Santa Lcia - CEP. 29056-255 Vitria ES - Telefone: 3227-5564 Crditos de autoria da editorao Capa: Juliana Cristina da Silva Projeto grfico: Juliana Cristina e Nelson Torres Iconografia: Nelson Torres Editorao eletrnica: Duo Translations Reviso de texto: Esther Ortlibe Faria de Almeida COPYRIGHT proibida a reproduo, mesmo que parcial, por qualquer meio, sem autorizao escrita dos autores e do detentor dos direitos autorais.

Ol, Aluno(a)!

um prazer t-lo(a) conosco. O Ifes oferece a voc, em parceria com as Prefeituras e com o Governo Federal, o Curso Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas, na modalidade a distncia. Apesar de este curso ser ofertado a distncia, esperamos que haja proximidade entre ns, pois, hoje, graas aos recursos da tecnologia da informao (e-mail, chat, videoconferncia, etc.), podemos manter uma comunicao efetiva. importante que voc conhea toda a equipe envolvida neste curso: coordenadores, professores especialistas, tutores a distncia e tutores presenciais, porque, quando precisar de algum tipo de ajuda, saber a quem recorrer. Na EaD - Educao a Distncia, voc o grande responsvel pelo sucesso a aprendizagem. Por isso, necessrio que voc se organize para os estudos e para a realizao de todas as atividades, nos prazos estabelecidos, conforme orientao dos Professores Especialistas e Tutores. Fique atento s orientaes de estudo que se encontram no Manual do Aluno. A EaD, pela sua caracterstica de amplitude e pelo uso de tecnologias modernas, representa uma nova forma de aprender, respeitando, sempre, o seu tempo. Desejamos-lhe sucesso e dedicao! Equipe do Ifes

ICONOGRAFIA
Veja, abaixo, alguns smbolos utilizados neste material para gui-lo em seus estudos

Fala do Professor

Conceitos importantes. Fique atento!

Atividades que devem ser elaboradas por voc, aps a leitura dos textos.

Indicao de leituras complemtares, referentes ao contedo estudado.

Destaque de algo importante, referente ao contedo apresentado. Ateno!

Reflexo/questionamento sobre algo importante referente ao contedo apresentado.

Espao reservado para as anotaes que voc julgar necessrias.

LINGUAGEM DE PROGRAMAO I
Cap. 1 - PRIMEIROS PASSOS EM JAVA 9
1.1 A linguagem Java 9 1.2 Criao de programas em Java 10 1.3 Primeiro exemplo de programa em Java 12 1.4 Incluindo componentes nos painis 17 1.5 Adicionando funcionalidades ao programa 19

Cap. 2 - INTRODUO LINGUAGEM JAVA 25


2.1 Programa simples em Java 25 2.2 Tipos de dados e definio de variveis 28 2.3 Strings 32 2.4 Arrays 34 2.5 Operadores 35 2.6 Funes matemticas 36 2.7 Controle de fluxo 37 2.8 Escopo das variveis 40 2.9 Garbage collection 41

Cap. 3 - ORIENTAO A OBJETOS: CLASSES, OBJETOS E MTODOS 43


3.1 Introduo orientao a objetos 43 3.2 Classe e objeto 44 3.3 Classes e objetos em Java 45 3.4 Mtodos 47

Cap. 4 - ORIENTAO A OBJETOS: MTODOS E ENCAPSULAMENTO 55


4.1 Construtores 55 4.2 Encapsulamento 59 4.3 Retomando o projeto inicial 63

Cap. 5 - POLIMORFISMO (HERANA, SOBRECARGA E REESCRITA) 71


5.1 Herana 71 5.2 Sobrecarga de mtodos 75

5.3 Reescrita de mtodos 76 5.4 Pacotes 77 5.5 Retomando o projeto inicial 79

Cap. 6 - COMPOSIO, CLASSES ABSTRATAS, INTERFACES E PACOTES 85


6.1 Composio 85 6.2 Classes e mtodos abstratos 87 6.3 Classes, mtodos e atributos finais 90 6.4 Interfaces 91

Cap. 7 - CONTROLE DE ERROS (EXCEES) 95


7.1 Tratamento de excees 95 7.2 Try-catch 95 7.3 Try-finally 96 7.4 Tipos de erros 98 7.5 Gerando uma exceo 99 7.6 Criando suas prprias excees 101 7.7 Retomando o projeto inicial 103

Cap. 8 - ENTRADA E SADA DE DADOS 109


8.1 Passagem de parmetros para o programa 109 8.2 Entrada padro 111 8.3 Manipulao de arquivos 115

Cap. 9 - PERSISTNCIA DE DADOS 119


9.1 Criando e populando um banco de dados no Netbeans 119 9.2 Como conectar e inserir dados no BD 122 9.3 Como recuperar dados do BD 124

Cap. 10 - INTERFACES GRFICAS 127


10.1 Componentes da interface 127 10.2 Caixas de dilogos 132

APRESENTAO

Ol! Meu nome Hilrio Seibel Jnior e sou professor do IFES desde 2007, onde atuo na rea de Programao. Eu me formei em Cincia da Computao na UFES em 2004. Em 2007, terminei meu Mestrado em Informtica, tambm pela UFES. Tenho interesse pelas reas de programao, algoritmos, processamento paralelo, lgica, otimizao, recuperao de informao, anlise de algoritmos, computao grfica, jogos, software livre e telessade. Produzi este material como instrumento bsico para o estudo da disciplina de Linguagem de Programao. Nesta disciplina, iremos aprender Programao Orientada a Objetos e os exemplos sero apresentados na linguagem JAVA. Para fixar o contedo apresentado neste material, importante que voc realize as atividades propostas em cada captulo. Alm disso, sugerimos outros materiais que podem ajudar na compreenso de cada contedo aprendido. Toda esta bibliografia complementar apresentada aqui est disponvel online.

Sucesso! Bons estudos!

PRIMEIROS PASSOS EM JAVA

Prezado aluno, nesta disciplina, iremos aprender os conceitos de Programao Orientada a Objetos. Para comear, criaremos a interface grfica de um programa bem simples na linguagem Java. Em seguida, mostraremos alguns conceitos bsicos desta linguagem de programao, que ser utilizada em toda esta disciplina.

1.1 A linguagem Java


A linguagem Java foi concebida originalmente para a utilizao em pequenos dispositivos eletrnicos inteligentes. Entretanto, com as dificuldades de financiamento desse setor na poca e, principalmente, devido popularizao da Internet a partir de 1993, novas oportunidades apareceram e a Sun entrou de cabea nessa rea. A partir de 1995, a Sun anunciou o Java no apenas como mais uma linguagem de programao, mas como uma nova plataforma de desenvolvimento. Desde o ano de 1996 at hoje, a linguagem Java no para de crescer, produzindo solues adequadas desde as pequenas aplicaes at aplicativos corporativos, controles de servidores WWW etc. A tecnologia Java composta por uma gama de produtos, baseados no poder da rede e na ideia de que um software deveria ser capaz de rodar em diferentes mquinas, sistemas e dispositivos. Por diferentes dispositivos, entendemos: computadores, servidores, notebooks, handhelds, PDAs (Palm), celulares, TV, geladeiras e tudo mais o que for possvel. Os programas feitos em Java rodam em diferentes ambientes graas a um componente da plataforma chamado JVM (Java Virtual Machine) que um tipo de tradutor de cdigo Java para instrues especficas de cada sistema e dispositivo.

10

Captulo 1

Java uma linguagem que preza pela portabilidade. A utilizao do Java em multiplataforma um aspecto muito importante, porque os programadores no precisam se preocupar em saber em qual arquitetura o programa ser executado, uma vez que um mesmo programa pode ser usado em um PC, MAC ou em um computador de grande porte.

Java tambm pode atuar em conjunto com outras linguagens. As aplicaes podem ser embutidas at mesmo em documentos HTML, por exemplo, podendo ser transmitidas e utilizadas na Internet. A linguagem possui uma semelhana com a linguagem C++, tanto no que diz respeito sintaxe dos comandos quanto na caracterstica de ser orientada a objetos. Mais adiante, mostraremos outras caractersticas da Java. 1.2 Criao de programas em Java Assim como em qualquer outra linguagem, Java precisa de um processo de compilao por meio do qual ser analisada a existncia de erros de sintaxe. O compilador responsvel pela traduo do programa escrito em Java para uma linguagem intermediria chamada Java bytecodes um cdigo independente de plataforma que interpretado por um interpretador Java. Para que um programa em Java seja executado, portanto, necessrio possuir uma outra ferramenta chamada interpretador, que estar emulando a JVM (Mquina Virtual do Java) em qualquer computador e sistema operacional que esteja usando (Figura 1 -).

Cdigo - Fonte MeuPrograma.java Ajustar Cdigo-Fonte Sim Erros No Interpretador Bytecodes Execuo do Programa MeuPrograma.class Cdigo - Fonte

Figura 1 - Abstrao da Execuo de um programa em Java. Tecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

11

Para instalar o Kit de Desenvolvimento da Sun, necessrio seguir os seguintes passos: 1. realizar o download do kit de desenvolvimento Java 6 SDK (Standard Edition J2SE), popularmente conhecido como JDK (Java Development Kit). Para isso, acesse o site http://java.sun. com e escolha a verso de acordo com o sistema operacional que ser utilizado; 2. aps instalar a ferramenta, necessrio criar uma varivel de ambiente chamada JAVA_HOME (que deve guardar o caminho do diretrio onde o Java foi instalado) e adicion-la ao PATH do seu S.O. No Windows, a sintaxe a seguinte (para a verso 1.5.0 do JDK, por exemplo):

Caso voc no consiga realizar esta etapa, procure o Guia de Instalao que veio junto com o Kit de Desenvolvimento que voc instalou, pois esta etapa pode depender do seu Sistema Operacional, ou ento pea ajuda a seu tutor.

3. Para testar a instalao, entre no prompt do DOS (Menu Iniciar > Programas > Acessrios > Prompt de Comando), digite javac e pressione a tecla Enter. Se aparecer uma tela contendo informaes de help, significa que a instalao foi realizada com sucesso. Caso contrrio, aparecer uma mensagem informando que o programa ainda no reconhecido pelo sistema. Existem diversos IDEs (do ingls Integrated Development Environment, que significa Ambiente Integrado de Desenvolvimento) com ferramentas de apoio ao desenvolvimento de softwares em Java com o objetivo de agilizar este processo. Neste disciplina, utilizaremos o NetBeans IDE. Para baix-lo, acesse o site http://www.netbeans.org/index_pt_BR.html e baixe a verso mais recente (a verso utilizada neste material a 6.5). Na pgina de downloads, voc tambm pode baixar diretamente o JDK com o NetBeans IDE
Linguagem de Programao I

12

Captulo 1

Java SE j embutido. Neste caso, no ser necessrio executar os passos de instalao e configurao do Java descritos acima. Antes de realizar o download, no se esquea de confirmar que o programa ser baixado em portugus.

1.3 Primeiro exemplo de programa em Java


Para comear nossos estudos, criaremos um programa em Java que calcula a mdia final de um aluno. No programa, a mdia do aluno ser composta pela soma das notas das duas provas presencias (cada uma vale 30) e da nota dos exerccios (40 pontos). Caso o aluno faa prova final, 40% do valor da mdia final sero compostos pela mdia parcial calculada anteriormente, e os 60% restantes sero compostos pela nota da prova final. O primeiro passo abrirmos o NetBeans e criarmos um novo projeto. Para isso, realize os passos a seguir: 1. clique em Arquivo > Novo Projeto; 2. dentre as opes Categorias da janela aberta, escolha Java. Dentro de Projetos, escolha Aplicativo Java. Clique em Prximo; 3. escolha um nome para o projeto (por exemplo, MediaFinal) e certifique-se de que apenas a opo Definir como projeto principal esteja selecionada. Clique em Finalizar. Aps criarmos o projeto, ele passa a ser exibido na aba Projetos, que fica no canto esquerdo do NetBeans. Para facilitar seu aprendizado, comearemos o projeto desenvolvendo a interface grfica de nosso programa. Para isso, precisamos criar um quadro (ou frame), que o espao onde os componentes de nossa interface sero exibidos. Este quadro pode ser criado da seguinte forma: 1. na aba de Projeto, clique com o boto direito do mouse no nome de nosso projeto; 2. escolha as opes Novo > Formulrio JFrame; 3. escolha um nome para o frame e outro para o pacote em que ele estar inserido (por exemplo, Interface para o nome do frame e pacoteInterface para o nome do pacote). Mais adiante, explicaremos detalhadamente para que servem os pacotes em Java. Clique em Finalizar.
Tecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

13

A Figura 2 - mostra um trecho da tela mostrada aps a realizao dos passos acima:

Figura 2 - Criando um Frame para a interface do programa.

O quadro cinza esquerda da Figura 2 - o frame onde os componentes da interface iro aparecer. Na aba Paleta, no canto direito da figura, esto os componentes que iremos inserir. Para comear, criaremos um Painel onde o usurio ir digitar o nome e a matrcula de um aluno. Para isso, clique em Painel na opo Contineres Swing da aba Paleta. Arraste o ponteiro do mouse para a rea do frame e voc ver uma tela como a mostrada na Figura 3 -.

Figura 3 - Inserindo um Painel na interface do programa. Linguagem de Programao I

14

Captulo 1

A rea quadrada com uma borda laranja vista na figura indica o local onde o painel ser inserido no frame. A linha pontilhada mostra uma margem dentro do frame, til para alinharmos os componentes. Devemos clicar com o mouse no local indicado para definir a rea onde ser inserido o painel. Em seguida, iremos redimensionar o painel, para que caibam os componentes que criaremos mais adiante. A Figura 4 - mostra o redimensionamento do painel.

Figura 4 - Redimensionando um painel.

Nosso programa conter dois painis: um para insero dos dados pessoais do aluno e outro para cadastro de suas notas. Tente executar os passos feitos acima, e em seguida insira outro painel em seu programa. A Figura 5 - mostra como deve ficar, por enquanto, o frame de nosso programa.

Figura 5 - Redimensionando um painel. Tecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

15

Como queremos distinguir os dados pessoais da notas dos alunos, adicionaremos uma borda e um ttulo aos nossos painis. Primeiro, clicamos com o boto direito sobre o painel de cima e escolhemos a opo Propriedades. Ser exibida uma tela como a mostrada na Figura 6 -:

Figura 6 - Propriedades do painel.

O item border que aprece em destaque na figura define como ser esta borda que queremos alterar no painel. Para modificar este atributo, devemos clicar no boto do item. Clicando nele, ser exibida uma tela semelhante mostrada na Figura 7 -:

Figura 7 - Modificando a borda do painel. Linguagem de Programao I

16

Captulo 1

Na tela mostrada na Figura 7 -, escolhemos o tipo da borda como Borda de ttulo, e definimos o Ttulo como Dados pessoais do aluno. Podemos tambm alterar a fonte com a qual o ttulo ser escrito, clicando no boto ao lado do item Fonte. Aps clicar no boto do item Fonte, definimos a fonte com estilo Negrito e de tamanho 12, e clicamos em seguida em OK. Voltando tela da Figura 7 -, clicamos novamente em OK, depois no boto Fechar, e visualizamos o painel com a borda e o ttulo definidos nos passos anteriores. A Figura 8 - mostra a modificao na borda e no ttulo do painel:

Figura 8 - Bordas dos painis modificadas.

Na tela mostrada na Figura 8 -, a borda e o ttulo do painel onde ficaro as notas do aluno j foram modificados (repita os passos anteriores para que isso seja feito em seu programa).

ATIVIDADE 1. extremamente importante que voc tente executar os passos acima antes de continuar a leitura do material. Portanto, tente desenvolver um projeto com a interface semelhante que fizemos at aqui.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

17

1.4 Incluindo componentes nos painis


Expandindo a opo Controles Swing da aba Paleta, encontramos os componentes que iremos inserir em nossos painis. O primeiro item a ser preenchido pelo usurio ser o nome do aluno. Para isso, iremos inserir um Campo de Texto, onde este nome ser digitado, e um Rtulo, que serve para explicao do que deve ser inserido neste campo. Para isso, clicamos primeiro em Rtulo e definimos o local onde o rtulo ser inserido, como mostrado na Figura 9 -:

Figura 9 - Inserindo um rtulo.

Para definirmos o texto que aparecer no rtulo, clicamos com o boto direito no mesmo e escolhemos a opo Editar texto, inserindo o texto Nome do aluno. Ao lado do rtulo inclumos um Campo de Texto, como mostrado na Figura 10 -:

Figura 10 - Inserindo um campo de texto. Linguagem de Programao I

18

Captulo 1

Em seguida, editamos o texto do Campo de texto criado acima (neste caso, deixamos o campo em branco para que o usurio digite seu nome) e redimensionamos o campo, produzindo uma tela semelhante mostrada na Figura 11 -:

Figura 11 - Redimensionando o campo de texto.

ATIVIDADE 2. Continue desenvolvendo a interface de nosso programa. Para isso, crie uma tela semelhante mostrada na Figura 12 -:

Figura 12 - Tela do 2

Tecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

19

A prxima seo apresenta a continuao da interface de nosso programa. Por isso, tente realizar o 2 antes de continuar a leitura do material.

Para executarmos nosso programa no NetBeans, basta executarmos o projeto no qual estamos criando-o. Para isso, clique com o boto direito sobre o nome do projeto na aba Projetos (no canto esquerdo do NetBeans), e depois em Executar. Se preferir, basta clicar a tecla F6. Ao execut-lo, o NetBeans pedir para escolhermos a classe principal a ser executada (mais adiante, explicaremos o que uma classe principal). Por enquanto, escolha a classe pacoteInterface.Interface, que a nica opo da lista.

1.5 Adicionando funcionalidades ao programa


Nas ltimas sees, comeamos a desenvolver a interface grfica de nosso primeiro programa em Java. Entretanto, o programa ainda no possui funcionalidades. Para isso, vamos incluir um boto para que seja calculada a mdia final do aluno. Um boto inserido atravs do item Boto da opo Controles Swing na aba Paleta (no mesmo local onde encontramos o Rtulo e o Campo de texto anteriormente). Inclumos ento um boto ao lado do campo de texto com a mdia final do aluno e, em seguida, editamos o texto do boto (de forma que seja exibida a frase Calcular Mdia). Veja na Figura 13 - o boto inserido em nossa interface.

Figura 13 - Tornando um campo de texto no-editvel. Linguagem de Programao I

20

Captulo 1

Alm disso, fizemos com que os campos de texto com as notas da prova final e da mdia final deixassem de estar disponveis para serem editados pelo usurio. Para isso, clicamos com o boto direito em cada um dos campos e escolhemos a opo Propriedades. Em seguida, desmarcamos a opo editable (que faz com que ele no seja editvel). A nota da prova final no ficar editvel, a princpio, porque nem todos os alunos fazem prova final. Desta forma, adicionaremos um componente do tipo Caixa de seleo (do ingls, CheckBox) ao lado da campo com a nota da prova final. Como podemos escrever o texto Prova Final ao lado da caixa de seleo, podemos excluir da interface o rtulo Prova Final. Veja a nova interface na Figura 14:

Figura 14 - Incluindo uma caixa de seleo.

O que queremos que o campo com a nota da prova final passe a ser editvel quando a caixa de seleo for selecionada. Portanto, vamos definir uma ao a ser executada quando este evento ocorrer (ou seja, quando o usurio selecionar a caixa de seleo). Para isso, clicamos com o boto direito do mouse sobre a caixa de seleo que acabamos de criar, depois em Eventos, depois em Action (que significa ao em portugus) e depois na nica opo disponvel (actionPerformed [jCheckBox1ActionPerformed]). Repare que agora o NetBeans est exibindo o cdigo fonte da interface de nosso programa. Na verdade, o cdigo fonte j podia ser exibido desde quando criamos nosso Frame. Para isso, bastava alternarmos entre os botes CdigoTecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

21

Fonte e Projeto acima do cdigo (mostrados no topo das telas da Figura 2 - at a Figura 5 - deste captulo).

O cdigo fonte exibido pelo NetBeans contm vrios detalhes da linguagem Java que ainda no foram explicados neste material. No se preocupe com isto agora. Mais adiante, explicaremos todos estes detalhes.

Por enquanto, nossas atenes devem ser voltadas para o trecho de cdigo mostrado a seguir:

O trecho de cdigo comentado acima o local onde iremos inserir a ao a ser realizada quando nosso evento ocorrer. O que precisamos fazer alterar o estado do atributo editable do campo de texto com a nota do aluno. Para isso, iremos alterar o trecho de cdigo acima, adicionado os seguintes comandos:

Na primeira linha adicionada ao cdigo, verificamos se o campo jTextField6 atualmente editvel ou no. Text Field em portugus significa campo de texto, e o campo de texto que estamos alterando se chama jTextField6 porque foi o sexto a ser criado. Para verificar o nome de um componente qualquer em seu programa, clique no boto Projeto que fica acima do cdigo fonte do programa (para exibir o Frame com sua interface), depois clique com o boto direto do mouse sobre o componente cujo nome voc deseja saber, e escolha a opo Propriedades. O nome do componente aparecer no topo e no final da janela Propriedades. O mtodo isEditable( ) retorna um valor lgico (verdadeiro ou falso) indicando se o campo est editvel ou no (verdadeiro, para editvel; falso, para caso contrrio). O mtodo setEditable( ) recebe um valor
Linguagem de Programao I

22

Captulo 1

lgico como parmetro e modifica o estado editvel do campo. O operador ! em Java equivale negao (ou seja, transforma verdadeiro em falso, e falso em verdadeiro). Portanto, se o campo for editvel e clicarmos na caixa de seleo, ele passa a no ser mais editvel. Caso contrrio, se clicarmos na caixa de seleo, ele volta a ser editvel. Execute seu projeto e verifique se a ao est sendo executada corretamente. Veja na Figura 15 que nosso campo com a nota final passou a ser editvel aps clicarmos na caixa de seleo.

Figura 15 - Executando a primeira ao de nosso programa.

Agora que o usurio j consegue incluir a nota da prova final de um aluno, podemos finalmente calcular sua mdia final. O clculo dever ser efetuado quando o usurio clicar no boto Calcular Mdia. Portanto, precisamos definir a ao que ser executada quando ocorrer o evento (ou seja, quando o usurio clicar no boto). Para isso, volte tela de exibio do Frame, clique com o boto direito do mouse sobre o boto adicionado ao Painel Notas do aluno e escolha a opo Eventos, depois Action e, por fim, actionPerformed (como fizemos para definir a ao anterior). Desta vez, foi includo no cdigo fonte o seguinte trecho de cdigo:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Primeiros passos em Java

23

A seguir, mostramos o trecho de cdigo necessrio para efetuarmos o clculo da mdia final do aluno e, em seguida, explicamos o que o cdigo faz:

Como podemos observar no trecho de cdigo acima, Java possui o tipo double, assim como C, que utilizado para representar um nmero real com preciso dupla. Entretanto, os campos de texto digitados pelo usurio so tratados sempre como String. Para calcularmos a mdia, portanto, precisamos encontrar os valores digitados e transform-los em double. O mtodo this.jTextField3.getText( ), por exemplo, recupera o texto digitado no campo jTextField (que corresponde primeira nota do aluno). O mtodo Double.parseDouble foi utilizado, ento, para transformar o texto com esta nota em double. O mtodo this.jTextField6.isEditable(), j explicado nesta mesma seo, retorna se o campo de texto com a nota da prova final est editvel ou no. Em nosso caso, isso significa se o aluno fez ou no prova final. Por fim, Double. toString(media) transforma a mdia final (que um double) em String, para que ela seja definida como o texto do campo com a mdia final atravs do mtodo this.jTextField7.setText(Double.toString(media)).

Linguagem de Programao I

24

Captulo 1

ATIVIDADE 3. Agora desenvolva seu programa com calma, execute-o, e verifique se a mdia est sendo calculada corretamente. No se preocupe muito com aspectos da linguagem Java que voc no conhece, pois os mesmos sero explicados em detalhes a partir do prximo captulo. No mais, seja bem-vindo ao mundo dos programadores Java, que a linguagem mais utilizada no mercado de trabalho atualmente!

No apague seu projeto! Iremos retom-lo no captulo 4. Se precisar acessar os arquivos de seu projeto, eles ficam armazenados dentro da pasta NetBeans Projects, que fica na pasta Meus Documentos.

Tecnologia em Anlise e Desenvolvimento de Sistemas

INTRODUO LINGUAGEM JAVA

Prezado aluno, No primeiro captulo deste material, criamos nosso primeiro programa em Java. Para isso, partimos da criao da interface do programa, o que no to comum: geralmente, a interface s feita aps projetarmos e desenvolvermos um sistema (afinal, a interface apenas a parte do programa que ser exibida ao usurio). A lgica por trs de um programa pode ser desenvolvida antes de a interface ser criada. Neste captulo, vamos mostrar alguns conceitos bsicos e os tipos de dados desta linguagem, que ser utilizada em todos os exemplos deste material. Existem diversas linguagens orientadas a objetos, mas optamos por estudar a linguagem Java devido a seu crescimento no mercado atual. A seguir, apresentaremos diversas questes referentes a ela. Neste momento, deixaremos de lado a construo de interfaces grficas para nos concentrarmos nos aspectos mais simples da linguagem. Voltaremos a mostrar exemplos de interfaces a partir do captulo 4. Ao trmino deste captulo, voc dever ser capaz de criar programas simples em Java, de manipular suas variveis, de controlar o fluxo dos programas utilizando if-else, e de criar laos com for e while. Uma dica importante: preste bastante ateno na sintaxe, pois Java case sensitive (sensvel ao caso), ou seja, o compilador diferencia letras maisculas de minsculas.

2.1 Programa simples em Java


Neste captulo ainda no mostraremos os conceitos de orientao a objeto, que uma das principais caractersticas da linguagem Java. Tambm deixaremos um pouco de lado a criao de interfaces grficas, que iniciamos no captulo passado, e qual retomaremos mais para frente. Por enquanto, vamos nos focar na criao de programas em Java semelhantes aos que crivamos em C. Apresentamos a seguir um exemplo simples de cdigo na linguagem Java.

26

Captulo 2

A principal diferena que podemos notar j de incio que todo programa em Java inicia-se com a definio de uma classe. Uma classe definida atravs da palavra reservada class, seguida pelo nome da classe (neste caso, o nome da classe Exemplo01). Por conveno, todo nome de classe inicia-se com uma letra maiscula.

Preste bastante ateno na sintaxe, pois Java case sensitive (sensvel ao caso), ou seja, o compilador diferencia letras maisculas de minsculas.

Uma classe em Java composta por mtodos (considerados funes ou procedimentos em outras linguagens de programao). Obrigatoriamente, a classe principal (aquela que ser executada inicialmente pelo programa) deve possuir um mtodo chamado main, assim como em C, que invocado quando a classe executada.

A palavra main significa principal em ingls. O mtodo main, portanto, ser o mtodo principal do seu programa.

Os atributos public e static sero descritos mais adiante. O atributo void, assim como em C, indica que o mtodo no possui retorno. O argumento String args[ ] um vetor de Strings formado por todos os argumentos passados ao programa na linha de comando quando o programa invocado. O comando System.out.println ( ) imprime algo na tela. Para compilar e executar o programa, primeiro preciso salv-lo com o nome Exemplo01.java. Voc pode faz-lo at mesmo em um editor de texto simples, mas continuaremos a mostrar nossos exemplos no NetBeans. Para no haver confuso com os cdigos do captulo passado, crie um novo projeto no NetBeans. Desta vez, deixe marcadas as opes
Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

27

Criar classe principal (defina o nome da classe principal como Exemplo01) e Definir como projeto principal. A classe Exemplo01 criada j ir possuir um mtodo main. Neste caso, apenas insira no mtodo o comando System.out.println (Primeiro exemplo).

Em Java, o nome do arquivo deve ser sempre igual ao nome da classe, seguida da extenso .java. No caso do nosso exemplo, o nome do arquivo precisa ser Exemplo01.java porque o nome da classe Exemplo01.

Em seguida, execute o projeto. Como no criamos uma interface para o programa, a sada ser exibida na aba Sada, localizada abaixo dos cdigos fontes no NetBeans. Veja em destaque na Figura 16 - esta regio com a sada do programa:

Figura 16 - Sada de um programa Java no NetBeans

Se voc for executar o programa fora do NetBeans, necessrio abrir o prompt na pasta em que salvou o arquivo e digitar os seguintes comandos:

Linguagem de Programao I

28

Captulo 2

O primeiro comando gera o bytecode do programa, chamado Exemplo01.class. O segundo executa o programa a partir do bytecode gerado no primeiro comando.

Se for necessrio incluir mais de uma classe em um mesmo arquivo, s uma delas poder ser public. Esta ser a classe principal do arquivo. Caso nenhuma classe seja public, o compilador entender que a classe principal aquela com o mesmo nome do arquivo.

Leia mais sobre Java em : http://javafree.uol.com.br/artigo/871498/Tutorial-Java-Oque-e-Java.html

Curiosidade: O que acontece se voc tentar compilar um arquivo sem nada dentro (nenhuma letra e nenhuma quebra de linha)?

ATIVIDADE 4. Modifique o programa anterior para que ele imprima duas mensagens, uma em cada linha.

2.2 Tipos de Dados e Definio de Variveis


Alm dos tipos de dados existentes no C, o Java possui tambm um tipo lgico (boolean), que pode assumir os valores verdadeiro (true) ou falso (false). Os tipos de dados primitivos da linguagem Java esto enumerados no Quadro 1, mostrado a seguir:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

29

Tipo de dados Literal (caractere)

Definio Letras, nmeros e smbolos.

Tipo char

Tamanho (bits) 16 8 32 16 64 32

Exemplos a, ?, * 0, 1, 23 0, 1, 23 0, 1, 23 0, 1, 23 0.34 8.65 0.34 8.65 true false

Inteiro

Byte Nmeros Int inteiros positivos ou short negativos. Long

Nmeros float com casas Real (ponto decimais, flutuante) positivos ou double negativos. Lgico (Booleano) Verdadeiro (1) ou falso (0)

64

boolean

Quadro 1 - Tipos de dados primitivos em Java

Para uma varivel ser utilizada, ela precisa ser declarada. Opcionalmente, ela pode ser inicializada j no momento de sua declarao. O cdigo a seguir mostra alguns exemplos de manipulao de variveis em Java:

Linguagem de Programao I

30

Captulo 2

Como voc pde perceber no ltimo exemplo, um comentrio em Java pode ser escrito com // (para comentar apenas at o final da linha) ou com /* */ (para comentar tudo o que estiver entre o /* e o */). Para identificar a documentao, utilizamos /** */

A sada do programa acima ser:

Caso uma varivel do tipo char, byte, short, int, long, float ou double no seja inicializada, ela criada com o valor 0. Se ela for do tipo boolean, seu valor padro ser false.

possvel criar mais de uma varivel do mesmo tipo na mesma linha, separando-as por uma vrgula. Exemplo: int x, y, z;

ATIVIDADE 5. Insira em seu programa duas variveis de cada um dos tipos primitivos do Java. Coloque valores diferentes em cada uma delas e depois imprima-as. 6. Altere trs vezes o valor de uma das variveis do programa anterior. Imprima a varivel a cada nova atribuio.

Em Java, existem duas formas de convertermos valores de um tipo para outro: 1. a converso implcita, na qual os dados so convertidos automaticamente, sem a preocupao do programador. Ela ocorre, por exemplo, quando convertemos um nmero inteiro para um nmero real. Neste caso, a converso implcita porque bvio para o
Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

31

compilador que um nmero inteiro pode ser representado tambm como um nmero real. Veja um exemplo a seguir:

2. a converso explcita, quando o programador precisa explicitar no cdigo que um valor ser convertido de um tipo para outro. No caso de um nmero real para um inteiro, por exemplo, pode haver perda na preciso do nmero (por isso necessrio que o usurio deixe explcito que ele quer realizar a converso). Veja um exemplo a seguir:

O resultado da execuo do trecho de cdigo acima :

Cuidado: o tipo boolean no pode ser convertido para nenhum outro tipo. Seguindo o sentido das flechas da Figura 17 -, vemos os tipos que podem ser implicitamente convertidos em outros. Seguindo o sentido contrrio, vemos os tipos que precisam ser convertidos explicitamente:

short

byte int char long float double

Figura 17 - Converses possveis entre tipos primitivos em Java

Linguagem de Programao I

32

Captulo 2

ATIVIDADE 7. Crie trs variveis do tipo int contendo os valores 12, 13 e 14. Converta cada uma para um float e imprima o valor convertido. Qual o resultado impresso na tela? 8. Agora, crie trs variveis do tipo float contendo os valores 12.3, 12.5 e 12.8. Converta cada uma para int e imprima o valor convertido. Qual o resultado impresso na tela? 9. Tente imprimir a soma de uma varivel inteira com uma do tipo float. O que acontece?

2.3 Strings

String uma classe em Java que guarda uma palavra, ou seja, uma sequncia de caracteres.

String uma classe para representarmos uma cadeia de caracteres e que oferece diversos mtodos para manipularmos essa cadeia. Objetos da classe String podem ser concatenados com o operador +. Exemplos:

A sada do trecho de cdigo acima :

Para compararmos se o valor de duas Strings so iguais, utilizamos o mtodo equals (o operador = = no compara Strings). Veja no exemplo a seguir:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

33

O trecho de cdigo a seguir mostra outros mtodos teis da classe String:

A sada do trecho de cdigo acima :

ATIVIDADE 10. Crie uma String com seu nome completo e sobrescreva as ocorrncias da letra a pela letra p. Como ficou seu nome? 11. Utilize o mtodo split para separar cada nome e sobrenome da String acima.

Linguagem de Programao I

34

Captulo 2

2.4 Arrays
Arrays (vetores) em Java podem conter qualquer tipo de elemento valorado (tipos primitivos ou objetos), mas voc no pode armazenar diferentes tipos em um simples array (por exemplo, voc pode criar um array de inteiros, ou um array de strings, ou um array de array, mas voc no pode criar um array que contenha ambos os objetos strings e inteiros). O trecho de cdigo abaixo mostra algumas declaraes possveis de arrays:

Uma das formas de criarmos um objeto array usando o operador new, que criar uma nova instncia de um array. Por exemplo:

Neste caso, ser criado um array de 30 inteiros (inicializados com o valor 0). Tambm possvel criarmos um array ao mesmo tempo em que o declaramos.

Uma vez que o array j foi devidamente criado, podemos acessar e/ou alterar o valor dos elementos em cada um de seus ndices. Os arrays em Java sempre iniciam com elementos na posio 0. Por exemplo:

A ltima linha do trecho de cdigo acima causa um erro de compilao, pois o ndice 2 no existe em um array com apenas dois elementos. Arrays podem ter mais de uma dimenso. Um array bidimensional, por exemplo, um array de arrays. Podemos simular uma matriz de nmeros, por exemplo, usando arrays bidimensionais. Veja um exemplo a seguir:
Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

35

Para sabermos o tamanho de um array, podemos utilizar o atributo length, assim como em uma String. A partir do momento que um array foi criado, ele no pode mudar de tamanho. Se voc precisar de mais espao, ser necessrio criar um novo array e, antes de se referir a ele, copie os elementos da array antigo. Mais adiante, aprenderemos tcnicas mais eficientes para preencher e manipular nossos Arrays.

ATIVIDADE 12. Crie um novo programa, que armazene um vetor com as notas de 10 alunos, e imprima a mdia dessas notas. 13. Crie no mesmo programa acima um array de Strings com o nome dos meses do ano. Crie uma varivel inteira com um valor entre 1 e 12, e imprima o nome do ms correspondente ao valor da varivel

Leia mais sobre caractersticas bsicas de Java em : http://javafree.uol.com.br/artigo/871496/Tutorial-Java-2Caracteristicas-Basicasindex

2.5 Operadores
Os operadores aritmticos para manipularmos as variveis em Java so os mesmos da linguagem C. Utilizamos + para somar dois valores, - para subtrair, * para multiplicar, / para dividir, % para calcular o resto da diviso inteira, ++ para incrementar um valor e -- para decrementar. Java tambm possui vrios operadores para testar igualdade e magnitude. Utilizamos = = para verificar se dois valores so iguais, != para
Linguagem de Programao I

36

Captulo 2

verificar se so diferentes, < para verificar se o primeiro menor que o segundo, > para verificar se ele maior, <= para menor e igual, e >= para maior ou igual. Para combinarmos valores ou expresses lgicas, utilizamos && (operao E), | | (operao OU) e ! para negar um valor.

ATIVIDADE 14. Crie um nmero inteiro de 3 dgitos. Utilize os operadores / e % para obter o nmero com os algarismos na ordem inversa. Exemplo: x = 356 e y = 653 15. Crie uma varivel inteira contendo um nmero de segundos e imprima o nmero equivalente de horas, minutos e segundos. 16. Avalie o resultado da expresso a seguir:
((3<4) && ((5<=7 || 8==10 || 9>3) && !(4<5)) || (2>0))

2.6 Funes matemticas


Na classe Math, existe uma srie de mtodos estticos que fazem operaes com nmeros como, por exemplo, arredondar (round), obter o valor absoluto (abs), obter a raiz (sqrt), calcular o seno (sin) e outros.

A documentao do Java apresenta outros mtodos que podem ser teis, como nmeros aleatrios, tangentes, logaritmo etc. ATIVIDADE 17. Calcule a rea e o comprimento de uma circunferncia de raio r = 12. 18. Crie as variveis reais a, b e c e calcule as razes da equao ax 2 + bx + c.
Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

37

2.7 Controle de fluxo


Comandos condicionais em Java so semelhantes aos de C. O trecho de cdigo a seguir, por exemplo, verifica se uma pessoa maior de idade.

No necessrio que todo IF seja acompanhado de um ELSE, mas todo ELSE s pode existir aps um IF. Podemos tambm concatenar expresses booleanas com os operadores lgicos E e OU. O primeiro representado por &&, e o segundo por | |. No exemplo a seguir, o programa verifica se uma pessoa precisa pagar passagem de acordo com sua idade (neste caso, no pagam passagens pessoas de at 2 anos ou a partir de 60 anos):

A estrutura SWITCH-CASE equivale a um conjunto de clusulas IF encadeadas, deixando o cdigo mais legvel e eficiente no caso de grandes desvios condicionais. Exemplo:

Voc saberia criar um trecho de cdigo que faa o mesmo que o exemplo acima, mas utilizando apenas IF-ELSE ao invs de SWITCH-CASE?
Linguagem de Programao I

38

Captulo 2

ATIVIDADE Vamos agora treinar os comandos condicionais. 19. O que faz o trecho de cdigo a seguir?

20. Crie trs variveis reais, define valores quaisquer para elas, e define um cdigo que verifique se elas mesmas podem ser lados de um tringulo (ou seja, nenhuma pode ser maior que a soma das outras duas). 21. Crie uma varivel contendo a idade de uma pessoa e verifique a sua classe eleitoral: at 16, anos no pode votar; entre 16 e 18 anos ou mais que 65, votar facultativo; entre 18 e 65 anos, votar obrigatrio. 22. Crie uma varivel inteira contendo um dia do ano e outra contendo um ms, e verifique se elas formam uma data vlida (considere que fevereiro sempre possui 28 dias). 23. Verifique se um nmero inteiro qualquer corresponde a um ano bissexto. Anos bissextos so os mltiplos de 4 que no so mltiplos de 100, e ainda os mltiplos de 400. Exemplo: 1996 e 2000 so bissextos, enquanto 1998 e 1900 so comuns.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

39

24. Crie dois nmeros inteiros e imprima: a) A soma dos dois, caso ambos sejam pares; b) O produto, caso sejam mpares; c) O nmero mpar, caso um seja par e outro no. 25. Escreva um programa que verifique se uma nota pssima (nota=1), ruim (2), regular (3), boa (4), tima (5) ou nenhuma delas (nota invlida).

Utilizamos um WHILE para criarmos um lao (loop), ou seja, repetir um trecho de cdigo algumas vezes enquanto uma determinada condio for verdadeira. O exemplo abaixo imprime os 5 primeiros mltiplos de 9:

O trecho de cdigo dentro do WHILE ser executado enquanto a condio x <= 5 for verdadeira. Isso deixar de acontecer no momento em que x > 5. O comando FOR tambm utilizado para criarmos loops. A ideia a mesma que a do WHILE, mas existe um espao prprio para inicializar e modificar a varivel de controle do lao, deixando-o mais legvel. O exemplo abaixo gera o mesmo resultado do WHILE acima.

O FOR e o WHILE podem ser utilizados para o mesmo fim. Porm, o cdigo do FOR indica claramente que a varivel i serve, em especial, para controlar a quantidade de laos executados. Use cada um quando achar mais conveniente. O for tambm muito til para percorrermos um array. Para isso, basta usarmos o atributo length, que retorna o tamanho do array. Veja um exemplo:

Linguagem de Programao I

40

Captulo 2

ATIVIDADE Use WHILE ou FOR nos exerccios a seguir: 26. Imprima todos os nmeros de 150 a 300. 27. Imprima a soma de todos os nmeros de 1 a 1000. 28. Crie um nmero inteiro e verifique se ele primo. 29. Qual o valor de n no final do cdigo a seguir?

30. Imprima o fatorial de um nmero inteiro qualquer. 31. Imprima o fatorial dos nmeros de 1 a 10. Crie um for que comece imprimindo o fatorial de 1, e a cada passo utilize o ltimo resultado para o clculo do fatorial seguinte. 32. Imprima os 30 primeiros elementos da srie de Fibonacci. A srie a seguinte: 1, 1, 2, 3, 5, 8, 13, 21 etc. Para calcul-la, o primeiro e segundo elementos valem 1, da por diante, cada elemento vale a soma dos dois elementos anteriores (ex: 8 = 5 + 3).

2.8 Escopo das variveis


Em Java, podemos declarar variveis a qualquer momento. Entretanto, o trecho de cdigo em que ela ser vlida depender de onde ela foi declarada.

Escopo da varivel o nome dado ao trecho de cdigo em que a varivel existe e no qual possvel acess-la.

Quando abrimos um novo bloco com as chaves, as variveis declaradas ali dentro s existiro at o fim daquele bloco.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Introduo linguagem Java

41

Tenha cuidado! Se criar uma varivel dentro de um bloco e tentar utiliz-la fora deste bloco haver um erro de compilao. Tambm possvel declararmos um bloco dentro de outro. Podemos inserir um IF dentro de um lao, um lao dentro de um IF, um lao dentro de outro, e assim sucessivamente. Veja um exemplo a seguir:

2.9 Garbage collection


Java no mantm reservadas as reas de memria que no esto sendo utilizadas porque possui uma alocao dinmica de memria em tempo de execuo. Os objetos que no so mais referenciados so coletados pelo Garbage Collector, liberando a memria que no est mais em uso. Em C e C++ (e em outras linguagens) o programa desenvolvido responsvel pela alocao e desalocao da memria. Durante o ciclo de execuo do programa, o Java verifica se as variveis de memria esto sendo utilizadas; caso no estejam, o Java libera automaticamente esta rea que no est sendo utilizada. Leia mais sobre Garbage Collection, em: http://javafree.uol.com.br/artigo/1386/Garbage-Collection.html
Linguagem de Programao I

42

Captulo 2

Neste captulo mostramos como voc pode criar em Java os programas que voc j sabia criar em outras linguagens estruturadas. A partir daqui, mostraremos o que Orientao a Objetos, que presente em Java e no presente em linguagens como C.

Tecnologia em Anlise e Desenvolvimento de Sistemas

ORIENTAO A OBJETOS: CLASSES, OBJETOS E MTODOS

Prezado aluno, Neste captulo abordaremos os conceitos bsicos da Orientao a Objetos, que o tema desta matria. Para comear, discutiremos um pouco os motivos que fizeram com que ela se tornasse to popular hoje em dia. Em seguida, mostraremos como alguns dos conceitos bsicos da POO devem ser implementados em Java. Ao final deste captulo voc dever ser capaz de compreender o que orientao a objetos, e o que e como criamos uma classe e um objeto em Java.

3.1 Introduo orientao a objetos


Boa parte de nosso entendimento e relacionamento com o mundo se d atravs do conceito de objetos. Ao observarmos as coisas e seres que existem ao nosso redor, existe uma natural tendncia a tentarmos identificar o que cada uma destas diferentes entidades. Ao olharmos para uma bola de futebol, reconhecemos sua forma esfrica, seu tamanho usual, colorido tpico e aplicao. Mas a bola que observamos no a nica que existe, inmeras outras esto por a e, mesmo possuindo caractersticas idnticas, so objetos distintos. Como o prprio nome indica, a bola de futebol, ou seja, para ser usada no esporte que denominamos futebol, um tipo de bola especfica. Assim, bola de futebol representa uma classe de objetos que apresentam caractersticas prprias. Cada uma das bolas de futebol existentes um objeto desta classe de objetos. Existem outras bolas (outros tipos) que no so de futebol. Bolas especiais para os mltiplos esportes diferentes e bolas de recreao so exemplos de outras classes de objetos que compartilham das mesmas caractersticas de uma bola, ou melhor, de uma esfera.

44

Captulo 3

Pode parecer bvio, mas a dificuldade inicial do paradigma da Orientao a Objetos justamente saber distinguir o que classe e o que objeto. comum o iniciante utilizar, obviamente de forma errada, essas duas palavras como sinnimas. Nas prximas sesses deste e dos prximos captulos, mostraremos algumas das principais terminologias utilizadas na POO que sero utilizadas em todo este material, como classes, objetos, herana, mtodos, polimorfismo e encapsulamento.

3.2 Classe e objeto


Uma classe um tipo de objeto que pode ser definido pelo programador para descrever uma entidade real ou abstrata. Podemos entender uma classe como um modelo ou como uma especificao para certos objetos, ou seja, a descrio genrica dos objetos individuais pertencentes a um dado conjunto. A bola de futebol pode ser uma classe que descreve os objetos bola de futebol. A definio de uma classe envolve a definio de variveis s quais se associam funes que controlam o acesso a estes objetos. Assim, a criao de uma classe implica definir um tipo de objeto em termos de seus atributos (variveis que contero os dados) e seus mtodos (funes que manipulam tais dados). Uma classe representa uma entidade e, como tal, define o seu comportamento (mtodos) e as suas caractersticas (propriedades). Os acontecimentos que podem ocorrer para uma dada entidade em determinada altura so chamados de eventos.

Classe um componente de programa que descreve a estrutura e o comportamento de um grupo de objetos semelhantes isto , as informaes que caracterizam o estado desses objetos e as aes (ou operaes) que eles podem realizar. J um objeto uma instncia de uma classe. Ele capaz de armazenar estados atravs de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Joo, Jos e Maria, por exemplo, podem ser exemplos de objetos da classe Pessoa, descrita acima.
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: classes, objetos e mtodos

45

Objeto a criao de uma instncia da classe. Quando instanciamos um objeto, criamos fisicamente uma representao concreta de sua classe. Ser Humano uma classe, um molde; j Roberto uma instncia de Ser Humano. Apesar de carregar todas as caractersticas do molde Ser Humano, ele completamente diferente (independente) das outras instncias de Ser Humano. Um outro exemplo: uma receita de bolo. Voc come uma receita de bolo? A resposta No. Precisamos instanci-la, criar um objeto bolo a partir dessa especificao (a classe) para utiliz-la. Podemos criar centenas de bolos a partir dessa classe (a receita, no caso) e eles podem ser bem semelhantes, alguns at idnticos, mas so objetos diferentes. Podemos fazer vrias analogias semelhantes. A planta de uma casa uma casa? Definitivamente no. No podemos morar dentro da planta de uma casa, nem podemos abrir sua porta ou pintar suas paredes. Precisamos, antes, construir instncias a partir dessa planta. Essas instncias, sim, podemos pintar, decorar ou morar dentro.

3.3 Classes e objetos em java


Para exemplificar a implementao de classes em Java, vamos criar uma classe que armazena os dados da conta de um usurio no banco. Por enquanto, vamos escrever apenas o que a conta possui (atributos), e no o que ela faz (mtodos).

Estes so os atributos que toda conta, quando criada, ir possuir. Repare que essas variveis foram declaradas fora de um bloco, diferente do que fizemos na classe que possua um mtodo main. Quando uma varivel declarada diretamente dentro do escopo da classe, ela chamada de varivel de objeto, ou atributo. O diagrama da Figura 18 - mostra o que temos em nossa classe at agora:
Linguagem de Programao I

46

Captulo 3

Conta
# numero : int # nome : String # saldo : double # limite : double

Figura 18 - Atributos da classe Conta

A classe Conta especifica o que todos os objetos dessa classe devem conter. Neste caso, ela no possuir um mtodo chamado main porque ela no ser a classe principal do nosso programa. Para isso, criaremos uma classe Programa, que criar um objeto da classe Conta.

Preste ateno no ponto que foi utilizado em minhaConta.nome e minhaConta.saldo. assim que acessamos uma varivel de objeto. Agora, sempre que o programa for iniciado, a conta pertencer ao usurio Hilrio e seu saldo ser de mil reais. A criao de um objeto a partir de uma classe chamada de processo de instanciao. Para realizar a instanciao de um objeto qualquer, usado o operador new (FURGERI, 2005). Se quisssemos criar mais de uma conta, bastaria criarmos vrios objetos da classe conta com o operador new, dando um nome diferente para cada conta. Cada uma delas teria um valor independente para seus atributos. Ao salvarmos o cdigo correspondente a uma classe em um arquivo, devemos tomar os seguintes cuidados: 1. em um nico arquivo Java podem existir vrias diferentes definies de classes, mas apenas uma delas pode ser pblica;
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: classes, objetos e mtodos

47

2. o nome do arquivo deve ser o nome da classe pblica, observando-se cuidadosamente o uso do mesmo caixa (maisculas e minsculas) tanto para o nome da classe como para o nome do arquivo. No nosso caso, o programa deve se chamar Programa.java.

ATIVIDADE 33. Implemente a classe Pessoa, contendo os atributos nome, altura e peso, pelo menos. Crie alguns objetos desta classe e defina valores diferentes para os atributos de cada um deles. 34. Crie 10 objetos da classe Pessoa e insira-os em um array de objetos desta classe. Utilize um for para imprimir todos os atributos dos objetos do array. 35. Crie uma classe para um Funcionrio. Ela deve ter o nome do funcionrio, o departamento onde trabalha, seu salrio (double), a data de entrada no banco (String), seu RG (String) e um valor booleano que indique se o funcionrio est na empresa no momento ou se j foi embora. 36. Crie uma classe Empresa que possui nome, cnpj, qtde_de_ funcionario e um array de objetos da classe Funcionario (o array pode armazenar at 100 funcionrios).

3.4 Mtodos
Dentro da classe, tambm declaramos o que cada conta faz e como isto feito (os comportamentos que cada classe tem, isto , o que ela faz). As operaes que um objeto oferece so chamadas de mtodos. Andar, Correr e Comer, por exemplo, podem ser mtodos da classe Pessoa.

Mtodos so comportamentos que os objetos de uma classe podem possuir. A operao de ligar um objeto da classe Moto, por exemplo, pode ser feita com o mtodo ligar( ).

Linguagem de Programao I

48

Captulo 3

Por exemplo, de que maneira uma quantia em dinheiro sacada de uma conta? Especificaremos isso dentro da prpria classe Conta. por isso que essas funes so chamadas de mtodos: pois esta a maneira (o mtodo) de fazermos alguma operao com um objeto. No cdigo a seguir, adaptaremos a classe Conta criada anteriormente para incluir o mtodo sacar.

O mtodo sacar recebe como argumento (ou parmetro) um valor do tipo double contendo a quantidade de dinheiro a ser sacada da conta do usurio. Sem o argumento, impossvel sabermos o quanto devemos subtrair do saldo da conta. Essa varivel chamada quantidade pode ser acessada durante todo o mtodo, ao final do qual ela deixa de existir. A palavra void indica que nenhum valor ser retornado por este mtodo. A palavra this (que j estava presente no cdigo da interface que criamos no primeiro captulo) permite que acessemos o valor de um atributo da prpria classe em questo, no nosso caso a classe Conta.

A palavra reservada this muito importante e til. Ela referencia a prpria instncia de dentro de sua classe. Cuidado: o termo this no pode ser usada em mtodos estticos, como veremos mais adiante. Agora criaremos um mtodo parecido com o anterior, mas para depositar dinheiro na conta.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: classes, objetos e mtodos

49

O += soma o valor de quantidade ao valor antigo do saldo e guarda o resultado no prprio saldo. Para fazer com que um objeto execute algum mtodo, tambm colocamos um ponto. A Figura 19 - mostra o diagrama da classe Conta com os mtodos criados acima:

Conta
# numero : int # nome : String # saldo : double # limite : double # sacar() : void # depositar() : void
Figura 19 - Atributos e mtodos da classe Conta

No cdigo a seguir, alteramos a classe Programa para sacarmos dinheiro da conta e depois depositarmos.

Linguagem de Programao I

50

Captulo 3

ATIVIDADE 37. Crie os seguintes mtodos para a classe Funcionario, criada anteriormente: a) mtodo bonificar, que aumenta o salrio do funcionrio de acordo com o parmetro passado como argumento; b) mtodo demitir, que no recebe parmetro algum, apenas modifica o valor booleano indicando que o funcionrio no trabalha mais na empresa; c) mtodo mostrarDados, que simplesmente imprime todos os atributos de um funcionrio. 38. Crie dois objetos da classe Funcionario com os mesmos atributos. Compare os dois com o operador = = e veja se o resultado true ou false. 39. Insira na classe Pessoa, tambm criada anteriormente, o atributo idade e o mtodo aniversario, que incrementa sua idade. Crie um objeto desta classe, defina a idade, chame o mtodo aniversario algumas vezes e depois imprima novamente a idade.

Dicas: 1. V compilando seus arquivos na medida em que for incluindo classes, variveis e mtodos. Se criar um programa grande e compil-lo todo de uma vez, pode ficar mais difcil encontrar os vrios erros de digitao que podem aparecer. 2. Por enquanto, voc pode colocar vrias classes em um mesmo arquivo. Mais adiante, veremos que em alguns casos importante escrever algumas classes em arquivos separados. No se preocupe com isso neste momento!

Em todo mtodo devemos especificar o tipo de seu retorno. Nos casos anteriores, utilizamos a palavra void, que significa que no h um valor de retorno do mtodo. Quando um mtodo possui um valor de retorno, esse valor devolvido para o cdigo que o chamou. O mtodo sacar, por exemplo, poderia retornar um valor booleano indicado se a operao foi bem sucedida (o que acontece se a quantidade a ser sacada no for maior que o valor do saldo mais o limite da conta). Veja no exemplo a seguir:
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: classes, objetos e mtodos

51

Note que agora a declarao do mtodo mudou. O retorno do mtodo no mais void, e sim boolean. A palavra return indica que o mtodo ser retornado ali, e o valor ao lado dela que ser devolvido como retorno. Abaixo temos um exemplo de como utilizar o valor de retorno da nova funo sacar.

Para simplificar o cdigo, podemos obter o mesmo resultado da seguinte forma:

Linguagem de Programao I

52

Captulo 3

ATIVIDADE 40. Crie um mtodo na classe Empresa chamado incluirFuncionario que recebe um objeto da classe Funcionario como parmetro e inclui este funcionrio no array de funcionrios. O mtodo deve retornar false se j existia um funcionrio com mesmo RG na empresa (neste caso, o funcionrio no deve ser reinserido). Caso contrrio, o funcionrio includo, o atributo qtde_de_funcionario incrementado e o mtodo retorna true. Crie tambm um mtodo chamado numeroDeFuncionarios que retorna a quantidade de funcionrios da empresa que no foram demitidos.

Variveis podem ser estticas ou no. Para que uma varivel seja esttica, preciso declar-la utilizando a palavra-chave static. Exemplo:

Uma varivel esttica, declarada em uma determinada classe, compartilhada por todos os objetos dessa classe e criada uma nica vez durante a execuo do programa. Uma varivel de objeto, ao contrrio, criada a cada vez que um novo objeto dessa classe criado.

Mtodos tambm podem ser estticos ou no. Um mtodo esttico s pode usar as variveis da classe que forem estticas (alm das variveis recebidas como parmetro pelo mtodo)1. Mas, afinal, quando devemos ou no utilizar um mtodo esttico? Os mtodos estticos foram criados para resolver situaes especiais na orientao a objetos, e tambm para simplificar certas operaes. Imagine que exista uma classe chamada CPF, criada por outro programador, que tenha apenas um mtodo chamado validaCPF que verifica se um CPF valido ou no. Segundo a lgica da orientao a objetos, precisaramos instanciar um objeto desse tipo para utilizarmos seu mtodo para a verificao do CPF. Isso um tanto quanto incmodo, pois o que necessitamos, neste caso, simplesmente uma funcionalidade, e no um
1 Um mtodo que no seja esttico pode usar qualquer varivel declarada na classe em que ele declarado, esttica ou no. Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: classes, objetos e mtodos

53

objeto. Da mesma maneira, existem dezenas de funes matemticas, fsicas, estatsticas que precisamos utilizar sem a necessidade de instanciarmos um objeto. O que queremos apenas enviar os parmetros e receber resultados, como se esses mtodos fossem funes. Nesses casos podemos criar esse mtodo como esttico (static). Um mtodo esttico presente em uma classe no obriga a instanciar um objeto para que se tenha acesso a seus servios; ele serve apenas para que possamos aproveit-lo em pequenas computaes. Assim, para verificarmos se o CPF vlido, precisaramos apenas da seguinte instruo:

ATIVIDADE 41. Por que o cdigo abaixo no ir compilar?

A partir do prximo captulo e ao longo deste material, mostraremos como incluir estes novos conceitos na interface criada no primeiro captulo.

Leia mais sobre POO em Java em : http://javafree.uol.com.br/artigo/871497/Tutorial-Java-3Orientacao-a-Objetos

muito importante voc ter certeza de que compreendeu os principais conceitos de Orientao a Obejtos vistos at aqui antes de prosseguir a leitura deste material. No prximo captulo, veremos outros conceitos que dependem do entendimento dos que foram vistos aqui.

Linguagem de Programao I

54

Captulo 3

Tecnologia em Anlise e Desenvolvimento de Sistemas

ORIENTAO A OBJETOS: MTODOS E ENCAPSULAMENTO

Prezado aluno, neste captulo continuaremos a estudar os conceitos bsicos de Orientao a Objetos. Agora, mostraremos o que encapsulamento e o que , quando e como utilizamos um construtor. Aps este captulo, voc dever ser capaz de encapsular os dados de uma classe e criar mtodos e construtores que manipulem esses dados.

Vamos relembrar alguns conceitos importantes da programao orientada a objetos aprendidos no captulo anterior: Classe: um tipo de objeto que pode ser definido pelo programador para descrever uma entidade real ou abstrata. Objeto: uma instncia de uma classe. Por exemplo, vamos imaginar uma classe chamada Moto. Cada moto existente uma instncia (ou um objeto) dessa classe. Apesar de parecidas, cada moto possui caractersticas prprias, como cor, chassi, arranhes etc. Mtodos: so comportamentos que os objetos de uma classe podem possuir. Eles definem as operaes que podemos realizar com os objetos de uma classe.

4.1 Construtores

Quando usamos a palavra new, como fizemos no cdigo da classe Programa, estamos construindo um novo objeto. Sempre que isso feito, o construtor da classe executado. O construtor da classe um bloco declarado com o mesmo nome que a classe. Veja um exemplo no cdigo a seguir:

56

Captulo 4

No caso do exemplo acima, sempre que um novo objeto da classe Conta for criado, a mensagem Nova conta criada aparecer na tela. como uma rotina de inicializao que chamada sempre que um novo objeto criado. Apesar de parecer, um construtor no um mtodo.

At agora, as nossas classes no possuam nenhum construtor. Mas, se o construtor da classe sempre executado quando um novo objeto criado, o que acontecia quando crivamos nossas classes at ento? Quando voc no declara algum construtor na sua classe, o Java cria um para voc. Esse construtor o construtor padro, que no recebe nenhum argumento e cujo corpo vazio. A partir do momento em que voc declara um construtor, o construtor padro no existe mais.

O interessante que o construtor pode receber parmetros, assim como um mtodo. Para aprimorar o construtor da classe Conta, por exemplo, poderamos receber o valor do nome do titular da conta como parmetro. Veja no trecho de cdigo a seguir:

Agora no precisamos mais atribuir os valores a esses parmetros aps instanciarmos o objeto minhaConta da classe Programa. Ao invs disso,
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

57

passamos os valores como parmetro para o construtor da classe Conta ao criarmos o objeto. Veja a nova classe Programa no cdigo a seguir:

Se tudo estava funcionando at agora, para que utilizamos um construtor? A ideia bem simples: se toda conta precisa de um usurio titular, como obrigar todos os objetos que forem criados a ter um valor desse tipo? Basta criar um construtor que recebe essa String! O construtor se resume a isto: dar possibilidades ou obrigar o usurio de uma classe a passar argumentos para o objeto durante o processo de criao do mesmo. Por exemplo: no podemos abrir um arquivo para leitura sem dizer qual o nome do arquivo que desejamos ler! Portanto, nada mais natural que passar uma String representando o nome de um arquivo na hora de criar um objeto do tipo de leitura de arquivo, e que isso seja obrigatrio. Alm disso, se criamos um construtor com vrios parmetros, o usurio no precisar criar vrias sentenas ao longo do programa para atribuir os valores de cada um desses parmetros.

Tambm possvel que criemos mais de um construtor em uma mesma classe, cada um com um nmero diferente de parmetros. Quando o objeto for criado, o construtor apropriado ser escolhido. Veja o exemplo:

Linguagem de Programao I

58

Captulo 4

A seguir, temos o exemplo de um trecho de cdigo que cria dois objetos classe Conta. O primeiro passa uma String e um float como parmetros na criao do objeto, utilizando o segundo mtodo construtor definido na classe acima. O segundo passa apenas uma String como parmetro, utilizando o primeiro mtodo construtor definido na classe:

A sada do trecho de cdigo acima :

ATIVIDADE 42. Crie um construtor para a classe Empresa, que recebe como parmetros um nome e um cnpj e o tamanho do array de funcionrios. O atributo qtde_de_funcionario deve comear com o valor zero. Crie tambm um construtor para a classe Empresa que no receba o tamanho do array de funcionrios. Neste caso, defina que o padro cri-lo com tamanho 100.
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

59

43. Crie um construtor para a classe Funcionario que receba os atributos nome, departamento, salario e RG. No atributo booleano, considere que o funcionrio est empregado. Crie tambm um construtor para a classe Funcionario que receba apenas nome e RG, e outro que no receba parmetros. 44. Crie um objeto da classe Empresa. Em seguida, crie vrios objetos da classe Funcionario e inclua-os na Empresa. Demita alguns e depois imprima a quantidade de funcionrios da empresa utilizando o mtodo numeroDeFuncionarios.

Os destrutores so chamados logo antes do coletor de lixo (garbage collector, descrito no captulo anterior) passar e sua memria ser liberada. O mtodo destrutor chamado de finalize(). Cada objeto possui um mtodo destrutor padro, o qual no faz nada. Para criar um mtodo destrutor para suas prprias classes, basta sobrepor o mtodo finalize() com o seguinte cabealho:

Utilizando corretamente o mtodo, devolvemos corretamente ao sistema o espao de memria que sabemos que no ser mais utilizado. Caso o destrutor no seja explicitamente chamado, o gerenciador automtico do Java ir destruir os objetos perdidos apenas quando o programa estiver ocioso (por exemplo, esperando por uma entrada de dados). Para forar a coleta de lixo em determinado momento, basta chamar o mtodo System.gc().

4.2 Encapsulamento
Em Java, existem atributos que modificam o nvel de acesso s variveis definidas em uma classe, aos mtodos, aos construtores e s prprias classes. So eles: protected, private e public.

Linguagem de Programao I

60

Captulo 4

Public indica que uma classe, varivel, mtodo ou construtor pode ser usado externamente ao pacote em que foram definidos. Sem ele, o uso s pode ser feito internamente ao pacote no qual ocorre a definio. Private indica que uma varivel, mtodo ou construtor s pode ser utilizado internamente classe em que foi declarado. Protected indica que o uso s pode ser feito na classe ou em uma subclasse.

Esses modificadores permitem a implementao do encapsulamento no Java. O encapsulamento faz com que no seja permitido acessarmos diretamente as propriedades de um objeto. Neste caso, precisamos operar sempre por meio dos mtodos pertencentes a ele. A complexidade de um objeto escondida, portanto, atravs da abstrao de dados que esto por trs de suas operaes. ENCAPSULAMENTO consiste na separao entre os aspectos externos de um objeto, acessveis por outros objetos.

No entendeu? simples: voc no precisa, por exemplo, conhecer os detalhes dos circuitos internos do seu computador para utiliz-lo. A carcaa do computador encapsula esses detalhes, provendo a voc uma interface mais amigvel (monitor, teclado, mouse etc) para utiliz-lo.

Um problema da classe Conta criada no captulo anterior que no h qualquer impedimento com relao a um saque que deixe a conta com saldo menor que o limite permitido. Fizemos uma alterao no mtodo sacar para que esta verificao pudesse ser feita. Entretanto, nada garante que o usurio da classe Conta ir utilizar este mtodo sempre que precisar o valor do atributo saldo. O cdigo a seguir ultrapassa o limite diretamente:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

61

A melhor forma de impedir que isso acontea forar com que o desenvolvedor seja sempre obrigado, por exemplo, a utilizar o mtodo sacar. Para fazer isso no Java, basta declararmos que os atributos no podem ser acessados fora da classe, utilizando o modificador de acesso private, da seguinte forma:

Dessa forma, o exemplo anterior (que acessa diretamente o valor do atributo saldo) no iria compilar. Cada classe responsvel por controlar seus atributos, portanto, ela deve julgar se aquele novo valor vlido ou no. Esta validao no deve ser controlada por quem est utilizando a classe, e sim por ela mesma (centralizando essa responsabilidade e facilitando futuras mudanas no sistema). Repare que, agora, quem chama o mtodo sacar no faz a menor ideia de que existe um limite que est sendo checado. Para quem for usar essa classe, basta saber o que o mtodo faz e no exatamente como ele o faz (o que um mtodo faz sempre mais importante do que como ele faz: mudar a implementao fcil, j mudar a assinatura de um mtodo vai gerar problemas). A palavra-chave private tambm pode ser usada para modificar o acesso a um mtodo. Tal funcionalidade normalmente utilizada quando existe um mtodo apenas auxiliar para a prpria classe e no queremos que outras pessoas o utilizem (ou apenas para seguir a boa prtica de se expor ao mnimo). Sempre devemos expor o mnimo possvel de funcionalidades para criar um baixo acoplamento entre as nossas classes. O que vimos acima a ideia de encapsular, isto , esconder todos os membros de uma classe, alm de esconder como funcionam as rotinas (mtodos) do nosso programa. Encapsular fundamental para que seu sistema seja suscetvel a mudanas: no precisaremos mudar uma regra de negcio em vrios lugares, mas sim em apenas um nico lugar, j que essa regra est encapsulada (veja o caso do mtodo sacar).

Linguagem de Programao I

62

Captulo 4

Quando voc dirige um carro, o que te importa so os pedais e o volante, e no o motor que voc est usando. claro que um motor diferente pode te dar melhores resultados, mas o que ele faz a mesma coisa que um motor menos potente, a diferena est em como ele faz. Para trocar um carro a lcool para um a gasolina voc no precisa reaprender a dirigir! Todos os celulares fazem a mesma coisa: eles possuem maneiras (mtodos) de discar, ligar, desligar, atender etc, o que muda como eles fazem cada funcionalidade. Mas repare que para o usurio comum pouco importa se o celular GSM ou CDMA, isso fica encapsulado.

Como vimos anteriormente, alm do private existe o modificador public, que permite a todos acessarem um determinado atributo ou mtodo. Quando no declaramos o modificador de acesso de um atributo ou mtodo, ele definido como protected, uma espcie de estado intermedirio entre private e public. Um atributo ou mtodo protected s pode ser acessado (visvel) pela prpria classe ou suas subclasses.

ATIVIDADE 45. Adicione o modificador de visibilidade (private, se necessrio) para cada atributo e mtodo da classe Funcionario. Tente criar um Funcionario no main e modificar ou ler um de seus atributos privados. O que acontece? 46. Crie mtodos que alteram e que retornam cada atributo da classe Funcionario. Exemplo:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

63

Modifique os cdigos que acessavam atributos da classe Funcionario e faa com que eles passem a utilizar as funes acima. Exemplo:

passa a ser:

4.3 Retomando o projeto inicial


Vamos voltar ao projeto criado no primeiro captulo. A ideia aplicarmos nele os conceitos que aprendemos nos captulos 2, 3 e 4. Primeiro, vamos observar no cdigo fonte j existente na interface alguns conceitos que acabamos de aprender: Nosso programa possua uma interface que permitia o cadastro das notas de um aluno. Havia uma classe chamada Interface, na qual foram declarados alguns mtodos, e, no final do cdigo fonte foi criado um atributo para cada componente exibido na interface. O primeiro campo de texto inserido na interface, por exemplo, foi declarado da seguinte forma:

Isso significa que o atributo jTextFiled1 um objeto da classe JTextField, que est descrita no pacote javax.swing. Alm disso, o modificador private responsvel pelo encapsulamento deste atributo, ou seja, s podemos acessar seu valor por meio de mtodos pertencentes sua classe. No trecho do cdigo em que precisamos verificar se o campo estava editvel ou no, por exemplo, utilizamos a seguinte expresso:

No trecho acima, a palavra this indica que estamos acessando o mtodo isEditable que pertence ao atributo jTextFiled6 definido na prpria classe. Em seguida, quando precisamos alterar o estado deste componente, utilizamos a expresso a seguir:
Linguagem de Programao I

64

Captulo 4

Dessa vez, acessamos o mtodo setEditable, que tambm pertence ao atributo jTextFiled6 definido na prpria classe. Os mtodos isEditable e setEditable foram criados na classe original porque seus atributos foram encapsulados, e no poderamos acess-los diretamente. Agora, modificaremos o programa para que ele permita o cadastro das notas de vrios alunos e armazene estas informaes. Primeiro, vamos fazer com que nosso projeto volte a ser o projeto principal no NetBeans2. Para isso, clique com o boto direito sobre o nome do projeto e depois escolha a opo Definir com Projeto Principal. Vamos agora criar uma classe chamada Aluno, que ir conter os dados de cada Aluno cadastrado. Para criar uma nova classe, clique novamente com o boto direito sobre o projeto, depois em Novo e escolha a opo Classe Java. O nome da nossa classe ser Aluno e ela dever estar no mesmo pacote que a classe Interface criada no primeiro captulo, chamado pacoteInterface. Um aluno deve conter nome, matrcula, nota da primeira prova, nota da segunda prova, nota dos trabalhos e nota da prova final (esses eram os itens que o cliente preenchia em nossa interface). O cdigo da classe Aluno, portanto, ser o seguinte:

O NetBeans possui uma funcionalidade que realiza o encapsulamento dos dados para ns. Para isso, clique com o boto direito sobre a classe, escolha a opo Refatorar e depois clique em Encapsular campos. Aparecer uma janela semelhante mostrada na Figura 20 -:

2 O projeto principal que ser compilado quando clicarmos em Executar ou clicarmos em F6 Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

65

Figura 20 - Encapsulamento dos dados

Clique no boto Selecionar tudo para que sejam criados+ todos os mtodos que modificam e os que retornam os atributos da classe. Em seguida, clique em Refatorar. Veja que o cdigo da classe foi automaticamente modificado pelo NetBeans. Os atributos agora possuem o modificador private e j foram criados os mtodos para manipularmos nossos dados. Vamos agora criar um construtor para a classe. O construtor receber todos os atributos como parmetro, exceto a nota da prova final (j que nem todos os alunos fazem prova final). Veja a seguir o cdigo do construtor:

A nota de quem fez prova final ser modificada atravs do mtodo setProvafinal, que foi criado pelo NetBeans quando encapsulamos os dados. Por fim, precisamos de um mtodo para calcular a mdia final de um aluno.

Linguagem de Programao I

66

Captulo 4

Nossa classe Aluno est pronta. Agora vamos voltar classe Interface. Nosso programa passar a incluir os dados de cada aluno cadastrado no sistema. Poderamos armazenar os alunos cadastrados em um array. Como arrays tm tamanho fixo e ainda no sabemos quantos alunos sero includos, utilizaremos um ArrayList, no qual podemos incluir quantos elementos quisermos. Para utiliz-lo, precisamos importar a biblioteca java.util.ArrayList no incio de nosso cdigo. Para isso, insira o cdigo a seguir antes da definio da classe Interface, como no cdigo abaixo:

No final da classe, aps a definio dos atributos da classe, vamos definir um novo atributo: o ArrayList no qual iremos inserir os objetos da classe Aluno que forem cadastrados. A definio de um ArrayList inclui o tipo dos objetos que sero armazenados nele. No cdigo a seguir, mostramos a declarao do ArrayList e de um mtodo que ir inserir novos alunos no ArrayList.

O mtodo add adiciona um novo elemento ao ArrayList. Como o ArrayList um objeto, precisamos instanci-lo utilizando a palavra new, como vimos no captulo anterior. Faremos isso no construtor da classe Interface, que pode ser encontrado no incio da classe. Veja como ficar o construtor:

Agora, modifique a tela da interface para que ela passe a ser como a da Figura 21 - (lembre-se que, para exibir a tela da interface, voc
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

67

precisa clicar no boto Projeto, ao lado do boto Cdigo-Fonte que fica acima do cdigo da interface):

Figura 21 - Nova tela da interface.

Veja que no estamos mais mostrando a mdia final de cada aluno. Alm disso, retiramos o boto que calculava a mdia e inserimos dois novos: um para adicionar os dados do aluno e outro para fechar a janela. Primeiro, vamos definir a ao que ser realizada quando clicarmos no boto Adicionar este aluno. Clique com o boto direito do mouse sobre o boto, escolha a opo Eventos, depois em Action e por fim na nica opo disponvel (actionPerformed [jCheckBox1ActionPerformed]). Para definirmos o cdigo que estar presente no mtodo, preciso que esteja claro o que ele dever realizar: 1. primeiro, devemos recuperar os dados do aluno que foram digitados pelo usurio; 2. em seguida, criamos um objeto do tipo aluno, passando os dados recuperados acima como parmetros do construtor da classe Aluno; 3. caso o usurio tenha preenchido a nota da prova final, ela deve ser atribuda ao aluno; 4. por fim, o aluno deve ser includo no ArrayList. O trecho de cdigo a seguir mostra o que precisamos incluir no mtodo:

Linguagem de Programao I

68

Captulo 4

O mtodo limparCampos utilizado acima precisa limpar os campos digitados pelo usurio, para que um novo aluno possa ser inserido. Este mtodo ser inserido na prpria classe Interface e seu cdigo mostrado a seguir:

Por fim, vamos definir a ao que ser executada quando clicarmos em sair. Clique com o boto direito do mouse sobre o Fechar, escolha a opo Eventos, depois em Action e, por fim, na nica opo disponvel (actionPerformed [jCheckBox1ActionPerformed]). O cdigo dever ser o seguinte:
Tecnologia em Anlise e Desenvolvimento de Sistemas

Orientao a objetos: mtodos e encapsulamento

69

Os cdigos que j existiam em nossa interface devem continuar l. Adapte sua interface e veja se ela ficou como a nossa. Por enquanto, ainda no criamos uma nova janela para exibirmos os alunos inseridos. Faremos isso nos prximos captulos.

Linguagem de Programao I

70

Captulo 4

Tecnologia em Anlise e Desenvolvimento de Sistemas

POLIMORFISMO (HERANA, SOBRECARGA E REESCRITA)

Prezado aluno, neste captulo iremos continuar aprendendo a escrever os conceitos de orientao a objetos em Java. Agora, mostraremos os conceitos de polimorfismo e herana. Aps este captulo, voc ser capaz de criar superclasse e subclasses em Java, alm de usar outras vantagens do polimorfismo.

Uma grande contribuio da orientao a objetos para o projeto e desenvolvimento de sistemas o polimorfismo. A palavra polimorfismo vem do grego poli morfos e significa muitas formas. Na orientao a objetos, isto representa uma caracterstica na qual se admite tratamento idntico para formas diferentes (baseado em relaes de semelhana, isto, entidades diferentes podem ser tratadas de forma semelhante, conferindo grande versatilidade aos programas e classes que se beneficiam destas caractersticas).

POLIMORFISMO a capacidade de assumir vrias formas.

Mostraremos trs formas principais de polimorfismo: a sobrecarga de mtodos, a reescrita e a herana. Em algumas referncias na literatura, polimorfismo simplesmente o nome dado sobrecarga ou mesmo reescrita de mtodos. Nas prximas sees, detalharemos cada uma delas.

5.1 Herana
A idia da herana permitir que uma classe possa ser derivada de outra classe. Um Aluno, por exemplo, uma Pessoa. Dessa forma, um objeto da classe Aluno (subclasse) deve herdar todos os atributos da classe Pessoa (superclasse), como altura, peso etc, bem como seus mtodos (andar, correr etc).

72

Captulo 5

Uma subclasse pode possuir tudo que est definido na superclasse, alm de ter suas caractersticas prprias. Todo Aluno, por exemplo, pode possuir altura e peso, caractersticas de qualquer Pessoa, e tambm um Nmero de Matrcula, caracterstica que nem toda Pessoa possui. O diagrama da Figura 22 - mostra o relacionamento entre essas duas classes.

Pessoa # altura : float # peso : float # Andar() : void # Correr() : void

Aluno # matricula : int

Figura 22 Herana

HERANA o compartilhamento de atributos e operaes entre classes com base em um relacionamento hierrquico. o mecanismo que permite a uma subclasse possuir tudo aquilo definido em sua superclasse, alm de atributos e operaes localmente adicionados.

A grande vantagem da herana o reuso. O conceito de herana, quando utilizado corretamente, reduz o nmero de linhas de programao, gera maior qualidade e facilita a programao, a verificao de erros e futuras correes. Mais de uma subclasse, por exemplo, podem herdar de uma mesma superclasse. Podemos criar uma classe Professor que tambm herda da classe Pessoa descrita acima. O diagrama da Figura 23 - mostra o relacionamento entre as classes Professor, Aluno e Pessoa.

Pessoa

Aluno

Professor

Figura 23 Superclasse com duas subclasses Tecnologia em Anlise e Desenvolvimento de Sistemas

Polimorfismo (herana, sobrecarga e reescrita)

73

Herana pode ser entendida como uma tcnica na qual uma classe passa a utilizar atributos e operaes definidas em outra classe especificada como seu ancestral. Rigorosamente falando, a herana o compartilhamento de atributos e operaes entre classes baseado num relacionamento hierrquico do tipo pai e filho, ou seja, a classe pai contm definies que podem ser utilizadas nas classes definidas como filho.

A classe pai chamada de classe base ou superclasse e as classes filho so chamadas de classes derivadas ou subclasses. Este mecanismo sugere que uma classe poderia ser definida em termos mais genricos ou amplos e depois refinada sucessivamente em uma ou mais subclasses especficas. Da a origem do termo tcnico que descreve a herana: especializao. Por exemplo: vamos criar uma classe para os funcionrios do nosso banco, e outra especfica para os gerentes. Um gerente guarda as mesmas informaes que um funcionrio comum, mas tambm possui informaes e funcionalidades prprias (por exemplo, uma senha que permite seu acesso ao sistema interno do banco).

Linguagem de Programao I

74

Captulo 5

Nesse caso, o ideal seria fazer com que o Gerente possusse tudo o que um Funcionario possui sem reescrevermos cdigos, ou seja, gostaramos que a segunda classe fosse uma extenso da primeira. Em Java, fazemos isto utilizando a palavra-chave extends.

Cada vez que criarmos um objeto do tipo Gerente, este objeto possuir tambm os atributos definidos na classe Funcionario, pois agora um Gerente um Funcionario. Uma subclasse herda todos os atributos e mtodos de uma superclasse. Entretanto, no consegue acessar diretamente os atributos e mtodos privados (private) que foram herdados. Se quisermos que determinados atributos e mtodos de uma classe possam ser acessados diretamente por suas subclasses, mas sem que eles sejam pblicos (pois, neste caso, poderiam ser alterados por qualquer um), podemos defini-los como protegidos (protected). Um atributo protected s pode ser acessado pela prpria classe ou suas subclasses. Exemplo:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Polimorfismo (herana, sobrecarga e reescrita)

75

A Figura 24 - mostra o diagrama das classes criadas acima:

Funcionrio
# nome : String # cpf : String # salario : double

Gerente
# senha : int # autentica() : boolean

Figura 24 Classes Funcionario e Gerente

ATIVIDADE 47. Implemente uma classe Aluno, em um novo projeto, que herda de Pessoa e possui o atributo matricula. Em seguida, implemente a classe Professor, que tambm herda de aluno. Qual atributo prprio esta classe poderia ter? 48. Implemente a classe Conta e adicione um mtodo chamado atualizar, que atualiza o saldo de uma conta de acordo com uma taxa percentual, recebida como parmetro. 49. Crie duas subclasses que herdam da classe Conta: ContaCorrente e Poupanca.

5.2 Sobrecarga de mtodos


Outra forma de polimorfismo a sobrecarga de mtodos (method overload), que a possibilidade de existirem vrios mtodos com o mesmo nome em uma mesma classe. Esses mtodos homnimos podem ser distinguidos, por exemplo, pela quantidade e/ou tipo dos parmetros que cada um deles recebe. Em outras palavras, para que estes mtodos de mesmo nome possam ser distinguidos, eles devem possuir uma assinatura diferente. A assinatura (signature) de um mtodo uma lista que indica os tipos de todos os seus argumentos. Assim, mtodos com mesmo nome so considerados diferentes se recebem um diferente nmero ou tipo de argumentos e tm, portanto, uma assinatura diferente. Um mtodo que no recebe argumentos tem como assinatura o tipo void. Um mtodo que recebe dois inteiros como argumentos tem como assinatura os tipos int, int como no exemplo abaixo:
Linguagem de Programao I

76

Captulo 5

Quando criamos dois construtores para a classe Conta, estvamos utilizando sobrecarga de mtodos, mais especificamente sobrecarga de construtores.

ATIVIDADE 50. O mtodo aniversario da classe Pessoa no recebia parmetros e incrementava a idade de um objeto desta classe. Crie agora outro mtodo chamado aniversario nesta mesma classe, que receba um inteiro como parmetro, indicando quantos aniversrios a pessoa fez.

5.3 Reescrita de mtodos


Outra forma de polimorfismo a reescrita de mtodos. Esta tcnica permite implementar um mtodo em uma subclasse que tenha o comportamento diferente do mtodo na sua superclasse. Vamos supor que, no final do ano, os funcionrios comuns do banco recebem uma bonificao de 10% de seus salrios, mas os gerentes recebem 15%. As classes ficariam da seguinte forma:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Polimorfismo (herana, sobrecarga e reescrita)

77

Se for necessrio acessar o mtodo da superclasse que foi reescrito, devemos faz-lo com o comando super.bonificacao( ). A palavra super se refere superclasse herdada. ATIVIDADE 51. Reescreva o mtodo atualizar da classe Conta nas subclasses ContaCorrente e Poupanca. Na primeira, o mtodo atualizar o saldo com o dobro da taxa recebida como parmetro. Na segunda, atualizar com o triplo da taxa (utilize super para acessar o valor do saldo na superclasse). Reescreva tambm o mtodo depositar na classe ContaCorrente, descontando do saldo o valor de 0,35% do que foi depositado. 52. Crie um objeto da classe Conta, um da classe ContaCorrente e outro da classe Poupanca. Deposite R$1000,00 em cada uma delas, chame em seguida o mtodo atualizar e depois veja o saldo final de cada uma.

5.4 Pacotes
Quando utilizamos cdigos feitos por outros programadores, podemos nos deparar com classes de mesmo nome, o que pode nos trazer probleLinguagem de Programao I

78

Captulo 5

mas. Um deles que os sistemas operacionais no permitem que criemos arquivos com o mesmo nome em um mesmo diretrio, portanto, precisamos organizar essas classes em diretrios diferentes. Os diretrios esto diretamente relacionados aos chamados pacotes e costumam agrupar classes de funcionalidades similares ou relacionadas. Por exemplo: no pacote java.util temos as classes Date, SimpleDateFormat e GregorianCalendar (todas elas trabalham com datas de formas diferentes). Se quisermos que a classe Cliente esteja em um pacote chamado banco, ela dever estar em um diretrio chamado banco. A classe Cliente, que se localiza nesse ltimo diretrio mencionado, deve ser escrita da seguinte forma:

A palavra-chave package indica qual o pacote/diretrio no qual est a classe. Um pacote pode conter nenhum ou mais subpacotes e/ou classes dentro dele. Os pacotes s possuem letras minsculas, no importa quantas palavras estejam contidas nele. Esse padro existe para evitar ao mximo o conflito de pacotes de empresas diferentes. Para utilizarmos uma classe definida em outro arquivo, mas contida em um mesmo pacote, basta fazermos referncia simples a ela. Vamos supor a existncia das classes Cliente e Banco no pacote banco. A classe Cliente deve ser escrita assim:

E Banco, assim:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Polimorfismo (herana, sobrecarga e reescrita)

79

Note que Banco se referenciou a Cliente da mesma forma como fazamos quando colocvamos as classes em um mesmo arquivo. Para utilizarmos classes definidas em outro pacote, utilizamos a palavra-chave import (como j havamos feito em captulos anteriores). Exemplo:

ATIVIDADE 53. Separe as classes Empresa, Funcionario e Data em arquivos diferentes, mas em um mesmo pacote.

5.5 Retomando o projeto inicial


As classes em nossa Interface estavam em um pacote chamado pacoteInterface. Repare que no incio de todas elas havia o comando a seguir:

Na classe Aluno no h herana. Consequentemente, tambm no h reescrita de mtodos (o que ocorre quando uma classe possui um mtodo com o mesmo nome de um mtodo de sua superclasse e Aluno no possui superclasse). Tambm no h sobrecarga de mtodos. Entretanto, poderamos criar construtores com assinaturas diferentes (por exemplo, poderia haver tambm um construtor para o aluno que ficou de prova final). Neste caso, o construtor receberia um parmetro a mais do que o construtor descrito no captulo anterior:

Linguagem de Programao I

80

Captulo 5

Utilizando este segundo construtor, no precisaramos mais utilizar o mtodo setProvafinal logo aps a criao de um aluno que ficou de prova final. Ao contrrio da classe Aluno, a classe Interface uma subclasse que herda da classe JFrame (descrita no pacote javax.swing). por isso que a interface desenhada na tela: a classe JFrame realiza esta tarefa para ns, sem que precisemos nos preocupar com isto. Mas onde esto os cdigos que definem, por exemplo, o local onde cada componente ir aparecer na tela? Para encontr-los, procure em seu cdigo o trecho mostrado em destaque na Figura 25 -:

Figura 25 Cdigos no mostrados pelo NetBeans.

Clicando no + indicado pelo cursor do mouse na Figura 25 -, o NetBeans mostrar o trecho de cdigo responsvel por estas configuraes. Veja que o cdigo instancia os componentes e define suas propriedades (como posio inicial, texto inicial etc). A mudana que faremos na interface, desta vez, no est diretamente ligada ao assunto deste captulo (polimorfismo) vamos apenas continuar a inserir funcionalidades a ela. Agora, iremos criar uma tela para exibir a lista de alunos adicionados. Esta tela dever ser exibida quando a tela de cadastro dos alunos for fechada. Clique com o boto direito do mouse sobre o nome do projeto e crie um novo Formulrio JFrame. Desta vez, o formulrio se chamar ListaAlunos e deve estar no mesmo pacote da classe Interface (o pacote chamado pacoteInterface). Tente voc mesmo, dessa vez, desenhar a tela deste novo JFrame, que dever ser semelhante da Figura 26 -:
Tecnologia em Anlise e Desenvolvimento de Sistemas

Polimorfismo (herana, sobrecarga e reescrita)

81

Figura 26 Tela para listarmos os alunos adicionados pelo

usurio.

Note que existe um componente que no utilizamos anteriormente: o componente Caixa de combinao, que permite a insero de uma lista suspensa onde sero exibidos os alunos adicionados pelo usurio. Aps inseri-lo no local desejado, abra a janela com as opes do componente e altere o campo model (que, a princpio, possui os valores Item 1, Item 2, Item 3, Item 4) para vazio. Em seguida, no se esquea de redimensionar o componente adequadamente. Alm disso, faa com que o Campo de Texto no qual ser mostrada a mdia de cada aluno no fique editvel. Para que os alunos sejam exibidos, definiremos o contedo da Caixa de combinao dentro do construtor da classe. Clique em Cdigo-fonte, localize o construtor da classe ListaAlunos e insira o cdigo a seguir:

Note que o ArrayList recebido como parmetro, contendo os alunos cadastrados pelo usurio, foi armazenado no atributo alunos. Para que o cdigo funcione, necessrio adicionar este atributo no final do cdigo da classe, no local onde esto definidos seus atributos:
Linguagem de Programao I

82

Captulo 5

Este nova tela dever ser exibida sempre que a tela da interface original for fechada. Para que isso ocorra, vamos alterar o cdigo-fonte da classe Interface que definia a ao executada quando clicvamos no boto Fechar. Volte ao cdigo da classe Interface e procure o mtodo jButton2ActionPerformed. O cdigo do mtodo, agora, deve ser o seguinte:

Veja que agora estamos criando uma instncia da classe ListaAlunos antes de fecharmos a tela, e que passamos o ArrayList de alunos como parmetro para o construtor de ListaALunos (como j espervamos que fosse acontecer). Alm disso, retiramos o System.exit(1): agora o programa s ser abortado quando fecharmos a nova tela (que listar os alunos). Execute o projeto, insira alguns alunos e verifique se eles esto aparecendo corretamente na tela de listagem dos alunos. Em caso positivo, s faltar exibirmos as notas de cada aluno. Para isso, vamos definir a ao que ser executada sempre que um item da Caixa de Combinao for escolhido. Volte tela da classe ListaAlunos, clique com o boto direito do mouse sobre a Caixa de combinao, depois em Eventos, Action e [actionPerformed]. O cdigo do mtodo dever ser o seguinte:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Polimorfismo (herana, sobrecarga e reescrita)

83

A nova funcionalidade da nossa interface est pronta! No prximo captulo, criaremos uma nova tela para confirmar ao usurio os dados de cada aluno inserido.

Linguagem de Programao I

84

Captulo 5

Tecnologia em Anlise e Desenvolvimento de Sistemas

COMPOSIO, CLASSES ABSTRATAS, INTERFACES E PACOTES

Prezado aluno, no primeiro captulo, aprendemos que uma subclasse poderia herdar de vrias superclasses, o que chamamos de herana mltipla. Uma classe RadioRelogio, por exemplo, poderia herdar das classes Radio e Relogio. Em Java, entretanto, herana mltipla no existe ( possvel derivar somente uma classe a partir de uma outra, e no de vrias). Isto pode ser compensado pelo uso de interfaces, que mostraremos neste captulo. Alm disso, explicaremos os conceitos de composio (ou agregao) de classes, classes abstratas (que no podem ser instanciadas), classes finais (que no podem ser estendidas) e pacotes. Ao trmino deste captulo, voc ser capaz de utilizar composio, classes abstratas, classes finais e interfaces quando necessrio e a separar suas classes e interfaces em diretrios diferentes.

6.1 Composio
O termo composio (ou agregao) significa a construo de novas classes utilizando outras classes existentes, isto , a nova classe possui internamente atributos que representam objetos de outras classes. Entretanto, composio uma forma de reutilizao de cdigos diferente da herana. Ela costuma ser utilizada quando se deseja fazer uso apenas das as caractersticas de um objeto. A classe Conta criada nos captulos anteriores, por exemplo, poderia ser associada a uma classe chamada DadosCliente, que possui nome, sobrenome e CPF. Veja a nova definio da classe Conta a seguir:

86

Captulo 6

Enquanto os campos numero, saldo e limite so representados por tipos primitivos, o campo cliente representado por outro objeto, ou seja, um campo cujo tipo uma outra classe (no caso, a classe Dados_do_Cliente). Podemos criar instncias de quantos outros objetos quisermos. Isto significa que um objeto pode ser construdo pela associao de outros objetos. comum que a instanciao do objeto aparea no construtor da classe.

Utilizamos composio quando desejamos representar uma relao do tipo tem um, indicando que um objeto tem um ou outro objeto como parte de si. Exemplos: Uma Conta tem Dados_do_Cliente; um Baralho tem Cartas; e uma Cidade tem um Nome e tem uma Populao.

Nas classes que utilizam composio, portanto, existem instanciaes dos atributos do tipo objeto ou recebimento de objetos construdos em outras partes do cdigo. Note que a relao definida para herana bastante diferente, pois indica que um objeto algo de um certo tipo. Uma empresa, por exemplo, tem um endereo, ela no um endereo. Neste caso, uma classe Empresa pode possuir um objeto da classe Endereco (devido ao mecanismo de composio), e no herdar desta classe. J um Aluno uma Pessoa, por isso o relacionamento entre as classes, neste caso, a herana.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Composio, classes abstratas, interfaces e pacotes

87

ATIVIDADE 54. Crie uma classe Data contendo os atributos dia, ms e ano. Insira na classe Funcionario um atributo da classe Data chamado data_de_entrada (que at agora era uma String). 55. Crie um mtodo da classe Funcionario que receba um dia, um ms e um ano, e altere sua data_de_entrada na empresa. 56. Sobrecarregue o mtodo anterior, recebendo como parmetro uma referncia para um objeto da classe Data. 57. Modifique o mtodo mostrarDados para que ele imprima tambm a data_de_entrada. 58. Crie uma Data e um Funcionario. Insira a data no funcionrio e chame o mtodo mostrarDados. 59. Crie uma classe Cartao que contenha um objeto do tipo Conta e uma senha. Insira um mtodo para sacar dinheiro da conta e outro para retornar o saldo. Ambos devem receber uma senha como parmetro, e s executar a operao se a senha estiver correta. Crie ainda um mtodo para alterar a senha.

6.2 Classes e mtodos abstratos


Em algumas circunstncias, uma classe se torna to genrica que no precisa de uma instncia dela no programa. Essa classe acaba servindo apenas como modelo para suas subclasses. Para estes casos, dispomos das classes abstratas (abtract classes). As classes abstratas so assim denominadas por no permitirem a instanciao, ou seja, no possvel criar um objeto do seu tipo. Sendo assim, seu uso dirigido para a construo de classes modelo (especificaes bsicas de classes por meio do mecanismo de herana).

Vamos supor que uma empresa possua gerentes, diretores, secretrios etc. Cada tipo de funcionrio teria sua prpria classe, e herdaria alguns atributos da classe Funcionario. A classe Funcionario, entretanto, nunca precisaria ser instanciada, pois cada tipo de funcionrio possui sua prpria classe em particular. Funcionario apenas idealiza um tipo, apenas define um rascunho. A palavra-chave abstract ir impedir que esta classe seja instanciada. Veja o diagrama das classes citadas acima na figura 27:
Linguagem de Programao I

88

Captulo 6

Funcionario

Gerente

Diretor

...

Figura 27 Atributos da classe Conta

Uma classe abstrata precisa ser estendida. Isso significa que ela deve ser a classe base de outra classe mais especfica, que contenha os detalhes que no puderam ser includos na superclasse (abstrata). Outra possvel aplicao das classes abstratas a criao de um ancestral comum para um conjunto de classes que, se originado desta classe abstrata, poder ser tratado genericamente utilizando o polimorfismo. Uma classe abstrata, como qualquer outra, pode conter todos os tipos de mtodos vistos at aqui. Alm disso, podemos incluir os chamados mtodos abstratos em uma classe abstrata. Tais mtodos no contm implementao, so apenas declarados, mas devero obrigatoriamente ser implementados em suas subclasses no abstratas. Vejamos um exemplo: ao invs de criarmos classes isoladas para representar quadrados, retngulos e crculos, poderamos definir uma classe abstrata Forma que contivesse um vetor de pontos, um mtodo comum que retornasse a quantidade de pontos da forma e mtodos abstratos para desenhar e calcular a rea desta forma. Note que seria impossvel implementar mtodos para o clculo da rea ou para o desenho de uma forma genrica, dirigindo-nos para uma classe abstrata como a exemplificada a seguir:

A partir desta classe abstrata, podemos criar outras classes derivadas dela, como no exemplo a seguir:
Tecnologia em Anlise e Desenvolvimento de Sistemas

Composio, classes abstratas, interfaces e pacotes

89

Um mtodo abstrato no cria uma definio, mas apenas uma declarao de um mtodo que dever ser implementado em uma classe derivada. Se esse mtodo no for implementado na classe derivada, esta permanece como uma classe abstrata, mesmo que no tenha sido assim declarada explicitamente. Assim, para que uma classe derivada de uma classe abstrata possa gerar objetos, os mtodos abstratos devem ser definidos em classes derivadas.

Existem algumas restries em relao declarao de mtodos abstratos: 1. Os mtodos estticos (static) no podem ser abstratos; 2. Construtores no podem ser abstratos; e 3. Mtodos abstratos no podem ser privados.

ATIVIDADE 60. Transforme a classe Funcionario implementada nas atividades anteriores em classe abstrata. Quais mtodos e atributos precisam ser alterados? 61. Quais mtodos da classe Funcionario podem ser transformados em mtodos abstratos? 62. Modele as classes Gerente e Presidente, que herdam da classe abstrata Funcionario. Quais mtodos estas duas novas classes precisam implementar?
Linguagem de Programao I

90

Captulo 6

63. Se uma classe Diretor herdar de Gerente, ela ser obrigada a implementar o mtodo demitir? 64. Se criamos as classes ContaCorrente e Poupanca, como podemos transformar a classe Conta em abstrata? 65. possvel compilar a classe Poupanca sem implementar o mtodo atualizar, se este tiver sido transformado em mtodo abstrato na classe Conta?

6.3

Classes, mtodos e atributos finais

Uma classe final indica uma classe que no pode ser estendida, ou seja, nenhuma outra pode herdar dela (a classe String, por exemplo, final). Assim, a compilao do cdigo abaixo geraria um erro:

A palavra-chave final pode tambm ser aplicada a mtodos e a atributos de uma classe. Um mtodo final no pode ser reescrito em classes derivadas. Um atributo final no pode ter seu valor modificado, ou seja, ele define apenas valores constantes. Apenas valores de tipos primitivos podem ser utilizados para definir constantes. O valor do atributo deve ser definido no momento da declarao, pois no permitida nenhuma atribuio em outro momento. Se no queremos permitir que o RG de um cliente seja modificado aps sua criao, por exemplo, podemos faz-lo da seguinte forma:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Composio, classes abstratas, interfaces e pacotes

91

ATIVIDADE 66. Se transformssemos a classe Pessoa em uma classe final e continussemos deixando com que a classe Aluno herde de Pessoa, que tipo de erro ocorreria?

Leia mais em: http://javafree.uol.com.br/artigo/1366/Use-final-para-dadosconstantes-e-referencias.html http://javafree.uol.com.br/artigo/1374/Metodos-final-nao-podem-ser-redefinidos.html

6.4 Interfaces
Herana mltipla a capacidade de uma classe herdar de duas ou mais classes. C++ apresenta herana mltipla, e tambm maneiras de tratar os problemas decorrentes de seu uso. Um dos problemas que podem surgir o conflito de nomes de atributos ou mtodos herdados desse tipo de herana. Java, por motivos de simplicidade, abandona a ideia de herana mltipla, cedendo lugar ao uso de interfaces. Interfaces so conjuntos de mtodos e constantes (no contm atributos). Os mtodos definidos na interface so ocos (desprovidos de implementao). Classes podem implementar uma ou mais interfaces, provendo implementaes para cada mtodo das referidas interfaces.

O nome interface se origina exatamente do fato de que o que se pretende uma definio compartilhvel da interface propriamente dita de uma classe, mas no de sua implementao efetiva. Uma interface pode definir uma srie de mtodos, mas nunca conter implementao deles. Ela s expe o que o objeto deve fazer, e no como ele faz, nem o que ele tem. Uma interface Java uma classe abstrata para a qual todos os mtodos so implicitamente abstract e public, e todos os atributos so implicitamente static e final. Em outros termos, uma interface Java implementa uma classe abstrata pura.
Linguagem de Programao I

92

Captulo 6

Uma interface tem construo semelhante de uma classe abstrata, embora se distinga por dois fatos: 1. nenhum dos mtodos declarados pode ser implementado; e 2. todas as variveis devem ser estticas e finais. A vantagem de se utilizar as interfaces a definio de um protocolo entre classes, isto , uma especificao do que uma classe deve oferecer e implementar em termos de seus mtodos (o que resulta numa poderosa abstrao). Veja, a seguir, um exemplo de declarao de uma interface:

A diferena entre uma classe abstrata e uma interface Java que a interface obrigatoriamente no tem um corpo associado. Para que uma classe seja abstrata basta que ela seja assim declarada, mas a classe pode incluir atributos de objetos e definio de mtodos, pblicos ou no. Na interface, apenas mtodos pblicos podem ser declarados mas no definidos. Da mesma forma, no possvel definir atributos apenas constantes pblicas. Enquanto uma classe abstrata estendida (palavra-chave extends) por classes derivadas, uma interface Java implementada (palavra-chave implements) por outras classes. Uma interface estabelece uma espcie de contrato que obedecido por uma classe. Quando uma classe implementa uma interface, garante-se que todas as funcionalidades especificadas pela interface sero oferecidas pela classe. A seguir, mostramos um exemplo de definio de uma interface que implementada por duas classes diferentes.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Composio, classes abstratas, interfaces e pacotes

93

Cada classe implementa os mtodos da interface sua maneira. Mas o mais importante que eles ofeream uma implementao para todo mtodo da interface.

Interfaces so adequadas para se definir formas (interfaces) de acesso a subsistemas, escondendo detalhes da sua implementao.

A seguir, mostramos um trecho de cdigo no qual utilizamos uma interface:

O cdigo a seguir mostra um exemplo de outra interface:

Linguagem de Programao I

94

Captulo 6

Agora, um trecho de cdigo utilizando a interface criada acima:

Por fim, para simularmos uma herana mltipla, criamos uma classe que implementa mais de uma interface. O trecho de cdigo a seguir mostra um exemplo de uma classe que herda de outra classe e implementa duas interfaces:

ATIVIDADE 67. Em um arquivo separado, transforme a classe Conta em uma interface. 68. Adapte as classes Poupanca e ContaCorrente para atender a essas modificaes.

Leia mais sobre POO em Java em : http://javafree.uol.com.br/artigo/871497/Tutorial-Java-3Orientacao-a-Objetos

No prximo captulo mostraremos formas mais eficazes de proteger o sistema de erros que podem ser previstos durante a programao.

Tecnologia em Anlise e Desenvolvimento de Sistemas

CONTROLE DE ERROS (EXCEES)

Prezado aluno, a linguagem Java oferece um precioso mecanismo de controle e tratamento de erros dos programas chamado de tratamento de excees (objetos especiais que carregam informao sobre o tipo de erro detectado). Em Java, todo e qualquer erro chamado de exceo. Existem vrias classes de exceo adequadas para o tratamento dos problemas mais comuns em Java, usualmente inclusas nos respectivos pacotes. Excees especiais podem ser criadas em adio s existentes ampliando as possibilidades de tratamento de erro. Ao final deste captulo, voc dever ser capaz de controlar erros do programa, tomar decises baseadas neles e criar novos tipos de erros (para melhorar o tratamento dos mesmos).

7.1 Tratamento de excees


O Java oferece duas importantes estruturas para o controle de erros muito semelhantes s estruturas existentes na linguagem C++: try-catch e try-finally. Ambas tm o propsito de evitar que o programador tenha que realizar testes de verificao e avaliao antes da realizao de certas operaes, desviando automaticamente o fluxo de execuo para rotinas de tratamento de erro. Utilizando-se estas diretivas, detalhadas nas prximas sees, delimita-se um trecho de cdigo que ser monitorado automaticamente pelo sistema.

7.2 Try-catch
Quando ocorre um ou mais tipos de erros dentro de um trecho de cdigo delimitado, o TRY-CATCH desvia automaticamente a execuo para uma rotina designada para o tratamento especfico deste erro. A sintaxe a seguinte:

96

Captulo 7

Por exemplo, podemos criar um programa que precisa receber um nmero inteiro da linha de comando. Como os argumentos so passados em um vetor de Strings, precisamos transformar a String contendo o nmero para um inteiro. Se a converso gerar um erro, significa que o argumento no um nmero inteiro vlido. A exceo usada, neste caso, a java.lang.NumberFormatException. Outro erro que podemos tratar o caso de no ser fornecido o argumento desse mesmo programa, utilizando a exceo ArrayIndexOutOfBoundsException. Neste caso, ocorrer um erro ao tentarmos acessar o ndice 0 do vetor (que est vazio). O cdigo abaixo mostra como fazemos esses dois tratamentos com o TRY-CATCH.

Podem existir inmeros blocos catch no tratamento de erros (cada um para um tipo de exceo).

7.3 Try-finally
Com o TRY-FINALLY, podemos assegurar que uma rotina de finalizao seja garantidamente executada mesmo que ocorra um erro (isto ,
Tecnologia em Anlise e Desenvolvimento de Sistemas

Controle de erros (excees)

97

o trecho de cdigo contido na clusula FINALLY executado sempre que o programa passa pela clusula TRY). A sintaxe do try finally a seguinte:

Isto particularmente interessante quando certos recursos do sistema ou estruturas de dados devem ser liberadas, independentemente de sua utilizao.

Um mesmo try pode ser usado com as diretivas catch e finally.

A seguir, mostramos um exemplo de cdigo utilizando try, catch e finally.

Linguagem de Programao I

98

Captulo 7

Teste o exemplo acima em seu computador. O que ser exibido na tela?

7.4 Tipos de erros


Existem 3 diferentes tipos de erros em Java: 1. Erro de Runtime (java.lang.Runtime): so causados por bugs do programa que desconhecemos, ou seja, uma condio especial que sequer havamos imaginado. Os erros de Runtime so subclasses da classe Runtime, que subclasse de Exception. 2. Erro de Sistema (java.lang.Error): so erros imprevisveis, causados por falha do sistema, como, por exemplo, acesso a disco, erro do banco de dados etc. Estes erros so subclasses da classe Error. 3. Erro Customizado (java.lang.Exception): so erros ou condies especiais previstas no programa. Esses erros so subclasse da classe Exception. Algumas excees muito comuns so: ArithmeticException: ocorre, por exemplo, quando dividimos um valor por zero; NullPointerException: ocorre quando utilizamos um objeto que no foi instanciado; ArrayIndexOutOfBoundsException: ocorre quando tentamos acessar um elemento do array que no existe.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Controle de erros (excees)

99

7.5 Gerando uma exceo


Podemos querer tratar erros de lgica da nossa aplicao. Para isso, vamos retomar o mtodo de controle bancrio que controla os dbitos em uma conta corrente. Um cenrio possvel o cliente tentar fazer um saque no caixa, acima do valor do seu saldo. At agora, esse problema havia sido tratado da seguinte forma:

Poderamos tratar este caso como uma exceo. Quando nosso mtodo identificar o cenrio acima, vamos lanar a exceo IllegalArgumentException, que significa que o argumento passado para o mtodo no era o que ele esperava. Veja no trecho de cdigo a seguir:

A diretiva throw lana uma exceo, para que um bloco catch a capture e faa o tratamento necessrio. J a diretiva throws (na primeira linha do cdigo) apenas avisa da possibilidade de um determinado mtodo lanar uma exceo (diferente de throw, que efeticamente lana uma exceo).

Linguagem de Programao I

100

Captulo 7

Agora, podemos tratar o erro num nvel mais alto, ou seja, onde o mtodo de sacar() foi chamado. Para isso, no usaremos mais um if-else, e sim um try-catch (o que faz mais sentido, j que a falta de saldo uma exceo):

Para melhorar ainda mais nosso tratamento de erro, podemos fazer com que o mtodo sacar passe uma mensagem junto com a exceo, explicando o motivo do erro:

Para termos acesso a essa mensagem, utilizamos o mtodo getMessage():

Se a exceo lanada for capturada, o restante do cdigo dentro do try no ser executado. Se tentssemos imprimir uma mensagem confirmando o saque logo aps chamarmos o mtodo sacar, ela seria realmente impressa somente se o mtodo no retornar uma exceo. Veja no exemplo a seguir:
Tecnologia em Anlise e Desenvolvimento de Sistemas

Controle de erros (excees)

101

7.6 Criando suas prprias excees


Tambm comum criarmos uma prpria classe de exceo para controlarmos melhor o tratamento de erros. Vamos criar nossa prpria classe de exceo, chamada SaldoInsuficienteException, que ser uma subclasse de Exception. Veja o trecho de cdigo a seguir:

Agora, ao invs de lanarmos a exceo IllegalArgumentException no mtodo sacar, podemos lanar a SaldoInsuficienteException. Por nossa classe ter herdado de Exception, qualquer mtodo que lan-la (utilizando a diretiva throw) dever, obrigatoriamente, anunci-la com a diretiva throws, como j havamos feito no ltimo cdigo do mtodo sacar. Isso faz com que qualquer chamada a esse mtodo tenha que estar inserida num bloco try que capture esta exceo. No caso de usarmos a IllegalArgumentException, isso no seria necessrio. O cdigo poderia simplesmente ser:

Linguagem de Programao I

102

Captulo 7

A chamada do mtodo, neste caso, poderia ser:

Sempre que a exceo for anunciada (utilizando throws), ela precisa ser tratada no local onde o mtodo foi chamado.

Mais informaes sobre excees que precisam ou no ser lanadas em: http://javacomfarinha.blogspot.com/2007/02/lidando-comexcees.html http://lucabastos.wordpress.com/2007/06/05/tratamento-deexcecoes-parte-2-%E2%80%93-mudancas-no-conceito-deuso-das-excecoes/

ATIVIDADE 69. Insira excees no mtodo depositar da classe Conta, verificando se o valor passado como parmetro for invlida (negativo, por exemplo), utilizando IllegalArgumentException. Teste o mtodo criado. 70. Crie sua prpria exceo chamada ValorInvalidoException e utilize-a no mtodo acima. 71. Em quais outros mtodos vistos neste material (nos exemplos e nos exerccios) podemos inserir o tratamento de excees?

Tecnologia em Anlise e Desenvolvimento de Sistemas

Controle de erros (excees)

103

7.7 Retomando o projeto inicial


No projeto de nossa interface ainda no foram inseridos tratamentos de excees. Podemos fazer isto no cdigo-fonte da classe Interface, fazendo com que as notas digitadas pelo usurio deixem de ser armazenadas como texto e passem a ser armazenadas com o tipo Double. E trataremos os supostos erros que possam surgir utilizando uma funcionalidade do NetBeans que nos ajuda a criar excees. Para isso, abra o cdigo-fonte da classe Interface e procure o mtodo jButton1ActionPerformed. Selecione todo o trecho de cdigo aps a definio de variveis do mtodos at o comando para o aluno ser includo no ArrayList.

Veja a seleo na Figura 28 -:

Figura 28 Selecionando trecho para adicionarmos uma exceo

Repare que no canto esquerdo da seleo apareceu o desenho de uma lmpada. Este cone nos ajudar a criar a exceo. Clique com o boto esquerdo do mouse sobre este cone e escolha a opo Circundar com try {.... Veja na Figura 29 -:

Linguagem de Programao I

104

Captulo 7

Figura 29 Criando uma exceo no NetBeans

Repare que o trecho de cdigo selecionado foi circundado por um TRYCATCH, e que a exceo de formato de nmero j foi identificada. Isso significa que este realmente um erro comum, que pode vir a acontecer neste trecho de cdigo. Para alertarmos o usurio de que o erro ocorreu, iremos mostrar uma janela de alerta. O CATCH da exceo ficar assim:

O mtodo mensagemErro( ) ainda no foi definido. A ideia exibir uma mensagem de erro ao usurio, dizendo que o aluno no pde ser inserido porque alguma nota foi preenchida com erro. O mtodo deve ser definido dentro da prpria classe Interface, como mostrado a seguir:

O mtodo JOptionPane.showMessageDialod( ) exibe uma janela de alerta, que possui apenas um boto para o usurio confirmar que leu o aviso e, em seguida, fechar a janela. Os parmetros que passamos para o mtodo showMessageDialog so:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Controle de erros (excees)

105

1. o parmetro null indica de quem esta nova janela ser filha (neste caso, de nenhuma); 2. o segundo parmetro a mensagem de erro que ser exibida para o usurio; 3. o terceiro o ttulo da janela que ser exibida; 4. o ltimo o cone que ser exibido ao lado da mensagem. Neste caso, mostramos o cone ERROR_MESSAGE, que como um aviso de que algum erro aconteceu. O mtodo esttico para poder ser utilizado fora desta classe, sem necessitar que criemos uma instncia da classe. Veja na Figura 30 - a seguir uma insero que gerar esta exceo, e em seguida a janela de erro que ser exibida:

Figura 30 Avisando o usurio sobre a exceo gerada. Linguagem de Programao I

106

Captulo 7

Alm de showMessageDialog, existe o mtodo showConfirmDialog (que exibe uma janela de confirmao pedindo para o usurio confirmar ou no uma pergunta) e o showInputDialog (que pede para o usurio digitar algo e, em seguida, retorna o texto digitado). Nosso programa ir precisar de mais dois mtodos auxiliares para mostrar mensagens ao usurio, mostrados a seguir:

Agora que j inserimos a exceo e sabemos exibir mensagens de alerta, iremos inserir mais uma mensagem informando os dados do aluno a ser inserido e confirmando se o usurio realmente deseja adicion-lo. A janela s dever ser exibida se no houver a exceo, portanto, o cdigo ficar dentro do bloco TRY. Caso o usurio confirme, ser exibido um alerta de que o aluno foi inserido com sucesso. Veja no trecho de cdigo a seguir como ficar o mtodo jButton1ActionPerformed:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Controle de erros (excees)

107

Repare que a chamada do mtodo limparCampos( ) foi movida para dentro do bloco TRY, j que no precisamos apagar os campos enquanto o usurio no consertar a nota inserida incorretamente.

Nossa interface j est quase completa! Teste-a, verifique-a, insira dados corretos e dados errados. Veja se tudo ocorre como planejado. Vimos que podemos receber dados digitados pelo usurio atravs de uma interface grfica. s vezes, os dados a serem manipulados podem estar em um banco de dados. No prximo captulo, mostrareLinguagem de Programao I

108

Captulo 7

-mos como podemos recuperar, inserir e manipular dados presentes em um banco de dados atravs de cdigo Java. Por fim, no ltimo captulo, mostraremos outros componentes da interface grficas que ainda no utilizamos. Antes de prosseguir, pare um pouco e reveja o contedo aprendido at aqui. Ficou alguma dvida? Est tudo claro? Se a resposta for no, utilize os fruns para tirar dvidas com seu tutor.

Tecnologia em Anlise e Desenvolvimento de Sistemas

ENTRADA E SADA DE DADOS

Prezado aluno, um programa, para ser interativo, precisa de mecanismos que permitam a comunicao com o usurio. J sabemos exibir algumas informaes (imprimindo-as na tela), mas ainda no vimos como ler os dados digitados pelo usurio. Ao final deste captulo, voc ser capaz de ler bytes, caracteres e Strings da entrada padro e escrev-los para a sada padro ou para arquivos.

8.1 Passagem de parmetros para o programa


No primeiro captulo sobre a linguagem Java, vimos que o mtodo main recebe String args[] como parmetro.

Como o main o mtodo principal, seu parmetro tambm parmetro para o programa todo. String args[] um vetor de Strings formado por todos os argumentos passados ao programa na linha de comando do sistema operacional quando o programa invocado. Para utilizar esses argumentos, basta acessar cada posio do vetor, como no exemplo a seguir:

Para passarmos os parmetros pela linha de comando, basta que adicionemos os valores aps a linha de comando que utilizamos para execut-lo:

110

Captulo 8

Como exemplo, vamos considerar a linha de comando a seguir:

O resultado de sua execuo ser:

Os dados so sempre lidos como Strings. Se soubermos que eles so nmeros, devemos transform-los. Para isso, utilizamos o mtodo esttico da classe Integer:

As classes Double, Short, Long, Float etc contm o mesmo tipo de mtodo, como parseDouble e parseFloat, que retornam um double e float respectivamente. J para fazer o contrrio (transformar um nmero em String), a forma mais fcil concaten-lo com uma String vazia:

Veja um exemplo a seguir:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Entrada e sada de dados

111

ATIVIDADE 72. Escolha dois exerccios de cada captulo (exceto do primeiro) e refaa-os, recebendo as variveis utilizadas pela linha de comando.

8.2 Entrada padro


A sada padro do sistema a tela na qual o programa foi executado. No Windows, podemos fazer isso pelo o Prompt de Comando. No Linux, temos vrios consoles, que so as telas em modo texto. Para enviarmos informaes para o usurio por meio da sada padro, utilizamos o mtodo System.out.println. As aplicaes de console utilizam como padro a stream de dados out, disponvel estaticamente na classe java.lang.System. Uma stream pode ser entendida como um duto capaz de transportar dados de um lugar (um arquivo ou dispositivo) para um outro. O conceito de stream extremamente importante, pois utilizado tanto para manipulao de dados existentes em arquivos como tambm para comunicao em rede e outros dispositivos. A stream de sada padro aberta automaticamente pela mquina virtual Java ao iniciarmos uma aplicao Java e permanece pronta para enviar dados. A sada padro est tipicamente associada ao dispositivo de sada (display), ou seja, a janela de console utilizada pela aplicao conforme designado pelo sistema operacional. Como fizemos em vrios exemplos e exerccios anteriores, podemos enviar dados para a sada padro utilizando o mtodo System.out.println. Da mesma forma que toda aplicao de console possui uma stream associada para ser utilizada como sada padro, existe uma outra stream denominada de entrada padro, usualmente associada ao teclado do sistema. Esta stream, chamada in, est disponvel estaticamente na classe java.lang.System e pertence classe java.io.InputStream, que tambm aberta automaticamente quando a aplicao iniciada pela mquina virtual Java (permanecendo pronta para fornecer os dados digitados). Os mtodos disponveis para a entrada de dados na classe java.lang. System so bastante precrios. Os trs principais mtodos so: read(): l um byte; read(byte[]): preenche o array de bytes fornecido como argumento;
Linguagem de Programao I

112

Captulo 8

skip(long): descarta a quantidade de bytes especificada como argumento. A leitura de bytes equivale entrada de caracteres simples, o que pouco confortvel quando estamos trabalhando com valores numricos (inteiros ou reais), Strings ou outra informao diferente de caracteres, pois exige que cada caractere fornecido pelo usurio seja testado e concatenado com os demais para a formao de um determinado valor. Para contornar esta situao, alguns materiais sugerem a criao de uma classe, que chamaremos aqui de Entrada, que contm trs mtodos para leitura de valores digitados pelo usurio: readDouble(): L um valor double da entrada padro; readInteger(): L um valor inteiro da entrada padro; readString() L uma string da entrada padro. No cdigo mostrado a seguir, utilizamos a classe java.io.BufferedReader, que permite a leitura de uma linha inteira da entrada de cada vez. Os mtodos fazem um tratamento mnimo de erros, de forma que valores invlidos so retornados como valores nulos.

Tecnologia em Anlise e Desenvolvimento de Sistemas

Entrada e sada de dados

113

Como a classe e os mtodos so estticos, no precisamos de uma instncia da classe para utiliz-los, isto , pode utiliz-la vontade. No necessrio que voc crie sua prpria classe de leitura da entrada padro para implementar seus exerccios. A seguir, um exemplo de um trecho de cdigo que utiliza os mtodos da classe acima:

Linguagem de Programao I

114

Captulo 8

A seguir, mostramos a implementao de um jogo simples feito em Java, que utiliza a classe Entrada. A ideia ir sorteando nmeros aleatrios entre 0 e 9 e pedir que o usurio v digitando a sequncia digitada at ento. Quando o usurio errar a sequncia, o programa imprime a quantidade de acertos que ele teve:

ATIVIDADE 73. Implemente e teste as classes Entrada e Jogo. 74. Implemente novamente os exerccios da atividade anterior, mas agora pedindo que o usurio digite o valor das variveis utilizadas.
Tecnologia em Anlise e Desenvolvimento de Sistemas

Entrada e sada de dados

115

8.3 Manipulao de arquivos


As classes abstratas InputStream e OutputStream definem, respectivamente, o comportamento padro dos fluxos em Java: em um fluxo de entrada, possvel ler bytes e, no fluxo de sada, escrever bytes. FileInputStream uma subclasse de InputStream que recebe uma String como argumento no construtor, indicando o nome de um arquivo a ser lido. O arquivo procurado no diretrio em que o Java foi invocado, a no ser que seja informado um caminho absoluto. O exemplo a seguir mostra um caso bem simples de leitura de um byte de arquivo:

Para recuperar um caractere, precisamos traduzir os bytes com o encoding dado para o respectivo cdigo unicode, o que pode usar um ou mais bytes. Escrever esse decodificador complicado, por isso existe a classe InputStreamReader, que cuida disso:

O construtor de InputStreamReader pode receber o encoding a ser utilizado como parmetro, se desejado, tal como UTF-8 ou ISO-8859-1.

Devido a grande quantidade de aplicativos internacionalizados de hoje em dia, imprescindvel que um bom programador entenda bem o que so os character encodings e o Unicode. O blog da Caelum possui um bom artigo a respeito: http://blog.caelum.com.br/2006/10/22/entendendo-unicode-eos-character-encodings
Linguagem de Programao I

116

Captulo 8

InputStreamReader subclasse da classe abstrata Reader, que possui diversas outras subclasses que manipulam caracteres. Apesar da Reader j ajudar no trabalho de manipulao de caracteres, ainda seria difcil ler uma String. A classe BufferedReader consegue ler e concatenar os diversos caracteres lidos para formar uma String por meio do mtodo readLine:

A leitura por pedaos (usando o buffer) feita para evitar a realizao de muitas chamadas ao sistema operacional (voc pode at configurar o tamanho do buffer pelo construtor). O mtodo readLine devolve a linha que foi lida e muda o cursor para a prxima linha. Caso ele chegue ao fim do Reader (no nosso caso, fim do arquivo), ele vai devolver null. Ento, com um simples lao podemos ler o arquivo por inteiro:

Existem semelhanas entre o cdigo que utilizamos para fazer a leitura do arquivo e o que realizava leitura do teclado. Na verdade, poderamos alterar apenas uma linha do cdigo acima para passarmos a ler da entrada padro (ao invs de um arquivo) apenas modificando a quem a varivel is est se referindo. A linha a seguir:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Entrada e sada de dados

117

poderia ser trocada por esta:

A escrita em arquivos anloga. Veja um exemplo a seguir:

O mtodo write do BufferedWriter no insere caracteres de quebra de linha. Para isso, voc pode chamar o mtodo newLine.

importante sempre fechar o arquivo no final da escrita ou leitura. Voc pode fazer isso chamando diretamente o mtodo close de FileInputStream e OutputStream, ou ainda chamando o close de BufferedReader e Writer. comum que o close esteja dentro de um bloco finally. Se um arquivo for esquecido aberto e a referncia para ele for perdida, ele ser fechado pelo garbage collector. Mas no bom voc se prender a isso: se voc esquecer de fechar o arquivo, no caso de um programa pequeno como o nosso exemplo, o programa terminar antes que o garbage collector te ajude, resultando em um arquivo no escrito (os bytes ficaram no buffer do BufferedWriter). Problemas similares podem acontecer com leitores que no forem fechados.

Linguagem de Programao I

118

Captulo 8

ATIVIDADE 75. Implemente novamente os exerccios da atividade anterior (exceto o Jogo), mas agora fazendo a leitura das variveis em um arquivo de entrada, e imprimindo a sada em um outro arquivo.

Algo importante para nossos programas podermos manter um conjunto de dados persistente no computador, para que o usurio no tenha que cadastr-los sempre que o programa for iniciado. No prximo captulo mostraremos, por exemplo, como salvar e recuperar dados de um Banco de Dados em Java.

Tecnologia em Anlise e Desenvolvimento de Sistemas

PERSISTNCIA DE DADOS

Prezado aluno, fundamental que um grande sistema seja capaz de se comunicar com um repositrio de dados. Hoje em dia, comum que esse repositrio seja um banco de dados, como vocs esto aprendendo na disciplina Banco de Dados. Neste captulo, mostraremos como nosso programa pode interagir com um banco (recuperando, inserindo e manipulando seus dados).

9.1 Criando e populando um banco de dados no Netbeans


Antes de conectarmos nosso cdigo a um banco de dados, necessrio que este banco seja criado. O NetBeans possui uma ferramenta para gerenciar bancos de dados que permite, por exemplo, criar um banco, criar suas tabelas, realizar consultas e inserir dados nas tabelas do banco. Alm disso, as instalaes padres j vm com um banco de dados chamado Java DB previamente instalado. Neste material, iremos utilizar o banco Java DB, mas a lgica dos programas a mesma caso fosse utilizado outro banco, como MySQL ou PostgreSQL. provvel que o banco Java DB j esteja instalado e configurado em seu NetBeans. Para conferir, clique na aba Servios (no canto superior esquerdo de seu NetBeans), expanda a opo Banco de Dados, clique com o boto direito em Java DB e crie um novo banco de dados (como na Figura 31 -):

120

Captulo 9

Figura 31 Criando um banco de dados no NetBeans

Em seguida, escolha um nome para o banco (por exemplo, LP), um login e uma senha (que sero necessrios para a conexo com o banco). Veja na figura Figura 32 -:

Figura 32 Nome, usurio e senha do banco de dados

O banco criado ir aparecer na aba Servios. Clique com o boto direito do mouse no banco, escolha a opo Conectar ao banco e depois expanda-a. Repare que agora possvel visualizar as tabelas do banco (por enquanto nenhuma tabela foi criada). Para criar uma tabela, clique com o boto direito em Tabelas e escolha a opo Criar Tabela. O banco de dados que estamos criando ir armazenar os alunos de nosso projeto inicial. Neste caso, os alunos no precisaro mais ser armazenados em um ArrayList, j que seus dados so sempre perdidos quando o programa fechado. Gravando os dados no banco, eles continuaro existindo quando o programa for iniciado novamente. Da vem o nome persistncia de dados.
Tecnologia em Anlise e Desenvolvimento de Sistemas

Persistncia de dados

121

O banco de dados para nosso programa conter uma tabela chamada Aluno, que ir armazenar um nome (VARCHAR, de tamanho 30), uma matrcula (VARCHAR, de tamanho 15) e as notas das provas do aluno (DOUBLE). Veja a janela de criao da tabela na Figura 33 -:

Figura 33 Criando a tabela Aluno

Repare que a matrcula chave primria da tabela, pois no pode haver dois alunos com uma mesma matrcula. Aps a criao da tabela, se clicarmos com o boto direito sobre ela na aba Servios, podemos escolher a opo Visualizar Dados. Esta opo nos mostra os dados j inseridos e permite inserirmos dados na tabela. O boto para inserirmos dados na tabela aparece em destaque na Figura 34 -:

Figura 34 Boto para inserirmos dados na tabela.

Clicando no boto, podemos popular nossa tabela com dados referentes a alguns alunos. Isso pode ser til para testarmos nosso cdigo mais adiante, portanto, insira dados para alguns alunos em sua tabela.
Linguagem de Programao I

122

Captulo 9

9.2 Como conectar e inserir dados no BD


Para conectarmos o programa a um banco de dados em Java, precisamos importar a biblioteca contendo o driver do banco de dados que ser utilizado. Clique com o boto direito do mouse sobre a aba Bibliotecas, que fica dentro da aba com seu projeto, e escolha a opo Adicionar biblioteca. Veja um exemplo na Figura 35 -:

Figura 35 Inserindo uma biblioteca ao projeto

Depois, procure a opo Driver do Java DB ou JAVADB DRIVER LABEL. Se no encontrar nenhuma das opes, pea ajuda a seu tutor. Em seguida, precisamos importar o pacote java.sql.* na arquivo em que iremos realizar a conexo:

Em seguida, precisamos inserir um trecho de cdigo para carregar o driver do banco, estabelecer uma conexo com o banco e realizar os comandos SQL necessrios. Em nosso projeto inicial, precisaremos acessar o banco de dados na classe Interface a cada vez que formos inserir um novo aluno. Para isso, criaremos o mtodo mostrado a seguir (no se esquea de importar o pacote java.sql.* na classe Interface):

Tecnologia em Anlise e Desenvolvimento de Sistemas

Persistncia de dados

123

As strings driver, url, username e password precisam estar corretas para que a conexo seja estabelecida com sucesso. Para conferir seus valores, clique com o boto direito no banco de dados (na aba Servios) e escolha a opo Propriedades. A string contendo o comando SQL tambm deve estar correta. Note que em SQL os elementos do tipo VARCHAR precisam estar entre aspas simples (). Agora, basta chamarmos o mtodo inserirAlunoBD ao invs de incluirAluno quando o usurio confirma que deseja adicionar os
Linguagem de Programao I

124

Captulo 9

dados. A diferena que o anterior inseria em um ArrayList, agora inserimos em um Banco de Dados. Portanto, o atributo da classe que armazenava o ArrayList de alunos pode ser removido, assim como o mtodo incluirAluno.

Lembre-se de que a ao executada quando o usurio clicava no boto Fechar da interface criava uma instncia da classe ListaAluno passando o ArrayList de alunos como parmetro para seu construtor. Retire o parmetro de l, e no se preocupe com o alerta de erro que o NetBeans lhe dar (pois a classe ListaAluno ser modificada na prxima seo).

9.3 Como recuperar dados do BD

Para recuperarmos valores de uma tabela no banco de dados, precisamos nos conectar a ela da mesma forma que fizemos na ltima seo. Em nosso projeto, isso ser necessrio quando formos exibir a lista de alunos adicionados pelo usurio. No cdigo-fonte da classe ListaAluno, havamos criado um construtor que recebia um ArrayList como parmetro. Este parmetro deve ser retirado, pois o ArrayList no existe mais na classe Interface. Ao invs de ser recebido como parmetro do construtor, o ArrayList ser retornado por um mtodo que far uma consulta ao banco de dados. Veja, a seguir, como ficar o construtor da classe ListaAluno:

Por fim, devemos criar o mtodo contendo a consulta ao banco de dados. Veja-o a seguir:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Persistncia de dados

125

Linguagem de Programao I

126

Captulo 9

Note que fizemos chamada a um mtodo esttico da classe Interface (um mtodo esttico pode ser executado sem que haja uma instncia da classe) nos bloco CATCH. Como visto no cdigo acima, o conjunto de resultados de uma consulta fica armazenado em um objeto do tipo ResultSet. Este objeto possui um mtodo next( ) que nos permite percorrer cada linha da consulta resultante. Para acessarmos cada coluna de cada linha, utilizamos os mtodos getString (para retornar uma String), getDouble (para retornar um Double), getInt (para retornar um inteiro) etc. Cada um desses mtodos recebe como parmetro o nome da coluna a ser retornada.

Pronto! Nosso projeto j est totalmente pronto, contendo interface grfica e persistncia de dados. No prximo captulo mostraremos apenas alguns novos conceitos de interface grfica que no utilizamos at aqui.

ATIVIDADE 76. Aps acompanhar tudo que fizemos na interface do projeto inicial at aqui, sua atividade verficar se tudo est funcionando corretamente e nos enviar os trs cdigos principais: a classe Interface, a classe Aluno e a classe ListaAluno. Boa sorte!

Tecnologia em Anlise e Desenvolvimento de Sistemas

INTERFACES GRFICAS

Ol aluno, se voc chegou at aqui porque j aprendeu vrios conceitos de interfaces grficas ao longo deste material. Neste captulo, mostraremos apenas alguns conceitos no vistos at agora, como alguns componentes que no foram utilizados em nosso projeto. Ao final deste captulo, voc deve ser capaz de identificar componentes que se adaptem melhor s funcionalidades das interfaces grficas que voc pretender implementar.

10.1 Componentes da interface


A seguir, mostramos os principais componentes de uma interface grfica em Java. Alguns deles foram utilizados ao longo deste material: JFrame: onde ficaro todos os componentes da interface. O Frame, que contm os componentes da interface, possui alguns mtodos que podem ser teis: JFrame( ): cria uma janela vazia; getTitle( ): obtm o ttulo da janela; setTitle( ): define o nome da janela; setSize( ): define o tamanho da janela; setLocation( ): define a posio da janela na tela; isResizable( ): verifica se a janela ou no redimensionvel; setResizable(boolean): especifica se a janela ou no redimensionvel. Painel (JPanel): um painel criado em cima de um JFrame. Permite, entre outras opes, adicionar cor de fundo e borda ao JFrame. Pode haver mais de um painel em um mesmo JFrame, o qual utilizado para organizar melhor sua interface. A Figura 36 - mostra um JFrame com dois painis:

128

Captulo 10

Figura 36 Frame com dois painis.

Rtulo (JLabel): um campo no qual podemos inserir textos e at imagens. A Figura 37 - mostra um exemplo:

Figura 37 Rtulo.

Campo de Texto (JTextField): um campo de texto cujo contedo pode ser modificado pelo usurio. nele que o usurio insere dados que sero utilizados pelo programa. Todos os dados inseridos em um JTextField so tratados como String. Portanto, dados numricos precisam ser convertidos. Veja um campo de texto na Figura 38 -:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Interfaces grficas

129

Figura 38 Campo de texto.

rea de Texto (JTextArea): semelhante ao JTextField, mas permite a entrada de textos maiores (com mais de uma linha), como na Figura 39 -:

Figura 39 rea de texto.

Boto de Opo (JRadioButton): um conjunto de opes no qual apenas uma pode ser selecionada pelo usurio. Um Grupo de Botes (ButtonGroup) um componente utilizado para criar grupos de JRadioButtons ( til para no haver confuso quando temos vrios conjuntos de JRadioButton). Veja um exemplo de boto de opo na Figura 40 -:

Linguagem de Programao I

130

Captulo 10

Figura 40 Boto de opo.

Caixa de Seleo (JCheckBox): parecido com o JRadioButton, mas permite que vrios itens sejam selecionados ao mesmo tempo. Veja um exemplo na Figura 41 -:

Figura41 Caixa de seleo.

Caixa de Combinao (JComboBox): como uma lista de itens na qual o usurio pode escolher apenas uma opo, como na Figura 42 -:

Tecnologia em Anlise e Desenvolvimento de Sistemas

Interfaces grficas

131

Figura 42 Caixa de combinao.

Boto (JButton): um boto que, quando clicado, permite que executemos determinadas aes. Veja um exemplo na Figura 43 -:

Figura 43 Boto.

Barra de Rolagem (JScrollBar): permite ajustar o contedo da rea de visualizao, como na Figura 44 -:

Linguagem de Programao I

132

Captulo 10

Figura 44 Barra de rolagem.

Barra de Progresso (JProgessBar): mostra o progresso e a porcentagem de concluso de uma determinada ao.

Alm desses, existem componentes para adicionarmos menus a uma interface. O NetBeans permite a manipulao dos componentes de forma fcil. Os componentes do Frame possuem atributos que modificam suas propriedades (como posicionamente, textos, bordas etc). Estes atributos no sero mostrados aqui, j que o NetBeans possui ferramentas para facilitar a construo das interfaces.

10.2 Caixas de dilogos


A incluso de mensagens realizada por meio da classe JOptionPane, especializada na gerao de caixas de dilogo, isto , pequenas janelas que fazem uma pergunta, avisam algo ao usurio ou fornecem uma mensagem qualquer. Uma caracterstica particular desta classe a no-necessidade de sua instanciao, pois as caixas de mensagens so criadas diretamente pelo mtodo da classe. Existem quatro tipos padro de caixas de dilogo: 1. MessageDialog: caixa de dilogo que apresenta uma mensagem, possibilitando acrescentar cones de alerta ao usurio. utilizada para mostrar ao usurio alguma informao e no retorna nenhum tipo de valor de resposta. Sua sintaxe :
Tecnologia em Anlise e Desenvolvimento de Sistemas

Interfaces grficas

133

JOptionPane.showMessageDialog(Component, <mensagem>, <ttulo da mensagem>,<tipo de mensagem>) Onde: Component: define a posio da tela em que a caixa de mensagem aparecer. Quando deixado com null, aparecer centralizada na tela; Mensagem: string com a mensagem a ser exibida para o usurio; Ttulo da mensagem: o ttulo da janela que ser aberta; Tipo de mensagem: o cone que representa o tipo de mensagem. O Quadro 2 - apresenta as constantes da linguagem Java para definio dos cones.

cone Pergunta Informao Alerta Erro Vazio (somente mensagem)

Comando QUESTION_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE ERROR_MESSAGE PLAIN_MESSAGE

Quadro 2 Tipos de mensagens e de cones

Na Figura 45 -, mostramos uma caixa de dilogo do tipo informao:

Figura 45 MessageDialog.

2. InputDialog: caixa de dilogo que, alm de emitir uma mensagem, permite a entrada de um texto. Utilizada para fazer uma pergunta e solicitar a entrada de um texto. Sua sintaxe : String resp = JOptionPane.showInputDialog (null,<mensagem>, <ttulo da mensagem>,<tipo de mensagem>)

Linguagem de Programao I

134

Captulo 10

Veja um exemplo na Figura 46 -:

Figura 46 InputDialog.

3. ConfirmDialog: caixa de dilogo que, alm de emitir uma mensagem, possibilita ao usurio responder a uma pergunta. Utilizada para o usurio responder Yes, No, OK e Cancel. Existem trs tipos de caixa de confirmao: Yes/No: YES_NO_OPTION (ou 0); Yes/No/Cancel: YES_NO_CANCEL_OPTION (ou 1); OK/Cancel: OK_CANCEL_OPTION (ou 2). A sintaxe : int resposta = JOptionPane.showConfirmDialog(Component, <mensagem>, <ttulo da mensagem>, <botes presentes>, <tipo de mensagem>) A Figura 47 - mostra uma caixa de confirmao do tipo Yes/No:

Figura 47 ConfirmDialog.

4. OptionDialog: caixa de dilogo que abrange os trs tipos anteriores. Sua sintaxe : int resposta = (null, <mensagem>, <ttulo da mensagem>, <botes presentes>, <tipo de mensagem>, <cone>, <array de objetos>, <seleo padro>)
Tecnologia em Anlise e Desenvolvimento de Sistemas

Interfaces grficas

135

Na qual: Array de objetos: um array de objetos que contm os componentes ou outrots objetos que representam as escolhas na caixa de dilogo, caso YES_NO_OPTION, YES_NO_CANCEL_OPTION ou OK_CANCEL_OPTION no estejam sendo utilizados. Seleo padro: o objeto que representa a seleo padro, caso YES_NO_OPTION, YES_NO_CANCEL_OPTION ou OK_ CANCEL_OPTION no estejam sendo utilizados. ATIVIDADE 77. Para terminar seus estudos de Java, crie um novo projeto com uma interface grfica semelhante da Figura 43 -. Quando o usurio clicar no boto, devem ser exibidas as caixas de dilogo da Figura 44 -, da Figura 45 - e da Figura 46 -.

Este fascculo se encerra aqui. Espero que voc aproveitado o mximo possvel. Se ainda tiver dvidas no esclarecidas, entre em contato com o professor ou com seu tutor. Boa sorte em seus estudos!

Linguagem de Programao I

136

Captulo 10

Tecnologia em Anlise e Desenvolvimento de Sistemas

CAELUM, Java e Orientao a Objetos, Apostila. [Internet: http://www.caelum.com. br/downloads/apostila/caelum-java-objetos-fj11.pdf]. Acesso em 04/03/2009. CESTA, Andr Augusto. Tutorial: A linguagem de programao Java Orientao Objetos. Apostila. Campinas, SP: Unicamp, 1996. [Internet: http://www.dcc. unicamp.br/~aacesta]. Acesso em 04/03/2009. DEITEL, Harvey M,; DEITEL , Paul J., Java: Como Programar, So Paulo: PrenticeHall, 2005. HORSTMANN, Cay; CORNELL, Gary, Core Java 2, Fundamentos, So Paulo: Makron Books, Volume 1, 2000. JANDL, Peter Jr, Introduo ao Java, Apostila, Ncleo de Educao a Distncia, Universidade So Francisco, 1999. [Internet: http://www.comp.pucpcaldas.br/~al550375261/ programacao/Java/Curso%20de%20Java.pdf]. Acesso em 04/03/2009. PAMPLONA, Vitor Fernando, Tutorial Java: O que Java?, Tutorial. [Internet: http:// javafree.uol.com.br/artigo/871498/Tutorial-Java-O-que-e-Java.html]. Acesso em 04/03/2009. PAMPLONA, Vitor Fernando, Tutorial Java 2: Caractersticas Bsicas, Tutorial. [Internet: http://javafree.uol.com.br/artigo/871496/Tutorial-Java-2-Caracteristicas-Basicas.html]. Acesso em 04/03/2009. PAMPLONA, Vitor Fernando, Tutorial Java 3: Orientao a Objetos, Tutorial. [Internet: http://javafree.uol.com.br/artigo/871497/Tutorial-Java-3-Orientacao-a-Objetos.html]. Acesso em 04/03/2009. WALNUM, Clayton. Java Em Exemplos. So Paulo, SP: Makron Books, 1997.