You are on page 1of 344

Programao Orientada a Objetos em Java

Prof. Cristiano Camilo dos Santos de Almeida Prof. Rafael Guimares Sakurai 2012

Programao Orientada a Objetos Universidade Metodista de So Paulo

ndice
Introduo ..................................................................................................................................5 A Linguagem Java .................................................................................................................5 Plataforma Java .....................................................................................................................6 Viso geral do Java Standard Edition ....................................................................................7 Java Virtual Machine ..............................................................................................................8 Compilando um cdigo em linha de comando .......................................................................8 Linhas de comentrio em Java ..............................................................................................9 A linguagem Java ....................................................................................................................11 Palavras Chave ....................................................................................................................11 Variveis ..............................................................................................................................11 Tipos Primitivos ....................................................................................................................12 Tipos Inteiros (byte, short, int ou long) .................................................................................13 Tipos Ponto Flutuante (float ou double) ...............................................................................15 Tipo Caractere (char) ...........................................................................................................16 Tipo Booleano (boolean) ......................................................................................................17 Casting .................................................................................................................................17 java.util.Scanner ..................................................................................................................19 Operadores ..........................................................................................................................21 Operadores aritmticos ....................................................................................................22 Operadores de atribuio .................................................................................................26 Operadores unrios .........................................................................................................32 Operadores lgicos ..........................................................................................................34 Operadores relacionais ....................................................................................................37 Operador condicional .......................................................................................................41 Operadores bit a bit ..........................................................................................................42 Exerccios ............................................................................................................................47 Estruturas de controle e repetio ...........................................................................................50 if / else ..................................................................................................................................50 switch ...................................................................................................................................52 while .....................................................................................................................................54 do / while ..............................................................................................................................55 for .........................................................................................................................................56 Enhanced for ou for-each ..................................................................................................58 A instruo break .................................................................................................................59 A instruo continue .............................................................................................................60 Exerccios ............................................................................................................................61 Classe e Objeto .......................................................................................................................65 Objetos ................................................................................................................................67 Utilizando os atributos da classe .........................................................................................68 Mtodos com retorno de valor .............................................................................................70 Mtodos com recebimento de parmetro ............................................................................72 Mtodos construtores ..........................................................................................................75 Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai -2-

Programao Orientada a Objetos Universidade Metodista de So Paulo Exerccios ............................................................................................................................78 A Classe java.lang.String ........................................................................................................81 Converso para String (texto) ..............................................................................................83 Converso de String para tipos Primitivos ..........................................................................83 Recebendo Strings como parmetro diretamente no mtodo main ....................................84 Exerccios ............................................................................................................................86 Identidade e Igualdade ............................................................................................................87 Assinatura de Mtodos ...........................................................................................................92 Troca de Mensagens ...........................................................................................................94 Varargs ................................................................................................................................96 Exerccios ..........................................................................................................................100 Plain Old Java Object POJO ..............................................................................................103 Pacotes .................................................................................................................................106 Exerccios ..........................................................................................................................109 Visibilidade ............................................................................................................................111 Modificador de acesso: private ..........................................................................................111 Modificador de acesso: default (ou package) ....................................................................113 Modificador de acesso: protected ......................................................................................115 Modificador de acesso: public............................................................................................117 Exerccios ..........................................................................................................................117 Encapsulamento ....................................................................................................................119 Exerccios ..........................................................................................................................126 Interfaces ..............................................................................................................................129 Exerccios ..........................................................................................................................138 Herana .................................................................................................................................143 Exerccios ..........................................................................................................................149 Classes Abstratas .................................................................................................................152 Exerccios ..........................................................................................................................156 Excees em Java ................................................................................................................161 Bloco try / catch .................................................................................................................162 Palavra chave throw ..........................................................................................................164 Bloco finnaly.......................................................................................................................165 Palavra chave throws ........................................................................................................167 Hierarquia das Exceptions .................................................................................................168 Checked Exceptions ..........................................................................................................169 Unchecked Exceptions ......................................................................................................169 Errors .................................................................................................................................171 Tratando mltiplas Excees ............................................................................................172 Criando sua exceo .........................................................................................................172 Exerccios ..........................................................................................................................174 Polimorfismo ..........................................................................................................................178 Casting (converso) de objetos .........................................................................................185 Exerccios ..........................................................................................................................186 Conexo com bancos de dados - J.D.B.C. ...........................................................................190 Consulta de dados .............................................................................................................194 Manipulao de dados ......................................................................................................196 Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai -3-

Programao Orientada a Objetos Universidade Metodista de So Paulo Relao de algumas bases de dados ................................................................................197 Exemplo de aplicao C.R.U.D. (Create, Read, Update, Delete)......................................198 Exerccios ..........................................................................................................................208 Interfaces grficas - SWING ..................................................................................................210 Utilizando o JFrame ...........................................................................................................223 Utilizando JTextField ..........................................................................................................224 Utilizando JButton ..............................................................................................................226 Utilizando o JLabel ............................................................................................................229 Utilizando o JComboBox....................................................................................................230 Imagens no Swing .............................................................................................................232 Exemplo de aplicao desktop. .........................................................................................235 JFileChooser ......................................................................................................................241 Utilizando o JMenuBar, JMenu e JMenuItem ....................................................................245 Exerccios ..........................................................................................................................260 Exemplos de aplicaes Swing .........................................................................................263 Exemplo de tratamento de exceo usando Swing .......................................................263 Exemplo de aplicao C.R.U.D. com exibio em tela ..................................................266 Leitura de arquivos ................................................................................................................283 Exemplo de leitura de arquivo ...........................................................................................283 Streams de caracteres ......................................................................................................286 java.io.Reader ................................................................................................................287 java.io.Writer ..................................................................................................................288 Streams de bytes ...............................................................................................................290 java.io.InputStream ........................................................................................................291 java.io.OutputStream .....................................................................................................291 Serializao de objetos .....................................................................................................292 Exerccios ..........................................................................................................................296 Recursos da Linguagem Java ...............................................................................................299 Arrays ou Vetores em Java ................................................................................................299 Declarao do vetor .......................................................................................................299 Inicializao de dados do vetor ......................................................................................300 Acesso aos elementos do vetor .....................................................................................301 Um pouco sobre a classe Arrays ...................................................................................301 Trabalhando com constantes ............................................................................................302 Enums ................................................................................................................................303 Justificativas do uso de Enums a constantes ................................................................303 Como criar uma Enum ...................................................................................................305 Collection ...............................................................................................................................308 Um pouco sobre Generics .................................................................................................311 Exerccios ..........................................................................................................................312 Apndice A Boas prticas ..................................................................................................314 Apndice B Javadoc ...........................................................................................................318 Apndice C Instalando e Configurando o Java ..................................................................323 Apndice D Primeira aplicao no NetBeans ....................................................................336 Bibliografia .............................................................................................................................344

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

-4-

Programao Orientada a Objetos Universidade Metodista de So Paulo

1. Introduo

A Linguagem Java
A Linguagem Java surgiu a partir de uma pesquisa financiada pela Sun Microsystems em 1991, iniciada sob o codinome de projeto Green. Com o intuito de se tornar uma linguagem para dispositivos inteligentes destinados ao usurio final e com a premissa de ser uma linguagem prxima s linguagens C e C++ e que pudesse ser executado em diversos hardwares. A princpio, o projeto no teve bons resultados devido lentido do crescimento da rea de dispositivos eletrnicos inteligentes, porm com a grande revoluo da World Wide Web em 1993, logo se notou o potencial da linguagem para gerao de contedo dinmico, o que deu nova fora ao projeto.

Prottipo Star 7 [PROJECT GREEN]

Inicialmente, Java foi batizada de Oak por seu criador (James Gosling). Tempos mais tarde, descobriu-se que j existia uma linguagem de programao chamada Oak. Com isso, em uma visita da equipe de desenvolvimento a uma cafeteria local, o nome Java surgiu (nome do caf) e logo foi denominada a linguagem. Em maro de 1995, foi anunciado no evento SunWorld a tecnologia Java 1.0. Inicialmente, o foco principal da tecnologia, utilizado para divulgao foram os Applets, pequenas aplicaes que poderiam ser executadas via web atravs de um browser. Em 1998, foi lanada a verso 1.2 (codinome Playground) da linguagem Java. Esta nova verso trouxe uma quantidade muito grande de novas funcionalidades. Tal alterao foi to grande que a pessoa do marketing comeou a cham-la de Java 2.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

-5-

Programao Orientada a Objetos Universidade Metodista de So Paulo As verses 1.3 (codinome Kestrel), lanada em 2000, e 1.4 (codinome Merlin), lanada em 2002 continuaram sendo chamadas de Java 2, pois houveram alteraes e melhorias na linguagem, mas no to grandes como na verso 1.2. Na verso 1.5, lanada em 2004, o pessoal resolveu mudar novamente chamando de Java 5 (codinome Tiger), a partir desta verso foi padronizado as novas atualizaes. Em 2006, foi lanado o Java 6 (codinome Mustang). No ano de 2009 a empresa Oracle comprou a Sun Microsystems, como a nova verso do Java estava demorando para sair e iria demorar mais algum tempo, foi dividido a especificao do Java 7 atual, para duas verses Java 7 e Java 8, e em 2011 foi lanado a verso 7 que tem o codinome Dolphin. Atualmente o Java est na verso 7 update 2 e seu kit de desenvolvimento pode ser baixado atravs do site da Oracle no seguinte endereo: http://www.oracle.com/technetwork/java/ javase/downloads/jdk-7u2-download-1377129.html. Java tambm uma linguagem Open Source e no possui um nico dono. Todas as novas atualizaes da linguagem so feitas atravs da JCP (Java Community Process), formada por um conjunto de empresas.

Plataforma Java
Atualmente, a linguagem Java pode ser utiliza para desenvolvimento dos mais diferentes segmentos como: aplicaes console, desktop, aplicaes Web e dispositivos portteis, tais como celulares e pagers.

Plataforma Java [DEVMEDIA].

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

-6-

Programao Orientada a Objetos Universidade Metodista de So Paulo Java Standard Edition (Java SE) Este pacote responsvel pelas APIs principais da linguagem Java, a partir deste pacote podemos criar aplicaes console e desktop, utilizar conexo com banco de dados, leitura e escrita de arquivos, comunicao atravs de rede de computadores, etc. Java Enterprise Edition (Java EE) Este pacote possui tudo que o Java SE tem e adiciona as APIs principais para desenvolvimento de aplicaes web, podemos criar componentes distribudos, criao de paginas web dinmicas, utilizao de filas de mensageria, etc. Java Micro Edition (Java ME) Este um pacote mais compacto utilizado para desenvolvimento de aplicaes moveis como celulares e pagers, como normalmente utilizado em hardwares de pequeno porte, possui uma quantidade mais limitada de funcionalidades.

Viso geral do Java Standard Edition

APIs utilizadas dentro da plataforma Java SE [JAVA SE]

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

-7-

Programao Orientada a Objetos Universidade Metodista de So Paulo H dois principais produtos dentro da plataforma Java SE: Java Runtime Environment (JRE) e Java Development Kit (JDK). - O JRE fornece a Java Virtual Machine, bibliotecas e outros componentes para executar aplicaes escritas em Java. - O JDK contm tudo o que tem na JRE, mais ferramentas adicionais para desenvolver (compilar e debugar) aplicaes feitas em Java.

Java Virtual Machine


A Java Virtual Machine uma mquina imaginria que implementada atravs da emulao em software. Existe uma JVM diferente para cada Sistema Operacional (SO) e uma vez que sua aplicao criada, a mesma pode ser executada em diversos SO atravs da JVM sem ter que ser recompilado. O cdigo que executado pela JVM so os bytecodes. Quando um arquivo .java criado, o mesmo precisa ser compilado para .class. Essa compilao converte os cdigos Java para bytecodes e a JVM se encarrega de executar os bytecodes e fazer a integrao com o SO. Fases da programao Java:

Compilando um cdigo em linha de comando


Durante o desenvolvimento de aplicaes utilizando a linguagem Java, precisamos escrever os cdigos fonte em arquivos com a extenso .java. No exemplo a seguir, o arquivo chamado PrimeiraClasse.java, possui um cdigo Java para apresentar na tela console a mensagem Hello World!!!:
PrimeiraClasse.java 01 02 03 04 /** * Exemplo de uma classe simples em Java. */ public class PrimeiraClasse {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

-8-

Programao Orientada a Objetos Universidade Metodista de So Paulo


05 06 07 08 public static void main(String[] args) { System.out.println("Hello world !!!"); } }

Depois de criado este arquivo, acessando a linha de comando, executaremos o seguinte comando para compilar a classe PrimeiraClasse.java: C:\>javac PrimeiraClasse.java A aplicao javac responsvel por compilar o arquivo .java gerando o arquivo .class de bytecode. Aps a execuo deste comando, um arquivo com bytecode Java ser criado em disco, com o seguinte nome: PrimeiraClasse.class. Um ponto importante da linguagem que ele case sensitive, ou seja, a letra a em minsculo diferente da letra A em maisculo. Caso escrevamos o cdigo Java, como, por exemplo, Public com P maisculo ou string com o s minsculo, teremos um erro de compilao. Para os iniciantes na linguagem este um dos maiores problemas encontrados durante a compilao. Agora, para executarmos nosso novo arquivo compilado Java, basta submet-lo a mquina virtual Java, atravs do seguinte comando: C:\java PrimeiraClasse Note que, apesar de no estarmos utilizando a extenso ao executar a classe, o arquivo submetido foi o arquivo .class. A aplicao java (utilizada na linha de comando), compe tanto o pacote da JDK como da JRE. C:\>javac PrimeiraClasse.java C:\>java PrimeiraClasse Hello world!!! Quando executamos java PrimeiraClasse o Java comea a executar os cdigos do nosso programa. Nesse caso, o mtodo public static void main(String[] args) chamado. O mtodo main o incio de tudo, a partir da main voc pode iniciar seu programa, se preciso pode chamar outras classes, outros mtodos, etc.

Linhas de comentrio em Java

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

-9-

Programao Orientada a Objetos Universidade Metodista de So Paulo Durante o desenvolvimento de um software muito importante escrever comentrios explicando o funcionamento / lgica dos cdigos fontes, pois facilita tanto o desenvolvimento do cdigo como sua manuteno. A linguagem Java fornece trs formas diferentes de escrever comentrios:

// -> Comentrio de uma nica linha /* Comentrio longo com mais de uma linha */ /** * Javadoc * Mais informaes sobre o Javadoc no apndice B. */ Exemplo:
ExemploComentario.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 /** * Classe utilizada para demonstrar o uso de comentrios. * * Depois que uma classe Java compilada, os comentrios no vo * para os cdigos compilados .class, dessa forma os comentrios * no interferem no tamanho final do projeto. */ public class ExemploComentario { public static void main(String[] args) { //Imprime uma mensagem para o usuario. System.out.println("Demonstrando o uso dos comentrios."); /* Podemos utilizar esta forma quando queremos escrever um comentrio mais longo para exemplicar o cdigo. */ } }

Na primeira linha estamos criando um comentrio do tipo javadoc. Este tipo de linha de comentrio inicia-se por uma barra e dois asteriscos e se estende por sete linhas. J na dcima linha, temos um exemplo de um comentrio simples de uma linha. Ao final do cdigo da classe, usamos o comentrio longo que pode ser utilizado por vrias linhas.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 10 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

2. A linguagem Java

Palavras Chave
Java possui algumas palavras chaves (ou palavras reservadas) que so da linguagem e no podem ser usados para outros fins, como, por exemplo: nome de variveis, mtodos e classes. abstract case continue enum for instanceof new return switch transient assert catch default extends goto int package short synchronized try boolean char do final if interface private static this void break class double finally implements long protected strictfp throw volatile byte const else float import native public super throws while

OBS: Note que todas as palavras chaves so escritas em minsculo. As palavras chave const e goto foram criadas, mas no possuem nenhuma funcionalidade.

Variveis
Uma varivel um objeto normalmente localizado na memria, utilizado para representar valores. Quando declaramos uma varivel estamos associando seu nome (identificador) ao local da memria onde est armazenada sua informao. As variveis em Java podem ser do tipo primitivo ou objeto:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 11 -

Programao Orientada a Objetos Universidade Metodista de So Paulo - Variveis primitivas: podem ser do tipo byte, short, int, long, float, double, char ou boolean. - Variveis de referncia: usada para referenciar um objeto. Uma varivel de referncia usada para definir qual o tipo do objeto ou um sub tipo do objeto (veremos isso mais a frente). Na declarao de uma varivel primitiva, associando-a a um espao na memria que vai guardar o seu valor. No caso da varivel de referncia,aresta associao para algum lugar vazio (null) ou para algum espao da memria que guarda os dados de um objeto. As variveis primitivas e de referncia so guardadas em locais diferentes da memria. Variveis primitivas ficam em um local chamado stack e as variveis de referncia ficam em um local chamado heap.

Tipos Primitivos
A linguagem Java no totalmente Orientada a Objetos, e isto se deve principalmente aos atributos do tipo primitivo, pois so tipos de dados que no representam classes, mas sim valores bsicos. Os tipos primitivos, assim como em vrias outras linguagens tais como o C, existem para representar os tipos mais simples de dados, sendo eles dados numrico, booleano e caractere. Os tipos primitivos da linguagem Java so:
Valores Possveis Tipos Primiti vo byte short Inteiro int long float Ponto Flutuante double -4,94E-307 Menor -128 -32768 -2.147.483.648 Maior 127 32767 2.147.483.647 Valor Padro Tamanho 0 0 0 0 0 8 bits 16 bits 32 bits 64 bits 32 bits Exemplo byte ex1 = (byte)1; short ex2 = (short)1; int ex3 = 1; long ex4 = 1l; float ex5 = 5.50f; double ex6 = 10.20d; ou double ex6 = 10.20; char ex7 = 194; ou char ex8 = 'a'; boolean ex9 = true;

-9.223.372.036.854.770.00 9.223.372.036.854.770.00 0 0 -1,4024E-37 3.40282347E + 38 1.79769313486231570E + 308

64 bits

Caractere

char

65535

\0

16 bits

Booleano

boolean

false

true

false

1 bit

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 12 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

importante lembrar que na linguagem Java, os Arrays e Strings so Classes (veremos isso mais adiante).

Tipos Inteiros (byte, short, int ou long)


Tipos inteiros trabalham apenas com nmeros inteiros, positivos ou negativos. Os valores podem ser representados nas bases octal, decimal e hexadecimal. Inteiro em octal Qualquer valor escrito utilizando nmeros de 0 a 7 comeando com 0 um valor na base octal, por exemplo: byte a = 011; short s = 010; int i = 025; // Equivale ao valor 9 em decimal. // Equivale ao valor 8 em decimal. // Equivale ao valor 21 em decimal.

Inteiro em decimal Qualquer valor escrito utilizando nmeros de 0 a 9 um valor decimal. Este o tipo de representao mais comum uma vez que utilizada no dia a dia, por exemplo: int i = 9; long b = 9871342132; Inteiro em hexadecimal Qualquer valor escrito utilizando nmeros de 0 a 9 e A a F, comeando com 0x ou 0X um valor hexadecimal, por exemplo: long a = 0xCAFE; int b = 0X14a3; // Equivale ao valor 51966 em decimal // Equivale ao valor 5283 em decimal

Quando um precisa ser especificado como um long ele pode vir acompanhado por l ou L depois do seu valor, por exemplo: long a = 0Xcafel; long b = 0752L; long c = 987654321L; Exemplo:
ExemploTipoPrimitivo.java 01 02 /** * Exemplo de utilizao dos tipos primitivos byte,

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 13 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 * short, int e long. */ public class ExemploTipoPrimitivo { public static void main(String[] args) { //Inicializando atributos primitivos com valores na base octal. byte a = 077; short b = 010; int c = 025; System.out.println(a); // Imprime 63 System.out.println(b); // Imprime 8 System.out.println(c); // Imprime 21 //Inicializando atributos primitivos com valores na base decimal. int d = 9; long e = 9871342132L; System.out.println(d); // Imprime 9 System.out.println(e); // Imprime 9871342132 //Inicializando atributos primitivos com valores na base hexadecimal. long f = 0XCAFE; long g = 0Xcafel; int h = 0X14a3; long i = 0752L; long j = 987654321L; System.out.println(f); System.out.println(g); System.out.println(h); System.out.println(i); System.out.println(j); } } // // // // // Imprime Imprime Imprime Imprime Imprime 51966 51966 5283 490 987654321

Quando executamos a classe ExemploTipoPrimitivo, temos a seguinte sada no console: C:\>javac ExemploTipoPrimitivo.java C:\>java ExemploTipoPrimitivo 63 8 21 9 Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 14 -

Programao Orientada a Objetos Universidade Metodista de So Paulo 9871342132 51966 51966 490 987654321

Tipos Ponto Flutuante (float ou double)


Tipos de ponto flutuante servem para representar nmeros com casas decimais, tanto negativos quanto positivos. Todos os nmeros com ponto flutuante so por padro do tipo double, mas possvel especificar o tipo do valor durante a criao. Para float utilize f ou F e, se quiser, pode especificar para double usando d ou D, por exemplo: float a = 10.99f; double b = 10.3D; /* Erro de compilao, pois o padro do valor double. */ floaf c = 1.99; Exemplo:
ExemploTipoPrimitivo2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 /** * Exemplo de utilizao dos tipos */ public class ExemploTipoPrimitivo2 public static void main(String[] //Definindo explicitamente que float a = 10.99f; primitivos float e double. { args) { o valor float.

//Definindo explicitamente que o valor double. double b = 10.3D; //Atribuindo o valor inteiro para um tipo double. double c = 5; /* Atribuindo um valor double, por padro todos nmeros com casas decimais so do tipo double. */ double d = 7.2; System.out.println(a); // Imprime 10.99 System.out.println(b); // Imprime 10.3

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 15 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


21 22 23 24 System.out.println(c); // Imprime 5.0 System.out.println(d); // Imprime 7.2 } }

Quando executamos a classe ExemploTipoPrimitivo2, temos a seguinte sada no console: C:\>javac ExemploTipoPrimitivo2.java C:\>java ExemploTipoPrimitivo2 10.99 10.3 5.0 7.2

Tipo Caractere (char)


O tipo caractere, como o prprio nome j diz, serve para representar um valor deste tipo. Sua inicializao permite 2 modelos: char a = 'a'; char b = 97; //Equivale a letra 'a' Os caracteres podem ser representados por nmeros e possuem o mesmo tamanho que um atributo do tipo short, dessa forma, podemos representar a tabela Unicode, por exemplo: char u = '\u0025'; //Equivale ao caracter '%' OBS: O Unicode no formato hexadecimal, portanto o exemplo anterior 0025 equivale a 37 na base decimal. Exemplo:
ExemploTipoPrimitivo3.java 01 02 03 04 05 06 07 08 09 /** * Exemplo de utilizao do tipo primitivo char. */ public class ExemploTipoPrimitivo3 { public static void main(String[] args) { //Definindo explicitamente um valor caracter. char a = 'a'; //Definindo explicitamente um valor numerico. char b = 97;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 16 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


10 11 12 13 14 15 16 17 //Definindo explicitamente um valor Unicode. char c = '\u0025'; System.out.println(a); // Imprime a System.out.println(b); // Imprime a System.out.println(c); // Imprime % } }

Quando executamos a classe ExemploTipoPrimitivo3, temos a seguinte sada no console: C:\>javac ExemploTipoPrimitivo3.java C:\>java ExemploTipoPrimitivo3 a a %

Tipo Booleano (boolean)


Tipo que representa valores lgicos true (verdadeiro) ou false (falso), por exemplo: boolean a = true; boolean b = false;

As palavras true, false e null representam valores bsicos e no podem ser utilizados na declarao de atributos, mtodos ou classes.

Casting
Na linguagem Java, possvel atribuir o valor de um tipo de varivel a outro tipo de varivel, porm, para tal, necessrio que esta operao seja apontada ao compilador. A este apontamento damos o nome de casting. possvel fazer converses de tipos de ponto flutuante para inteiros, e inclusive entre o tipo caractere, porm estas converses podem ocasionar a perda de valores, quando se molda um tipo de maior tamanho, como um double dentro de um int. O tipo de dado boolean o nico tipo primitivo que no suporta casting. Segue, abaixo, uma tabela com todos os tipos de casting possveis: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 17 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

DE \ PARA byte short char int long float double

byte byte byte byte byte byte byte

short Implcito short short short short short

char char char char char char char

int Implcito Implcito Implcito int int int

long Implcito Implcito Implcito Implcito long long

float Implcito Implcito Implcito Implcito Implcito float

double Implcito Implcito Implcito Implcito Implcito Implcito

Para fazer um casting, basta sinalizar o tipo para o qual se deseja converter entre parnteses, da seguinte forma: Converso do double 5.0 para float. float a = (float) 5.0; Converso de double para int. int b = (int) 5.1987; Converso de int para float implcito, no precisa de casting. float c = 100; Converso de char para int implcito, no precisa de casting. int d = d; O casting ocorre implicitamente quando adiciona uma varivel de um tipo menor que o tipo que receber esse valor. Exemplo:
ExemploCasting.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Exemplo de converso de tipos primitivos utilizando casting. */ public class ExemploCasting { public static void main(String[] args) { /* Casting feito implicitamente, pois o valor possui um tamanho menor que o tipo da variavel que ir recebe-lo. */ char a = 'a'; int b = 'b'; float c = 100; System.out.println(a); // Imprime a

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 18 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 System.out.println(b); // Imprime 98 System.out.println(c); // Imprime 100.0 /* Casting feito explicitamente, pois o valor possui um tamanho maior que o tipo da variavel que ir recebe-lo. */ int d = (int) 5.1987; float e = (float) 5.0; int f = (char) (a + 5); char g = (char) 110.5; System.out.println(d); System.out.println(e); System.out.println(f); System.out.println(g); } } // // // // Imprime Imprime Imprime Imprime 5 5.0 102 n

Quando executamos a classe ExemploCasting, temos a seguinte sada no console: C:\>javac ExemploCasting.java C:\>java ExemploCasting a 98 100.0 5 5.0 102 n

java.util.Scanner
Em Java, temos uma classe chamada java.util.Scanner que, neste momento, utilizaremos para receber as entradas do usurio via console, mas esta classe tambm pode ser utilizada para outros fins, tais como leitura de arquivo, por exemplo. No exemplo a seguir, utilizaremos a classe Scanner para pedir que o usurio digite sua idade, depois imprimiremos qual foi o nmero lido:
ExemploScanner.java 01 02 import java.util.Scanner;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 19 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Neste exemplo pedimos para o usurio digitar a idade dele, * depois imprimimos uma frase com a idade lida. */ public class ExemploScanner { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("Digite sua idade: "); int idade = s.nextInt(); System.out.println("Vc tem " + idade + " anos."); } }

Quando executamos a classe ExemploScanner, na linha 11 imprimimos no console a seguinte mensagem: C:\>javac ExemploScanner.java C:\>java ExemploScanner Digite sua idade: Na linha 12 o programa fica esperando o usurio digitar um nmero inteiro e em seguida apertar a tecla ENTER, para continuar a execuo: C:\>javac ExemploScanner.java C:\>java ExemploScanner Digite sua idade: 28 Vc tem 28 anos. Com o Scanner podemos ler diversos tipos de atributos, por exemplo:
ExemploScanner2.java 01 02 03 04 05 06 07 08 09 10 import java.util.Scanner; /** * Neste exemplo vamos pedir para o usurio digitar o nome e a altura dele, * depois vamos imprimir os dados lidos. */ public class ExemploScanner2 { public static void main(String[] args) { Scanner s = new Scanner(System.in);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 20 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


11 12 13 14 15 16 17 18 19 System.out.println("Digite seu nome: "); String nome = s.nextLine(); System.out.println("\nDigite sua altura: "); double altura = s.nextDouble(); System.out.println(nome + " tem " + altura + " de altura."); } }

Quando executamos a classe ExemploScanner2, temos a seguinte sada no console: C:\>javac ExemploScanner2.java C:\>java ExemploScanner2 Digite seu nome: Rafael Digite sua altura: 1,78 Rafael tem 1.78 de altura. Fazendo uma comparao com a linguagem C++, os mtodos da classe Scanner nextInt() (l um nmero inteiro), nextDouble() (l um nmero com casa decimal do tipo double), nextLine() (l um texto String), etc. podem ser comparados a funo cin, e o mtodo System.out.println() pode ser comparado a funo cout. Observao: quando queremos ler um nmero com casa decimal via console, precisamos digitar o nmero utilizando vrgula ( , ), por exemplo: 10,50. Quando criamos uma varivel dentro do programa e definimos seu valor com casa decimal, precisamos utilizar o ponto ( . ) como separador, por exemplo: 10.50.

Operadores
No Java, existem diversos tipos de operadores alm dos que conhecemos da matemtica, e estes operadores podem enquadrados nos seguintes tipos: Unrio Binrio Ternrio (Utiliza um operando) (Utilizam dois operandos) (Utilizam trs operandos)

Os operadores so utilizados a todo o momento, por exemplo, quando queremos fazer algum clculo, verificar alguma situao valores, atribuir um valor a uma varivel, etc. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 21 -

Programao Orientada a Objetos Universidade Metodista de So Paulo OBS: O operando pode ser representado por um valor ou por uma varivel.

Operadores aritmticos
Smbolo + chamado de adio, utilizado para somar o valor de dois operandos. <operando1> + <operando2> Exemplo:
OperadorAdicao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador de adio ( + ). */ public class OperadorAdicao { public static void main(String[] args) { System.out.println(3 + 7); //ou int a = 3; int b = 7; System.out.println(a + b); } }

Neste caso, ser impresso o valor 10 que o resultado da soma de 3 + 7, ou da soma da varivel a + varivel b. C:\>javac OperadorAdicao.java C:\>java OperacaoAdicao 10 10 Smbolo - chamado de subtrao, utilizado para subtrair o valor de dois operandos. <operando1> - <operando2> Exemplo:
OperadorSubtracao.java

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 22 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador de subtrao ( - ). */ public class OperadorSubtracao { public static void main(String[] args) { System.out.println(5 - 2); //ou int a = 5; int b = 2; System.out.println(a - b); } }

Neste caso, ser impresso o valor 3 que o resultado da subtrao de 5 2, ou da subtrao da varivel a varivel b. C:\>javac OperadorSubtracao.java C:\>java OperadorSubtracao 3 3 Smbolo * chamado de multiplicao, utilizado para multiplicar o valor de dois operandos. <operando1> * <operando2> Exemplo:
OperadorMultiplicacao.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador de multiplicao ( * ). */ public class OperadorMultiplicacao { public static void main(String[] args) { System.out.println(3 * 2); //ou int a = 3; int b = 2; System.out.println(a * b);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 23 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


13 14 } }

Neste caso, ser impresso o valor 6 que o resultado da multiplicao de 3 * 2, ou da multiplicao da varivel a * varivel b. C:\>javac OperadorMultiplicacao.java C:\>java OperadorMultiplicacao 6 6 Smbolo / chamado de diviso, utilizado para dividir o valor de dois operandos. <operando1> / <operando2> O resultado da diviso de dois operandos inteiros retorna um valor inteiro, e a diviso que tem pelo menos um operando com casas decimais retorna um valor com casas decimais. Exemplo:
OperadorDivisao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador de diviso ( / ). */ public class OperadorDivisao { public static void main(String[] args) { System.out.println(3.0 / 2); //ou int a = 3; int b = 2; System.out.println(a / b); } }

Neste caso, ser impresso o valor 1.5 que o resultado da diviso de 3.0 / 2, pois o operando 3.0 do tipo double. Depois ser impresso o valor 1 que o resultado da diviso da varivel a / varivel b, note que neste caso ambos so inteiros ento o resultado da diviso um valor inteiro.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 24 -

Programao Orientada a Objetos Universidade Metodista de So Paulo C:\>javac OperadorDivisao.java C:\>java OperadorDivisao 1.5 1 Smbolo % chamado de mdulo, utilizado para saber qual o resto da diviso de dois operandos. <operando1> % <operando2> O resto da diviso de dois operandos inteiros retorna um valor inteiro, e o resto da diviso que tem pelo menos um operando com casas decimais retorna um valor com casas decimais. Exemplo:
OperadorModulo.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador de modulo ( % ). */ public class OperadorModulo { public static void main(String[] args) { System.out.println(4.5 % 2); //ou int a = 5; int b = 3; System.out.println(a % b); } }

Neste caso, ser impresso o valor 0.5 que o resto da diviso de 4.5 / 2, note que neste caso um operando possui casa decimal. Depois ser impresso o valor 2 que o resto da diviso da varivel a / varivel b, note que neste caso ambos so inteiros ento o resultado da diviso um valor inteiro. C:\>javac OperadorModulo.java C:\>java OperadorModulo 0.5 2

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 25 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Operadores de atribuio
Smbolo = chamado de atribuio, utilizado para atribuir o valor de um operando a uma varivel: <varivel> = <operando> Exemplo:
OperadorAtribuicao.java 01 02 03 04 05 06 07 08 09 10 11 /** * Classe utilizada para demonstrar o uso do operador de atribuio ( = ). */ public class OperadorAtribuicao { public static void main(String[] args) { int x; x = 25; System.out.println(x); } }

Neste caso, a varivel x possui agora o valor 25. C:\>javac OperadorAtribuicao.java C:\>java OperadorAtribuicao 25 A operao de atribuio tambm pode receber como operando o resultado de outra operao, por exemplo:
OperadorAtribuicao2.java 01 02 03 04 05 06 07 08 09 /** * Classe utilizada para demonstrar o uso do operador de atribuio ( = ). */ public class OperadorAtribuicao2 { public static void main(String[] args) { int x; x = 4 % 2; System.out.println(x);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 26 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


10 11 } }

Neste caso, a varivel x possui o valor 0 que o resto da diviso de 4 por 2. C:\>javac OperadorAtribuicao2.java C:\>java OperadorAtribuicao 0 Juntando atribuio + operao Smbolo += utilizado para atribuir a uma varivel o valor desta varivel somada ao valor de um operando. <varivel> += <operando> Exemplo:
OperadorAtribuicaoAdicao.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de adio ( += ). */ public class OperadorAtribuicaoAdicao { public static void main(String[] args) { int x = 4; x += 2; System.out.println(x); } }

Neste caso, a varivel x comea com o valor 4, depois a varivel x recebe o valor dela somado ao valor 2, portanto a varivel x fica com o valor 6. C:\>javac OperadorAtribuicaoAdicao.java C:\>java OperadorAtribuicaoAdicao 6 Smbolo -= utilizado para atribuir a uma varivel o valor desta varivel subtraindo o valor de um operando. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 27 -

Programao Orientada a Objetos Universidade Metodista de So Paulo <varivel> - = <operando> Exemplo:


OperadorAtribuicaoSubtracao.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de subtrao ( -= ). */ public class OperadorAtribuicaoSubtracao { public static void main(String[] args) { int x = 4; x -= 2; System.out.println(x); } }

Neste caso, a varivel x comea com o valor 4, depois a varivel x recebe o valor dela subtrado pelo valor 2, portanto a varivel x fica com o valor 2. C:\>javac OperadorAtribuicaoSubtracao.java C:\>java OperadorAtribuicaoSubtracao 2 Smbolo *= utilizado para atribuir a uma varivel o valor desta varivel multiplicado o valor de um operando. <varivel> *= <operando> Exemplo:
OperadorAtribuicaoMultiplicacao.java 01 02 03 04 05 06 07 08 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de multiplicao ( *= ). */ public class OperadorAtribuicaoMultiplicacao { public static void main(String[] args) { int x = 3; x *= 5;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 28 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


09 10 11 12

System.out.println(x); } }

Neste caso, a varivel x comea com o valor 3, depois a varivel x recebe o valor dela multiplicado pelo valor 5, portanto a varivel x fica com o valor 15. C:\>javac OperadorAtribuicaoMultiplicacao.java C:\>java OperadorAtribuicaoMultiplicacao 15 Smbolo /= utilizado para atribuir a uma varivel o valor desta varivel dividido pelo valor de um operando. <varivel> /= <operando> Exemplo:
OperadorAtribuicaoDivisao.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de diviso ( /= ). */ public class OperadorAtribuicaoDivisao { public static void main(String[] args) { int x = 4; x /= 3; System.out.println(x); } }

Neste caso, a varivel x comea com o valor 4, depois a varivel x recebe o valor dela dividido pelo valor 3, portanto a varivel x fica com o valor 1. C:\>javac OperadorAtribuicaoDivisao.java C:\>java OperadorAtribuicaoDivisao 1 Quando usamos o operador /= utilizando uma varivel inteira e um operando de casa decimal, ento a diviso retorna um valor inteiro. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 29 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Caso utilize uma varivel de ponto flutuante, ento a diviso retorna um valor com casa decimal, por exemplo:
OperadorAtribuicaoDivisao2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de diviso ( /= ). */ public class OperadorAtribuicaoDivisao2 { public static void main(String[] args) { int x = 4; x /= 3.0; System.out.println(x); float y = 4; y /= 3.0; System.out.println(y); } }

Neste caso, a varivel x ter o valor 1 impresso e a varivel y ter o valor 1.3333334 impresso. C:\>javac OperadorAtribuicaoDivisao2.java C:\>java OperadorAtribuicaoDivisao2 1 1.3333334 Smbolo %= utilizado para atribuir a uma varivel, o valor do resto da diviso desta varivel por um operando. <varivel> %= <operando> Exemplo:
OperadorAtribuicaoModulo.java 01 02 03 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de modulo ( %= ).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 30 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


04 05 06 07 08 09 10 11 12 */ public class OperadorAtribuicaoModulo { public static void main(String[] args) { int x = 4; x %= 3; System.out.println(x); } }

Neste caso, a varivel x comea com o valor 4, depois a varivel x recebe o resto da diviso dela pelo valor 3, portanto a varivel x fica com o valor 1. C:\>javac OperadorAtribuicaoModulo.java C:\>java OperadorAtribuicaoModulo 1 Quando usamos o operador %= utilizando uma varivel inteira e um operando de casa decimal, ento o resto da diviso retorna um valor inteiro. Caso utilize uma varivel de ponto flutuante, ento o resto da diviso retorna um valor com casa decimal, por exemplo:
OperadorAtribuicaoDivisao2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 /** * Classe utilizada para demonstrar o uso do operador de atribuio * junto com o operador de modulo ( %= ). */ public class OperadorAtribuicaoModulo2 { public static void main(String[] args) { int x = 4; x %= 3.0; System.out.println(x); float y = 4; y %= 3.33; System.out.println(y); } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 31 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste caso, a varivel x ter o valor 1 impresso e a varivel y ter o valor 0.67 impresso. C:\>javac OperadorAtribuicaoModulo2.java C:\>java OperadorAtribuicaoModulo2 1 0.67

Operadores unrios
Smbolo ++ utilizado para incrementar em 1 o valor de uma varivel, podendo ser feita das seguintes formas: Primeiro incrementa a varivel depois devolve seu valor. ! ++ <varivel> Primeiro devolve o valor da varivel depois incrementa seu valor. <varivel> ++ Exemplo:
OperadorIncremento.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 /** * Classe utilizada para demonstrar o uso do operador de * incremento ( ++ ). */ public class OperadorIncremento { public static void main(String[] args) { int a = 1; int b = 1; System.out.println(++a); System.out.println(b++); System.out.println(a); System.out.println(b); } }

Neste caso a varivel a e varivel b so inicializadas com 1, mas quando impresso o valor da varivel a imprime 2 enquanto que o valor da varivel b imprime 1, e na segunda vez que impresso ambas variveis a e b possuem o valor 2.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 32 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

C:\>javac OperadorIncremento.java C:\>java OperadorIncremento 2 1 2 2 Smbolo -- utilizado para decrementar em 1 o valor de uma varivel, podendo ser feita das seguintes formas: Primeiro decrementa o valor da varivel, depois devolve seu valor. -- <varivel> Primeiro devolve o valor da varivel, depois ela decrementada. <varivel> -Exemplo:
OperadorDecremento.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 /** * Classe utilizada para demonstrar o uso do operador de * decremento ( -- ). */ public class OperadorDecremento { public static void main(String[] args) { int a = 1; int b = 1; System.out.println(--a); System.out.println(b--); System.out.println(a); System.out.println(b); } }

Neste caso a varivel a e varivel b so inicializadas com 1, mas quando impresso o valor da varivel a imprime 0 enquanto que o valor da varivel b imprime 1, e na segunda vez que impresso ambas variveis a e b possuem o valor 0. C:\>javac OperadorDecremento.java Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 33 -

Programao Orientada a Objetos Universidade Metodista de So Paulo C:\>java OperadorDecremento 0 1 0 0

Operadores lgicos
Os operadores lgicos aceitam apenas operando do tipo boolean. Smbolo && chamado de E. Este operador retorna true somente se os dois operandos forem true. <operando1> && <operando2> Se o valor do operando1 for false, ento o operador && no verifica o valor do operador2, pois sabe que o resultado j false. Tabela verdade:
Operando 1 true true false false Operando 2 true false true false Resultado true false false false

Exemplo:
OperadorLogicoE.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador logico E ( && ). */ public class OperadorLogicoE { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = true; System.out.println(a && b); System.out.println(a && c); }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 34 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


13 }

Neste caso ser impresso false, pois a varivel a true e a varivel b false, depois ser impresso true, pois ambas variveis a e c so true. C:\>javac OperadorLogicoE.java C:\>java OperadorLogicoE false true Smbolo || chamado de OU. Este operando retorna true caso tenha pelo menos um operando com o valor true. <operando1> || <operando2> Se o valor do operando1 for true, ento o operador || no verifica o valor do operando2, pois j sabe que o resultado true. Tabela verdade:
Operando 1 true true false false Operando 2 true false true false Resultado true true true false

Exemplo:
OperadorLogicoOU.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador logico OU ( || ). */ public class OperadorLogicoOU { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = false; System.out.println(a || b); System.out.println(b || c); }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 35 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


13 }

Neste caso, ser impresso primeiro true, pois a varivel a tem o valor true, depois ser impresso false, pois as variveis b e c so false. C:\>javac OperadorLogicoOU.java C:\>java OperadorLogicoOU true false Smbolo ! chamado de negao. Este operador retorna true se o operando tem o valor false, e retorna false se o operando o valor true. ! <operando> Tabela verdade:
Operando false true Resultado true false

Exemplo:
OperadorLogicoNegacao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 /** * Classe utilizada para demonstrar o uso do operador logico negao ( ! ). */ public class OperadorLogicoNegacao { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = false; System.out.println(!a); System.out.println(!(b || c)); } }

Neste caso, primeiro ser impresso false, que a negao de true, depois ser impresso true, que a negao do resultado de b || c que false.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 36 -

Programao Orientada a Objetos Universidade Metodista de So Paulo C:\>javac OperadorLogicoNegacao.java C:\>javac OperadorLogicoNegacao false true

Operadores relacionais
Os resultados dos operadores relacionais so do tipo boolean. Smbolo > chamado de maior que. <operando1> > <operando2> Retorna true se o valor do operando1 for maior que o valor do operando2, caso contrrio retorna false. Exemplo:
OperadorMaiorQue.java 01 02 03 04 05 06 07 08 09 10 11 /** * Classe utilizada para demonstrar o uso do operador * relacional maior que ( > ). */ public class OperadorMaiorQue { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a > b); } }

Neste caso, ser impresso true, pois o valor da varivel a maior que o valor da varivel b. C:\>javac OperadorMaiorQue.java C:\>java OperadorMaiorQue true Smbolo < chamado de menor que. <operando1> < <operando2> Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 37 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Retorna true se o valor do operando1 for menor que o valor do operando2, caso contrrio retorna false. Exemplo:
OperadorMenorQue.java 01 02 03 04 05 06 07 08 09 10 11 /** * Classe utilizada para demonstrar o uso do operador * relacional menor que ( < ). */ public class OperadorMenorQue { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a < b); } }

Neste caso, ser impresso false, pois o valor da varivel a no menor que o valor da varivel b. C:\>javac OperadorMenorQue.java C:\>java OperadorMenorQue false Smbolo == chamado de igualdade. <operando1> == <operando2> Retorna true se o valor do operando1 for igual ao valor do operando2, caso contrrio retorna false. Exemplo:
OperadorIgualdade.java 01 02 03 04 05 06 /** * Classe utilizada para demonstrar o uso do operador * relacional de igualdade ( == ). */ public class OperadorIgualdade { public static void main(String[] args) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 38 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


07 08 09 10 11 int a = 3; int b = 3; System.out.println(a == b); } }

Neste caso, ser impresso true, pois o valor da varivel a igual ao valor da varivel b. C:\>javac OperadorIgualdade.java C:\>java OperadorIgualdade true Smbolo >= chamado de maior ou igual que. <operando1> >= <operando2> Retorna true se o valor do operando1 for maior ou igual que o valor do operando2, caso contrrio retorna false. Exemplo:
OperadorMaiorIgualQue.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador * relacional maior ou igual que ( >= ). */ public class OperadorMaiorIgualQue { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a >= b); int c = 5; System.out.println(a >= c); } }

Neste caso, ser impresso true, pois o valor da varivel a maior que valor da varivel b e depois ser impresso true novamente, pois o valor da varivel a igual ao valor da varivel c. C:\>javac OperadorMaiorIgualQue.java Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 39 -

Programao Orientada a Objetos Universidade Metodista de So Paulo C:\>java OperadorMaiorIgualQue true true Smbolo <= chamado de menor ou igual que. <operando1> <= <operando2> Retorna true se o valor do operando1 for menor ou igual que o valor do operando2, caso contrrio retorna false. Exemplo:
OperadorMenorIgualQue.java 01 02 03 04 05 06 07 08 09 10 11 /** * Classe utilizada para demonstrar o uso do operador * relacional menor ou igual que ( <= ). */ public class OperadorMenorIgualQue { public static void main(String[] args) { int a = 5; int b = 5; System.out.println(a <= b); } }

Neste caso, ser impresso true, pois o valor da varivel a menor ou igual ao valor da varivel b. C:\>javac OperadorMenorIgualQue.java C:\>java OperadorMenorIgualQue true Smbolo != chamado de diferente. <operando1> != <operando2> Retorna true se o valor do operando1 for diferente do valor do operando2, caso contrrio retorna false. Exemplo:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 40 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


OperadorDiferente.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador * relacional diferente ( != ). */ public class OperadorDiferente { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a != b); int c = 3; System.out.println(b != c); } }

Neste caso, ser impresso true, pois o valor da varivel a diferente do valor da varivel b e depois ser impresso false, pois o valor da varivel b igual ao valor da varivel c. C:\>javac OperadorDiferente.java C:\>java OperadorDiferente true false

Operador condicional
O operador condicional do tipo ternrio, pois envolve trs operandos. Smbolo ? : utilizado para fazer uma condio if / else de forma simplificada. <operando1> ? <operando2> : <operando3> Se o valor do operando1 for true, ento o resultado da condicional o operando2, se o valor do operando1 for false, ento o resultado da condicional o operando3. Exemplo:
OperadorCondicional.java 01 02 03 04 /** * Classe utilizada para demonstrar o uso do operador * condicional ( condicao ? verdade : falso ). */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 41 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


05 06 07 08 09 10 11 public class OperadorCondicional { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a != b ? "diferente" : "igual"); } }

Neste caso, a condio a != b retorna true, ento impresso o valor diferente, se o resultado fosse false, ento seria impresso o valor igual. C:\>javac OperadorCondicional.java C:\>java OperadorCondicional diferente

Operadores bit a bit


Estes operadores so chamados de bit a bit, porque os operando so comparados no nvel dos seus bits. Smbolo & chamado de E bit a bit. <operando1> & <operando2> Para este operador no importa se algum dos operando tem o valor false, ele vai verificar todos os operandos que houver na expresso. Exemplo:
OperadorBitBitE.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador * bit a bit E ( & ). */ public class OperadorBitBitE { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = true; boolean d = true; System.out.println(a & b & c & d);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 42 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


13 14 } }

Neste caso, ser impresso o valor false, e o operador & ira comparar o valor de todas variveis. C:\>javac OperadorBitBitE.java C:\>java OperadorBitBitE false Se usarmos valores inteiros, ele ir comparar cada bit, por exemplo:
OperadorBitBitE2.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador * bit a bit E ( & ). */ public class OperadorBitBitE2 { public static void main(String[] args) { short a = 30; short b = 7; System.out.println(a & b); } }

Neste caso, ser impresso o valor 6, porque o operador & vai comparar cada bit na base binria e depois a mesma convertida para a base decimal. C:\>javac OperadorBitBitE2.java C:\>java OperadorBitBitE2 6 Lembrando que um short tem 16bits.

Varivel a tem o valor 30. 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0

Varivel b tem o valor 7.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 43 -

Programao Orientada a Objetos Universidade Metodista de So Paulo 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

Resultado tem o valor 6. 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0

Tabela verdade:
Operando1 1 1 0 0 Operando2 1 0 1 0 Resultado 1 0 0 0

Smbolo | chamado de OU bit a bit. <operando1> | <operando2> Para este operador no importa se algum dos operando tem o valor true, ele vai verificar todos os operando que tiver na expresso. Exemplo:
OperadorBitBitOU.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso do operador * bit a bit OU ( | ). */ public class OperadorBitBitOU { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = false; boolean d = false; System.out.println(a | b | c | d); } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 44 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste caso, o valor impresso ser true, e o operador | ira comparar o valor de todas variveis. C:\>javac OperadorBitBitOU.java C:\>java OperadorBitBitOU true Se usarmos valores inteiros, ele ir comparar cada bit, por exemplo:
OperadorBitBitOU2.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador * bit a bit OU ( | ). */ public class OperadorBitBitOU2 { public static void main(String[] args) { short a = 30; short b = 7; System.out.println(a | b); } }

Neste caso, ser impresso o valor 31, porque o operador | vai comparar cada bit na base binria e depois a mesma convertida para a base decimal. C:\>javac OperadorBitBitOU2.java C:\>java OperadorBitBitOU2 31 Lembrando que um short tem 16bits.

Varivel a tem o valor 30. 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0

Varivel b tem o valor 7. 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

Resultado tem o valor 31.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 45 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Tabela verdade:
Operando1 1 1 0 0 Operando2 1 0 1 0 Resultado 1 1 1 0

Smbolo ^ chamado de OU EXCLUSIVO bit a bit. <operando1> ^ <operando2> Se usarmos valores inteiros, por exemplo ele ira comparar cada bit, por exemplo:
OperadorBitBitOUExclusivo.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar o uso do operador * bit a bit OU EXCLUSIVO ( ^ ). */ public class OperadorBitBitOUExclusivo { public static void main(String[] args) { short a = 30; short b = 7; System.out.println(a ^ b); } }

Neste caso, ser impresso o valor 25, porque o operador ^ vai comparar cada bit na base binria e depois a mesma convertida para a base decimal. C:\>javac OperadorBitBitOUExclusive.java C:\>java OperadorBitBitOUExclusive 25 Lembrando que um short tem 16bits.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 46 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Varivel a tem o valor 30. 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0

Varivel b tem o valor 7. 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

Resultado tem o valor 25. 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

Tabela verdade:
Operando1 1 1 0 0 Operando2 1 0 1 0 Resultado 0 1 1 0

Exerccios
1) Qual resultado ser impresso: a)
public class Main { public static void main(String[] args) { int a = 3; int b = 4; int c = 7; } System.out.println((a+b) / c);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 47 -

Programao Orientada a Objetos Universidade Metodista de So Paulo b)


public class Main { public static void main(String[] args) { int a = 3; int b = 4; int c = 7; } System.out.println(!((a > b) && (a < c)));

c)
public class Main { public static void main(String[] args) { int a = 3; int b = 4; int c = 7; if(a++ >= b) System.out.println(--c); else System.out.println(c++);

d)
public class Main { public static void main(String[] args) { int a = 3; } System.out.println(a % 2 == 0 ? ++a : a++);

e)
public class Main { public static void main(String[] args) { int a = 178; int b = 131; int c = 33; } System.out.println(a & b | c);

2) O que acontece se tentarmos compilar e executar o seguinte cdigo?


1 class Teste { 2 public static void main(String args) { 3 System.out.println(args);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 48 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


4 5 } }

a) No imprime nada. b) Erro de compilao na linha 2 c) Imprime o valor de args d) Exceo na thread "main" java.lang.NoSuchMethodError: main e) Erro em tempo de execuo. 3) O que acontece se tentarmos compilar e executar o seguinte cdigo?
1 class Soma{ 2 int x, y, z; 3 public static void main (String[] args) { 4 System.out.println(x + y + z); 5 } 6 }

a) No imprime nada b) Imprime: null c) Imprime: 0 d) Erro de compilao e) Erro em tempo de execuo 4) O que acontece se tentarmos compilar e executar o seguinte cdigo?
1 class Teste { 2 public static void main(String[] args) { 3 char a = 'a'; // 'a' = 97 4 char b = 'b'; // 'b' = 98 5 6 System.out.println(a + b + "" + b + a); 7 } 8 }

a) abba b) 97989897 c) 195ba d) ab195 e) 390 f) Erro de Compilao g) Erro em tempo de execuo

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 49 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

3. Estruturas de controle e repetio

Estruturas de Controle if / else


A estrutura de controle if (se), utilizada para executar alguns comandos apenas se a sua condio for true (verdadeira). O else (seno) pode ou no acompanhar o if, mas o else no pode ser usado sozinho, e utilizado para executar alguns comandos caso a condio do if for false (falso). Na linguagem Java, esta estrutura pode ser utilizada de diversas maneiras, conforme listadas abaixo. - Com execuo de um bloco de instrues, apenas caso a condio seja atendida: if(condio) { // Comandos executados caso a condio verdadeira } - Com execuo de um bloco de instrues, caso a condio seja atendida, e com um fluxo alternativo para os casos de condio no atendida: if(condio) { // Comandos executados caso a condio verdadeira. } else { // Comandos executados caso a condio falsa. } - Com mltiplas condies: if(condio 1) { // Comandos executados caso a condio 1 verdadeira. } else if(condio 2) { // Comandos executados caso a condio 2 verdadeira. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 50 -

Programao Orientada a Objetos Universidade Metodista de So Paulo } else if(condio 3) { // Comandos executados caso a condio 3 verdadeira. } else { // Comandos executados caso nenhuma das condies for verdadeira. } No exemplo a seguir, verificamos se o valor da varivel idade maior ou igual que 18, caso a condio seja verdadeira ento entra no bloco do if, caso contrrio entra no bloco do else.
ExemploIf.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Exemplo de estrutura de controle IF. */ public class ExemploIf { public static void main(String[] args) { int idade = 15; if(idade >= 18) { System.out.println("Permisso para dirigir"); } else { System.out.println("Idade minima para dirigir eh 18 anos."); } } }

Quando executarmos a classe ExemploIf, temos a seguinte sada no console: C:\>javac ExemploIf.java C:\>java ExemploIf Idade minima para dirigir eh 18 anos. Dentro de um bloco { } do if / else pode ser utilizado outras variveis declaradas no mtodo ou declarados dentro do bloco, mas estas variveis podem apenas ser utilizadas dentro deste prprio bloco, por exemplo:
ExemploIf2.java 01 02 03 04 05 06 /** * Exemplo de estrutura de controle IF. */ public class ExemploIf2 { public static void main(String[] args) { int valor = 10;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 51 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


07 08 09 10 11 12 13 14 15 16

if(valor > 9) { int xpto = 10; } else { xpto = 11; // Erro de compilao. } xpto = 12; // Erro de compilao. } }

Se tentarmos compilar a classe ExemploIf2, teremos os seguintes erros: C:\>javac ExemploIf2.java ExemploIf2.java:11: cannot find symbol symbol : variable xpto location: class ExemploIf2 xpto = 11; ^ ExemploIf2.java:14: cannot find symbol symbol : variable xpto location: class ExemploIf2 xpto = 12; ^ 2 errors Neste caso criado uma varivel chamada xpto dentro do bloco do if, ento esta varivel pode ser utilizada somente dentro do if, no pode ser usada no else e nem fora do bloco. Observao: este conceito de variveis criadas dentro de blocos { }, funciona para todos os blocos.

switch
O switch uma estrutura de seleo semelhante ao if com mltiplas selees. uma estrutura muito fcil de utilizar e apresenta uma tima legibilidade, porem trabalha apenas com valores constantes dos tipos primrios byte, short, int e char. Tambm pode ser utilizado com enumerations (veremos mais adiante). possvel ainda se enumerar n possveis blocos de instruo. Sua utilizao deve ser feita da seguinte maneira:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 52 -

Programao Orientada a Objetos Universidade Metodista de So Paulo switch( varivel ) { " case <possvel valor da constante> : " " < instrues> " " break; " " " " " " } case <possvel valor da constante> : " < instrues> " break; default: < instrues> " break;

Cada case um caso no qual os comandos dentro dele so executados se o valor dele for o mesmo que a varivel recebida no switch. importante lembrar que a utilizao do comando break facultativa, porem indispensvel caso se queira que apenas aquele bloco seja executado e no todos os demais abaixo dele. O bloco de comandos default representa uma condio geral de execuo caso nenhuma das anteriores tenha sido atendida, sendo a sua utilizao tambm opcional. Segue um exemplo de utilizao do comando switch:
ExemploSwitch.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 /** * Exemplo de estrutura de seleo SWITCH */ public class ExemploSwitch { public static void main(String[] args) { char nota = 'D'; switch(nota) { case 'A': System.out.println("Aluno aprovado. Conceito excelente!"); break; case 'B': System.out.println("Aluno aprovado. Conceito bom!"); break; case 'C': System.out.println("Aluno aprovado. Conceito medio!"); break; default:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 53 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


19 20 21 22 23 System.out.println("Aluno reprovado!"); break; } } }

Neste caso, ser impressa a mensagem Aluno reprovado !, pois nenhum dos cases foi atendido, ento a estrutura default foi executada. C:\>javac ExemploSwitch.java C:\>java ExemploSwitch Aluno reprovado!

Estruturas de repetio
As estruturas de repetio permitem especificar um bloco de instrues que ser executado tantas vezes, quantas especificadas pelo desenvolvedor.

while
A estrutura while executa um bloco de instrues enquanto uma determinada condio for verdadeira (true). while(condio) { " " < instrues > } Exemplo:
ExemploWhile.java 01 02 03 04 05 06 07 08 09 10 11 /** * Exemplo de estrutura de repetio WHILE. */ public class ExemploWhile { public static void main(String[] args) { int i = 0; while(i < 10) { System.out.println(++i); } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 54 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


12 }

Neste caso, sero impressos os valores de 1 a 10, e depois quando a varivel i possuir o valor 11 a condio do while ser falso (false) e sua estrutura no mais executada. C:\>javac ExemploWhile.java C:\>java ExemploWhile 1 2 3 4 5 6 7 8 9 10

do / while
A estrutura do / while tem seu bloco de instrues executados pelo menos uma vez, ento se a condio ao final das instrues for true, o bloco de instrues executado novamente. do { < instrues > } while(condio); Exemplo:
ExemploDoWhile.java 01 02 03 04 05 06 07 08 09 10 11 import java.util.Scanner; /** * Exemplo de estrutura de repetio DO / WHILE. */ public class ExemploDoWhile { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); int opcao = 0;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 55 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


12 13 14 15 16 17 18 19 20 21 do { System.out.println("Escolha uma opcao:"); System.out.println("1 - Iniciar jogo"); System.out.println("2 - Ajuda"); System.out.println("3 - Sair"); System.out.println("OPCAO: "); opcao = entrada.nextInt(); } while (opcao != 3); } }

Neste caso, ser pedido ao usurio digitar um nmero, e enquanto o nmero digitado for diferente de 3, o bloco ser executado novamente. C:\>javac ExemploDoWhile.java C:\>java ExemploDoWhile Escolha uma opcao: 1 - Iniciar jogo 2 - Ajuda 3 - Sair OPCAO: 1 Escolha uma opcao: 1 - Iniciar jogo 2 - Ajuda 3 - Sair OPCAO: 3

for
As estruturas de repetio permitem especificar um bloco de instrues que ser executado tantas vezes quanto forem especificadas pelo desenvolvedor. A estrutura de repetio for, trabalha da mesma forma da condio while, porm de maneira muito mais prtica quando falamos de uma estrutura de repetio gerenciada por contador. O for mostra-se muito mais eficiente neste ponto, pois em uma nica linha de instruo possvel se declarar o contador, a condio de execuo e a forma de incrementar o contador. A estrutura for funciona da seguinte maneira:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 56 -

Programao Orientada a Objetos Universidade Metodista de So Paulo for(<inicializao>; <condio de execuo>; <ps-instrues>) { " " << instrues >> } Utilizamos a rea inicializao para criar variveis ou atribuir valores para variveis j declaradas, mas todas as variveis precisam ser do mesmo tipo. Esta rea executada antes de comear a estrutura de repetio do for. Utilizamos a rea condio de execuo para definir a lgica de parada da estrutura de repetio for. Utilizamos a rea ps-instrues para executar alguma ao que deve ocorrer cada vez que as instrues dentro do for forem executadas, por exemplo:
ExemploFor.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Exemplo de estrutura de repetio FOR. */ public class ExemploFor { public static void main(String[] args) { for(int i = 0; i <= 10; i++ ) { if(i % 2 == 0) { System.out.println(i + " e um numero par."); } else { System.out.println(i + " e um numero impar."); } } } }

Neste caso, ser impresso o valor da varivel i e informando se este valor par ou impar. C:\>javac ExemploFor.java C:\>java ExemploFor 0 e um numero par. 1 e um numero impar. 2 e um numero par. 3 e um numero impar. 4 e um numero par. 5 e um numero impar. 6 e um numero par. 7 e um numero impar. 8 e um numero par. 9 e um numero impar. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 57 -

Programao Orientada a Objetos Universidade Metodista de So Paulo 10 e um numero par. No exemplo a seguir, vamos criar duas variveis i e j na rea de inicializao e, na rea de ps-instruo, vamos incrementar a varivel i e decrementar a varivel j.
ExemploFor2.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Exemplo de estrutura de repetio FOR. */ public class ExemploFor2 { public static void main(String[] args) { for(int i = 0, j = 10; i <= 10; i++, j--) { if(i == j) { System.out.println("i " + i + " eh igual a j " + j); } } } }

Quando executarmos a classe ExemploFor2, teremos a seguinte sada no console: C:\>javac ExemploFor2.java C:\>java ExemploFor2 i 5 eh igual a j 5

Enhanced for ou for-each


Muitas vezes o for utilizado para percorrer um array ou uma coleo de objetos, para facilitar seu uso foi adicionado na verso 5 do Java o enhanced for. for(<Tipo> <identificador> : <expresso>) { <instrues> } Exemplo:
ExemploFor.java 01 02 03 04 import java.util.ArrayList; import java.util.List; /**

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 58 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 * Exemplo de estrutura de repetio For Each. */ public class ExemploForEach { public static void main(String[] args) { String[] nomes = {"Altrano", "Beltrano", "Ciclano", "Deltrano"}; //Percorre um array. for(String nome : nomes) { System.out.println(nome); } List<Integer> valores = new ArrayList<Integer>(); valores.add(100); valores.add(322); valores.add(57); //Percorre uma coleo. for(Integer numero : valores) { System.out.println(numero); } } }

Neste caso, o primeiro enhanced for vai percorrer um array de Strings e imprimir os valores Altrano, Beltrano, Celtrano e Deltrano. Depois ira percorrer uma lista de inteiros imprimindo os valores 100, 322 e 57. C:\>javac ExemploForEach.java C:\>java ExemploForEach Altrano Beltrano Ciclano Deltrano 100 322 57

A instruo break
O comando break uma instruo de interrupo imediata de qualquer lao, seja ele qual for, independente de sua condio de parada ter sido atendida.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 59 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Vamos ao exemplo:


ExemploBreak.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 import java.util.Scanner; /** * Exemplo de uso da palavra-chave break. */ public class ExemploBreak { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.println("Digite um numero de 1 a 9 exceto o 5: "); int numero = entrada.nextInt(); System.out.println("Contando de 1 ate o numero que voce digitou"); for(int cont = 0; cont <= numero; cont++) { if(numero == 5 || numero < 1 || numero > 9) { System.out.println("Um numero proibido foi digitado!"); break; } System.out.print(cont + " "); } } }

Observe que, segundo o condicional da linha 13, caso um nmero invlido seja digitado o lao FOR iniciado na linha 12 ser abortado imediatamente devido a instruo break existente na linha 15. Uma vez executado o cdigo acima, a seguinte sada ser projetada caso o usurio digite o nmero 5: C:\>javac ExemploBreak.java C:\>java ExemploBreak Digite um numero de 1 a 9 exceto o 5 : 5 Contando de 1 ate o numero que voce digitou... Um numero proibido foi digitado!

A instruo continue
O comando continue tem um comportamento semelhante ao break, porm no interrompe completamente a execuo do lao. Este comando pode ser utilizado com qualquer lao, porm ao invs de interromper a execuo completa do lao, ele faz com que o lao salte para sua prxima iterao, por exemplo: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 60 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

ExemploContinue.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 import java.util.Scanner; /** * Exemplo de uso da palavra-chave continue. */ public class ExemploContinue { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.println("Digite um numero de 1 a 9 exceto o 5: "); int numero = entrada.nextInt(); System.out.println("Contando de 1 ate o numero que voce digitou"); for(int cont = 0; cont <= numero; cont++) { if(cont == 5) { System.out.println("# PULANDO O 5 #"); continue; } System.out.print(cont + " "); } } }

Note que o cdigo acima bem semelhante ao anterior, porm observe que desta vez, ao invs de interromper o lao caso o usurio digite o nmero 5 ele ir contar de 1 at o nmero digitado pelo usurio. Caso ele passe pelo nmero 5, conforme o condicional da linha 13, ele ir imprimir em tela a mensagem da linha 14 e saltar o restante do cdigo e retornar ao incio do lao na linha 12. C:\>javac ExemploContinue.java C:\>java ExemploContinue Digite um numero de 1 a 9: (desta vez saltaremos o 5) 8 Contando de 1 ate o numero que voce digitou... 0 1 2 3 4 # PULANDO O 5 # 6 7 8

Exerccios
1) Escreva um programa que leia um nmero positivo inteiro e imprimir a quantidade de dgitos que este nmero possui, por exemplo:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 61 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Nmero: 13 Dgitos: 2 Nmero: 321 Dgitos: 3 2) Escreva um programa que leia um numero positivo inteiro entre 1 e 99999999999, depois este nmero deve ser decomposto e seus dgitos devem ser somado, de forma que enquanto o nmero tiver mais que um digito ele deve continuar sendo decomposto, por exemplo: Nmero: 59765123 Decompondo: 5 + 9 + 7 + 6 + 5 + 1 + 2 + 3 Soma dos nmeros: 38 Decompondo: 3 + 8 Soma dos nmeros: 11 Decompondo: 1 + 1 Soma dos nmeros: 2 3) Escreva um programa que leia um nmero positivo inteiro na base 10 e imprima seu valor na base 2, por exemplo: Base10: 123 Base2: 01111011 4) Escreva um programa que leia um nmero positivo inteiro e calcule o valor do Fibonacci desse numero. Sequncia de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... 5) Escreva um programa que leia 10 nmeros positivos inteiros entre 1 e 20 e armazene seus valores em um vetor. Depois informe qual o menor nmero e qual o maior nmero e a quantidade de vezes que o menor e o maior nmero aparecem no vetor. 6) Qual a sada da compilao e execuo da classe abaixo:
public class Teste { public static void main(String[] args) { int num = 2; switch(num) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 62 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


1: 2: 3: 4: System.out.println(1); System.out.println(2); System.out.println(3);

} a) b) c) d)

System.out.println(4); break; default: System.out.println(default);

Imprime Imprime Imprime Erro de

2 234 234default compilao

7) Durante uma partida de golfe surgiu a duvida para saber qua a velocidade em metros por segundo que um bolinha de golfe alcana, desenvolva um programa que pergunte ao usurio qual a distancia que a bolinha de golfe percorreu e quanto tempo ela demorou para percorrer a distancia, para calcular e imprimir sua velocidade em metros por segundo. Utilize a formula velocidade = (distancia * 1000) / (tempo * 60). 8) Desenvolva um programa que some o valor de todos os produtos comprados por um cliente, de acordo com a categoria do cliente pode ser fornecido um desconto: D - Cliente Diamante - 10% de desconto O - Cliente Ouro - 5% de desconto N - Cliente Normal - Sem desconto No final deve ser impresso o valor total que o cliente deve pagar. 9) Desenvolva um programa que calcule a rea total de uma casa. Seu programa deve perguntar quantos retngulos formam a casa e os lados de cada retngulo, no final deve imprimir o tamanho total da rea da casa.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 63 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Dica: Para conhecer a rea de um retngulo, basta multiplicar os lados, por exemplo: A Sala possui 4m x 4,5m ento tem uma rea de 18 metros.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 64 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

4. Classe e Objeto

Uma classe no Java representa um modelo ou forma do mundo real que se queira reproduzir no ambiente de desenvolvimento. Pensando desta forma muito fcil entender e pensar sobre como se projetar um sistema com orientao a objetos. Quando pensamos em desenvolver um sistema voltado a locao de veculos, por exemplo, a primeira classe que vem a tona uma que possa representar a figura do carro no seu sistema. Da temos, ento, nossa primeira classe. Podemos tambm representar a Locao, Cliente e outros objetos. Uma classe composta basicamente de 3 itens: Nome da Classe o Item responsvel por identificar a classe. Este nome ser utilizado toda a vez em que se for utilizar um objeto deste tipo. importante ressaltar a utilizao de letra maiscula na primeira letra do nome da classe e as demais minsculas. Caso o nome de sua classe seja composto por mais de uma palavra, coloque sempre a primeira letra de cada palavra em letra maiscula. Isto no uma obrigatoriedade do Java; apenas uma boa prtica de desenvolvimento que visa melhorar a legibilidade do cdigo. Ex: Carro, Pessoa, ContaCorrente, CaixaCorreio, etc. Atributos o So valores que possam representar as propriedades e/ou estados possveis que os objetos desta classe podem assumir. Por conveno, costuma-se escrever o atributo com letras minsculas, a menos que ele seja composto por mais de uma palavra, a primeira palavra toda em minsculo e as demais comeam com a primeira letra em maisculo e o restante da palavra em minsculo. Ex: idade, nome, listaMensagens, notaAlunoTurma, etc. Mtodos

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 65 -

Programao Orientada a Objetos Universidade Metodista de So Paulo o So blocos de cdigo que possam representar as funcionalidades que a classe apresentar. Assim como os atributos, costuma-se escrever o atributo com letras minsculas, a menos que ele seja composto por mais de uma palavra. Neste caso, a mesma regra citada nos nomes de Atributos tambm vlida.

Ex: getPessoa, consultarDadosAluno, enviarMensagemEmail, etc. Na UML representamos uma classe da seguinte forma:

Em Java, utilizamos a palavra-chave class para declararmos uma classe. No exemplo a seguir, criamos uma classe chamada NovaClasse:
NovaClasse.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 /** * Classe utilizada para demonstrar a estrutura de uma classe. */ public class NovaClasse { /* Declarao dos atributos da classe. */ public int atributo1; public float atributo2; public boolean atributo3; /* Declarao dos mtodos da classe. */ public void metodo1() { //Comandos System.out.println("Chamando o metodo 1."); } public void metodo2() { //Comandos System.out.println("Chamando o metodo 2."); } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 66 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Note que utilizamos a palavra-chave class seguida do nome da classe NovaClasse. A palavra-chave public informa que esta classe pode ser utilizada por qualquer outra classe dentro do projeto. Este trecho de cdigo precisa ser salvo em um arquivo com o nome NovaClasse.java, porque o nome do arquivo .java precisa ter o mesmo nome da classe pblica. Logo aps a declarao da classe, criamos 3 atributos. Os atributos podem ser criados em qualquer lugar do programa. Tambm criamos dois mtodos para esta classe, mais adiante vamos discutir como funcionam os mtodos. Essa mesma classe pode ser representada em UML da seguinte forma:

Objetos
Um objeto a representao (instncia) de uma classe. Vrios objetos podem ser criados utilizando-se a mesma classe, mas cada instncia pode ter um estado (valor dos atributos) diferentes. Basta pensarmos na Classe como uma grande forma e no Objeto como algo que passou por essa forma, ou seja, o Objeto deve possuir as mesmas caractersticas de sua Classe. Na linguagem Java, para criarmos um novo objeto, basta utilizar a palavra-chave new da seguinte forma: No exemplo a seguir, criamos uma classe nova chamada TesteNovaClasse. Esta classe ser utilizada para criar um objeto da classe NovaClasse e chamar os mtodos metodo1() e metodo2().
TesteNovaClasse.java 01 02 03 /** * Classe utilizada para testar a classe NovaClasse */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 67 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


04 05 06 07 08 09 10 11 12 13 14 15 16 public class TesteNovaClasse { /** * Mtodo principal da classe. */ public static void main(String[] args) { /* Criando um objeto a partir da classe NovaClasse. */ NovaClasse novaClasse = new NovaClasse(); /* Chamando os mtodos atravs da variavel novaClasse. */ novaClasse.metodo1(); novaClasse.metodo2(); } }

Na classe acima, criamos uma varivel chamada novaClasse e esta varivel do tipo NovaClasse. Depois utilizamos a palavra-chave new seguida de NovaClasse() para construirmos um objeto da classe NovaClasse. Observe que dentro do mtodo main, estamos utilizando a varivel novaClasse para invocar os mtodos metodo1() e metodo2(). Para chamar um mtodo ou um atributo a partir de um objeto utilizamos o ponto final ( . ) seguido do nome do mtodo que precisamos chamar. Quando executamos a classe TesteNovaClasse, temos a seguinte sada no console: C:\>javac NovaClasse.java C:\>javac TesteNovaClasse.java C:\>java TesteNovaClasse Chamando o metodo 1. Chamando o metodo 2.

Utilizando os atributos da classe


No exemplo a seguir, criamos a classe Atributo e dentro dela declaramos trs atributos diferentes:
Atributo.java 01 02 03 04 05 06 /** * Classe utilizada para demonstrar a utilizao de * atributos. */ public class Atributo { /* Declarao dos atributos da classe. */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 68 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


07 08 09 10 public int atributo1; public float atributo2; public boolean atributo3; }

Criamos um atributo para guardar um valor inteiro do tipo int com o nome atributo1. Por enquanto utilize a palavra-chave public na declarao do atributo, nas prximas aulas veremos o que isto significa. Criamos um atributo para guardar um valor com ponto flutuante do tipo float com o nome atributo2. Criamos um atributo para guardar um valor booleano chamado atributo3. No exemplo a seguir, criaremos um objeto da classe Atributo e atribuiremos valores para as variveis. Depois imprimiremos os seus valores:
TesteAtributo.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 /** * Classe utilizada para demonstrar o uso * dos atributos de outra classe. */ public class TesteAtributo { /** * Mtodo principal para testar a classe Atributo. */ public static void main(String[] args) { System.out.println("Cria um objeto da classe Atributo."); Atributo teste = new Atributo(); teste.atributo1 = 30; teste.atributo2 = 3.5f; teste.atributo3 = false; System.out.println("Valor do atributo1: " + teste.atributo1); System.out.println("Valor do atributo2: " + teste.atributo2); System.out.println("Valor do atributo3: " + teste.atributo3); } }

Quando executamos a classe TesteAtributo, temos a seguinte sada no console: C:\>javac Atributo.java Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 69 -

Programao Orientada a Objetos Universidade Metodista de So Paulo C:\>javac TesteAtributo.java C:\>java TesteAtributo Cria um objeto da classe Atributo. Valor do atributo1: 30 Valor do atributo2: 3.5 Valor do atributo3: false

Mtodos com retorno de valor


Os mtodos das classes em Java servem para executar partes especficas de cdigos. Utilizando os mtodos podemos reaproveitar o cdigo. Uma vez que o mtodo criado, o mesmo pode ser usado em diversas partes do sistema. Os mtodos podem receber variveis como parmetros e devolver uma varivel como retorno da execuo do mtodo. Para que seja possvel realizar o retorno do mtodo, primeiramente necessrio declarar qual o tipo de retorno ser realizado pelo mtodo. No exemplo a seguir, criamos dois mtodos:
MetodoRetorno.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 /** * Classe utilizada para demonstrar o uso de * mtodos com retorno de valor; */ public class MetodoRetorno { /* Declarao dos atributos da classe. */ public int atributo1; /* Declarao dos mtodos da classe. */ /** * Mtodo utilizado para retornar o atributo1. * @return int com o valor do atributo1. */ public int metodo1() { System.out.println("Chamou o metodo 1."); return atributo1; } /** * Mtodo que verificar se o atributo1 maior ou igual a 0 (zero). * @return boolean informando se o atributo1 positivo */ public boolean metodo2() {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 70 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


24 25 26 27 System.out.println("Chamou o metodo 2."); return atributo1 >= 0; } }

Note que no ponto em que at h pouco utilizvamos a palavra-chave void (que significa vazio ou sem retorno) no retorno do mtodo, agora utilizamos a palavra-chave int. Essa mudana na declarao significa que pretendemos que este mtodo retorne para quem o chamou um valor do inteiro tipo int. Porm, para que o mtodo realmente retorne algum valor, necessrio identificar qual valor ser retornado. Para tal, faremos uso da palavra-chave return, da seguinte forma: public int metodo1() { return atributo1; } Com isso, temos agora o metodo1() que retornar o valor do atributo1, que do tipo int. importante lembrar que, uma vez declarado um retorno para o mtodo, obrigatrio que este retorno acontea. O fato de no se enviar um retorno resulta em um erro de compilao. No metodo2() verificamos se o atributo1 maior ou igual a 0 (zero), e retornamos a resposta dessa verificao, ou seja, true (verdadeiro) ou false (falso). A seguir vamos criar um objeto da classe MetodoRetorno e vamos testar a chamada para os mtodos metodo1() e metodo2().
TesteMetodoRetorno.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Classe utilizada para demonstrar o uso de * mtodos com retorno de valor; */ public class TesteMetodoRetorno { /** * Mtodo principal para testar est classe. */ public static void main(String[] args) { System.out.println("Criando um objeto da classe MetodoRetorno."); MetodoRetorno teste = new MetodoRetorno(); teste.atributo1 = 30; System.out.println(teste.metodo1()); System.out.println(teste.metodo2());

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 71 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


15 16 } }

Quando executamos a classe TesteMetodoRetorno, temos a seguinte sada no console: C:\>javac MetodoRetorno.java C:\>javac TesteMetodoRetorno.java C:\>java TesteMetodoRetorno Criando um objeto da classe MetodoRetorno Chamou o metodo 1. 30 Chamou o metodo 2. true

Mtodos com recebimento de parmetro


Na linguagem Java, os mtodos tambm so capazes de receber um ou mais parmetros que so utilizados no processamento do mtodo. No exemplo a seguir, criamos dois mtodos que recebem parmetros e os utilizam no processamento do mtodo:
MetodoParametro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 /** * Classe utilizada para demonstrar o uso de * mtodos que recebem parametros. */ public class MetodoParametro { /* Declarao dos atributos da classe. */ public int atributo1; /* Declarao dos mtodos da classe. */ /** * Mtodo utilizado para atribuir o valor do atributo1. */ public void metodo1(int valor) { System.out.println("Chamando o metodo 1."); atributo1 = valor; System.out.println("O valor do atributo1 eh: " + atributo1); }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 72 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

/** * Mtodo que recebe uma quantidade de parametros variados * e imprime todos os valores recebidos. * Essa possibilidade de receber uma quantidade de parametros * variados chamado de varargs e foi implementado a partir * da verso 5.0 do java. */ public void metodo2(int... valores) { System.out.println("Chamando o mtodo 2."); /* Verifica se recebeu algum argumento. */ if(valores.length > 0) { /* Para cada argumento recebido como parametro, imprime seu valor. */ for(int cont = 0; cont < valores.length; cont++) { int valor = valores[cont]; System.out.print(valor + " "); } System.out.println("\n"); /* Este for faz a mesma coisa que o anterior, este novo tipo de for chamado foreach foi implementado a partir da verso 5.0 do java. */ for(int valor : valores) { System.out.print(valor + " "); } System.out.println("\n"); } } }

Na linha 14 o metodo1(int valor) recebe um parmetro inteiro do tipo int chamado valor, e dentro do mtodo podemos utilizar este atributo valor. Note que a declarao de um parmetro igual declarao de um atributo na classe, informamos seu tipo e identificador. Se necessrio, podemos declarar tantos parmetros quantos forem precisos para execuo do mtodo. Se o parmetro recebido no mtodo for primitivo, ento seu valor recebido por cpia, caso receba um objeto como parmetro seu valor recebido por referncia. Quando fazemos uma chamada a um mtodo com parmetros de entrada, um erro na passagem dos tipos dos parmetros representa um erro de compilao.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 73 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Quando necessrio passar uma quantidade de parmetros muito grande ou uma quantidade desconhecida de parmetros, isso pode ser feito atravs de um array ou podemos usar varargs (veremos mais adiante). A sintaxe do varargs : tipo... identificador O mtodo metodo2(int... valores) recebe uma quantidade varivel de valores inteiros do tipo int. A seguir criaremos um objeto da classe MetodoParametro e vamos utilizar o metodo1(int valor) e metodo2(int... valores).
TesteMetodoParametro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 /** * Classe utilizada para demonstrar o uso * da chamada de mtodos de outra classe. */ public class TesteMetodoParametro { /** * Mtodo principal para testar a classe MetodoParametro. */ public static void main(String[] args) { System.out.println("Cria um objeto da classe MetodoParametro."); MetodoParametro teste = new MetodoParametro(); teste.metodo1(100); /* Chama o mtodo sem passar parametro. */ teste.metodo2(); /* Chama o mtodo passando um parametro. */ teste.metodo2(10); /* Chama o mtodo passando dez parametros. */ teste.metodo2(10, 20, 30, 40, 50, 60, 70, 80, 90, 100); } }

Criamos um atributo do tipo MetodoParametro chamado teste, e depois criamos um objeto da classe MetodoParametro. A partir do objeto teste chamamos o metodo1 passando o valor 100 como parmetro. Depois, chamamos o metodo2, passando valores variados para ele.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 74 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Quando executamos a classe TesteMetodoParametro, temos a seguinte sada no console: C:\>javac MetodoParametro.java C:\>javac TesteMetodoParametro.java C:\>java TesteMetodoParametro Cria um objeto da classe MetodoParametro. Chamando o metodo 1. O valor do atributo eh: 100 Chamando o metodo 2. Chamando o metodo 2. 10 10 Chamando o metodo 2. 10 20 30 40 50 60 70 80 90 100 10 20 30 40 50 60 70 80 90 100

Mtodos construtores
Sempre quando criamos um novo objeto em Java, utilizamos sintaxe:

O que ainda no foi comentado sobre este comando a necessidade de se referenciar o mtodo construtor daquela classe. Um mtodo construtor, como o prprio nome j diz, responsvel pela criao do objeto daquela classe, iniciando com valores seus atributos ou realizando outras funes que possam vir a ser necessrias. Para que um mtodo seja considerado construtor, ele deve possuir o mesmo nome da classe, inclusive com correspondncia entre letras maisculas e minsculas e no deve ter retorno. Quando usamos a palavra-chave new, estamos passando para ela como um parmetro, qual construtor deve ser executado para instanciar um objeto. Por padro, todas as classes possuem um construtor com seu nome seguindo de parnteses (). Caso voc no declare manualmente o construtor, o compilador do Java far isso por voc. Vamos criar um exemplo de construtor padro que no recebe:
ClasseConstrutor.java 01 /**

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 75 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


02 03 04 05 06 07 08 09 10 11 12 13 14 * Classe utilizada para demonstrar o uso do construtor. */ public class ClasseConstrutor { /** * Construtor padro. * * Note que o construtor possui o mesmo nome da classe e no informa o * retorno. */ public ClasseConstrutor() { System.out.println("Criando um objeto da classe ClasseConstrutor."); } }

Neste exemplo, sempre que criarmos um objeto da classe ClasseConstrutor, a frase Criando um objeto da classe ClasseConstrutor. ser impressa no console. No exemplo a seguir, criaremos um construtor que recebe parmetros:
ClasseConstrutor2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 /** * Classe utilizada para demonstrar o uso do construtor * que inicializa os atributos da classe. */ public class ClasseConstrutor2 { public int atributo1; public float atributo2; public boolean atributo3; /** * Construtor que recebe os valores para inicializar os atributos. * * @param valor1 - Valor inteiro que ser guardado no atributo1. * @param valor2 - Valor float que ser guardado no atributo2. * @param valor3 - Valor boolean que ser guardado no atributo3. */ public ClasseConstrutor2(int valor1, float valor2, boolean valor3) { System.out.println("Criando um objeto da classe ClasseConstrutor2."); System.out.println("Recebeu os seguintes parametros:\n\t" + valor1); System.out.println("\t" + valor2); System.out.println("\t" + valor3);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 76 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


23 24 25 26 27 atributo1 = valor1; atributo2 = valor2; atributo3 = valor3; } }

Neste exemplo, para construirmos um objeto da classe ClasseConstrutor2, necessrio passar para o construtor trs parmetros: int, float e boolean. Se no passarmos todos os parmetros ou a ordem deles estiver diferente do esperado no conseguiremos compilar a classe. Quando criamos um construtor que recebe parmetros, o compilador no cria um construtor padro ClasseConstrutor2(). No exemplo a seguir, vamos construir um objeto da classe ClasseConstrutor e um objeto da classe ClasseConstrutor2.
TesteConstrutor.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Classe utilizada para demonstrar o uso do construtor. */ public class TesteConstrutor { /** * Mtodo principal que cria dois objetos. */ public static void main(String[] args) { /* Chama o construtor padro da classe ClasseConstrutor. */ ClasseConstrutor cc = new ClasseConstrutor(); /* Chama o construtor da classe ClasseConstrutor2 passando os valores que sero guardados nos atributos. */ ClasseConstrutor2 cc2 = new ClasseConstrutor2(10, 3.5F, false); } }

Criamos um objeto da classe ClasseConstrutor chamado o construtor sem parmetros ClasseConstrutor(). Em seguida, criamos um objeto da classe ClasseConstrutor2, chamando o construtor ClasseConstrutor2(int valor1, float valor2, boolean valor3), passando os trs parmetros para ele. Quando executamos a classe TesteConstrutor, temos a seguinte sada no console:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 77 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

C:\>javac ClasseConstrutor.java C:\>javac ClasseConstrutor2.java C:\>javac TesteConstrutor.java C:\>java TesteConstrutor Criando um objeto da classe ClasseConstrutor. Criando um objeto da classe ClasseConstrutor2. Recebeu os seguintes parametros: " 10 " 3.5 " false

Exerccios
1-) Crie a classe Vetor a seguir e siga as instrues nos comentrios.
/** * Classe utilizada para representar um conjunto de nmeros, em que podemos * localizar o valor do maior elemento, menor elemento e * media dos elementos do vetor. * * @author <<Nome>> */ public class Numeros { int[] valores; public Numeros(int[] _valores) { System.out.println("\nCriando um objeto da classe Vetor e inicializando o vetor de inteiros.\n"); valores = _valores; } public void localizarMaior() { /* Deve imprimir o valor do maior elemento do vetor. */ } public void localizarMenor() { /* Deve imprimir o valor do menor elemento do vetor. */ } public void calcularMedia() { /* Deve imprimir a media de todos os elementos do vetor. */ }

Agora crie a classe TesteVetor, para verificar a execuo dos mtodos:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 78 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


/** * Testa a classe Numeros. * * @author <<Nome>> */ public class TesteNumeros { public static void main(String[] args) { /* 1- Crie um vetor de inteiro com 10 valores. */ /* 2- Crie um objeto da classe Numeros, passando o vetor de inteiros para o construtor. */ nums.localizarMaior(); nums.localizarMenor(); nums.calcularMedia();

2-) Crie uma classe que representa uma conta bancaria que possua o nmero da conta e saldo. Est classe tambm deve executar os seguintes mtodos: extrato (Mostra na tela o nmero e o saldo da conta) saque (Recebe como parmetro um valor e retira este valor do saldo da conta) deposito (recebe como parmetro um valor e adiciona este valor ao saldo da conta) Ao final das operaes saque e deposito, sua classe deve imprimir o nmero e o saldo da conta. Crie uma classe para testar os mtodos da classe conta bancaria. 3-) Crie uma classe que representa uma calculadora, est calculadora deve ter os seguintes mtodos: soma (recebe dois nmeros e mostra o valor da soma) subtrao (recebe dois nmeros e mostra o valor da subtrao entre eles) diviso (recebe dois nmeros e mostra o valor da diviso entre eles) multiplicao (recebe dois nmeros e mostra o valor da multiplicao entre eles) resto (recebe dois nmeros e mostra o valor do resto da diviso entre esses dois nmeros) Crie uma classe para testar os mtodos da classe calculadora. 4-) Crie uma classe Televisor. Essa classe deve possuir trs atributos: canal (inicia em 1 e vai at 16) volume (inicia em 0 e vai at 10) ligado (inicia em desligado ou false) Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 79 -

Programao Orientada a Objetos Universidade Metodista de So Paulo e a seguinte lista de mtodos: aumentarVolume() //Aumenta em 1 o volume reduzirVolume() //Diminui em 1 o volume subirCanal() //Aumenta em 1 o canal descerCanal() //Diminui em 1 o canal ligarTelevisor() //Liga a televiso desligarTelevisor() //Desliga a televiso mostraStatus() //Dizer qual o canal, o volume e se o televisor est ligado Nos mtodos informe se possvel realizar a operao, por exemplo, se o volume estiver no 10 e chamar o mtodo aumentarVolume() novamente imprima uma mensagem de aviso, etc. Quando desligado, nosso televisor deve voltar o canal e o volume a seus valores iniciais e no deve realizar nenhuma operao. Crie uma classe para testar a classe Televisao.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 80 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

5. A Classe java.lang.String

A classe java.lang.String utilizada para representar textos (sequncia de caracteres). O tamanho que uma String suporta igual ao tamanho disponvel de memria. Para criar uma String podemos utilizar qualquer uma das seguintes formas: String nome = new String("Rafael"); // ou String sobrenome = "Sakurai"; Para fazer a concatenao de Strings podemos usar o sinal + ou usar o mtodo concat da classe String, por exemplo: String nomeCompleto = nome + " " + sobrenome; // ou String nomeCompleto2 = "Cristiano".concat(" Camilo"); O valor de uma String imutvel, no se pode alterar seu valor. Quando alteramos o valor de uma String, estamos criando uma nova String. Ento, quando fazemos: String novoNome = "Cris" + "tiano; Estamos criando 3 Strings: Cris tiano Cristiano

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 81 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Alguns caracteres no podem ser simplesmente colocados dentro de uma String, como, por exemplo, as aspas duplas ().Este smbolo usado para indicar o incio e o fim de uma String. Por este motivo, caso tenhamos: String aspas = """; // Erro de compilao Teremos um erro de compilao, pois estamos deixando uma aspas duplas fora do texto. Para os caracteres que no podem ser simplesmente adicionados dentro da String, usamos a barra invertida \ como escape de caracteres. Segue abaixo uma tabela com alguns escapes de caracteres e o que eles representam dentro da String. \t \n \ \ \\ Tabulao horizontal Nova linha Aspas duplas Aspas simples Barra invertida

A classe java.lang.String tem alguns mtodos para se trabalhar com os textos, por exemplo: compareTo Compara se duas Strings so iguais. Ele retorna um nmero inteiro sendo 0 apenas caso ambas as String sejam idnticas. compareToIgnoreCase Compara se duas Strings so iguais sem diferenciar letras maisculas e minsculas. equals Verifica se uma String igual a outra. Retorna um tipo booleano. replace Altera um caractere de uma String por outro caractere. replaceAll Altera cada substring dentro da String com uma nova substring. split Divide uma String em varias substrings a partir de uma dada expresso regular. Mais mtodos da classe String podem ser encontrados em: http://java.sun.com/javase/6/ docs/api/java/lang/String.html. Cuidado ao utilizar os mtodos da String, quando no houver uma instancia da classe String, no caso null. Invocar um mtodo de uma referncia nula gera uma exceo NullPointerException, um erro que ocorre em tempo de execuo, por exemplo: String abc = null; abc.equals("xpto"); Este cdigo lanar uma NullPointerException, pois a String abc est vazia (null), e est tentando invocar o mtodo equals() de um String null (excees sero abordadas).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 82 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Converso para String (texto)


Para transformar qualquer tipo primitivo para String, basta utilizar o mtodo: String.valueOf( <<informaes que se tornar texto>> ); Para utiliz-lo, voc deve atribuir a sada do mtodo a uma String, e preencher o campo interno do mtodo com o valor desejado, por exemplo: Converso de inteiro para String: int numero = 4; String texto = String.valueOf(numero); Observe que na segunda linha, a varivel do tipo inteira est sendo utilizada no mtodo valueOf() para que a converso possa ser executada, e o resultado da converso est sendo atribuda a String chamada texto. O mtodo valueOf() pode converter os seguintes tipos para String: int para String String texto = String.valueOf(1); long para String String.valueOf(580l); float para String ! String.valueOf(586.5f); double para String ! String.valueOf(450.25); boolean para String ! String.valueOf(true); char para String String.valueOf(a); Note que os tipos byte e short no constam nesta lista, logo, para realizar a sua converso necessrio transformar estes tipos primeiramente em int e s ento convert-los para String.

Converso de String para tipos Primitivos

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 83 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Assim como tratamos da manipulao de tipos de valores primitivos para String, nesta seo falaremos sobre a converso de tipos primitivos para String. Em Java possvel transformar qualquer String em um tipo primitivo, para tal, necessrio utilizar um dos conversores especficos de cada tipo, so eles: String texto = 15; String para byte byte o = Byte.parseByte(texto); String para short short a = Short.parseShort(texto); String para int int b = Integer.parseInt(texto); String para long long c = Long.parseLong(texto); String para float float d = Float.parseFloat(texto); String para double double e = Double.parseDouble(texto); String para boolean boolean g = Boolean.parseBoolean(true); String para char char f = texto.charAt(1); //Pega o primeiro caractere da String.

Recebendo Strings como parmetro diretamente no mtodo main


Quando executamos uma classe que possui o mtodo public static void main(String[] args), podemos passar parmetros para este mtodo. Para passar os parmetros para o mtodo main via console, utilizamos a seguinte sintaxe: java nomeDaClasse parametro1 parametro2 No exemplo a seguir, criamos um programa que recebe alguns nomes como parmetro:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 84 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


ParametrosMain.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Classe utilizada para mostrar a passagem de parmetros * para o mtodo main. */ public class ParametrosMain { public static void main(String[] args) { if(args.length > 0) { for(String nome : args) { System.out.println(nome); } } else { System.out.println("Nenhum nome foi passado como parametro."); } } }

Se executarmos esta classe sem passar parmetros, ser impresso a seguinte mensagem: C:\>javac ParametrosMain.java C:\>java ParametrosMain Nenhum nome foi passado como parametro. Quando executamos a aplicao passando os nomes como parmetro, estes nomes so impressos no console. Note que quando precisamos passar um parmetro que possua espaos em brancos, devemos utilizar as aspas duplas para delimitar a rea do parmetro, por exemplo Cristiano e Rafael Sakurai. C:\>javac ParametrosMain.java C:\>java ParametrosMain Cristiano "Rafael Sakurai" Cristiano Rafael Sakurai

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 85 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Exerccios
1) Crie um programa em que o usurio deve digitar as seguintes informaes: - frase - qtd parmetros - valores dos parmetros separados por virgula Exemplo: - frase: "Ola meu nome {0} e eu tenho {1} anos" - qtd parmetros: 2 - valores dos parmetros separados por virgula: Rafael,25 E a sada do programa na console deve ser: "Ola meu nome Rafael e eu tenho 25 anos."

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 86 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

6. Identidade e Igualdade

Ao criar um objeto a partir de uma classe, criamos uma varivel que serve de meio de acesso ao objeto criado em memria, ou como chamamos, uma referncia. Exatamente por este motivo, sempre que declaramos um novo objeto, temos de utilizar o comando new, pois o mesmo ir efetivamente criar o novo objeto em memria e fornecer o seu endereo a varivel declarada. O comando new recebe um parmetro que um construtor de classe. No exemplo a seguir, vamos trabalhar com a classe Pessoa:
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 /** * Classe utilizada para representar uma Pessoa. */ public class Pessoa { private String nome; private int idade; public int getIdade() { return idade; } public void setIdade(int idade) { this.idade = idade; } public String getNome() { return nome; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 87 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


19 20 21 22 23

public void setNome(String nome) { this.nome = nome; } }

Logo, na referncia a seguir: Pessoa manuel = new Pessoa(); O correto dizer que manuel uma referncia a um objeto do tipo Pessoa e no que manuel o objeto propriamente dito. Com isso, podemos afirmar que em Java uma varivel nunca um objeto, ela apenas ser a representao de um tipo primitivo ou uma referncia a um objeto. No exemplo a seguir, vamos ver como funciona a referncia de um objeto:
TestePessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Classe utilizada para mostrar identidade de objeto. */ public class TestePessoa { public static void main(String[] args) { Pessoa paulo = new Pessoa(); paulo.setIdade(24); Pessoa pedro = paulo; pedro.setIdade(pedro.getIdade() + 1); System.out.println("A idade de Paulo eh: " + paulo.getIdade()); System.out.println("A idade de Pedro eh: " + pedro.getIdade()); } }

Neste exemplo, a sada do programa ser a seguinte: A idade de Paulo : 25 A idade de Pedro : 25 Agora por que a idade de Paulo foi exibida como 25, sendo que apenas incrementamos a idade de Pedro?

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 88 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Isso acontece, pois o comando: Pessoa pedro = paulo; Na verdade copia o valor da varivel paulo, para a varivel pedro. Por este motivo, como falamos acima, ele copia a referncia de um objeto de uma varivel para outra. Seria como imaginarmos a figura a seguir:

Nesta figura, podemos notar que, como ambas as variveis apontam para o mesmo objeto, qualquer operao realizada atravs da referncia pedro, tambm refletir na referncia paulo. Quando queremos comparar se duas variveis apontam para o mesmo objeto, podemos usar a igualdade ( == ), por exemplo:
TestePessoa2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 /** * Classe utilizada para mostrar igualdade de objeto. */ public class TestePessoa2 { public static void main(String[] args) { Pessoa paulo = new Pessoa(); paulo.setIdade(24); Pessoa pedro = paulo; if(paulo == pedro) { System.out.println(" a mesma pessoa!!!"); } else {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 89 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


14 15 16 17 System.out.println("So pessoas diferentes!!!"); } } }

Esta comparao vai retornar true, pois ambas variveis paulo e pedro esto apontando para o mesmo objeto da memria. E quando queremos saber se o contedo de dois objetos so iguais, utilizamos o mtodo equals(), todas as classes do Java possuem este mtodo.
ExemploIgualdadeString.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Exemplo para mostrar igualdade de String. */ public class ExemploIgualdadeString { public static void main(String[] args) { String a = new String("a"); String b = "a"; if(a.equals(b)) { System.out.println("As duas Strings so iguais."); } else { System.out.println("As duas Strings so diferentes."); } } }

Neste exemplo, ser impresso As duas Strings so iguais, pois o contedo das Strings so iguais. Agora se compararmos essas duas Strings com o operador de igualdade == teremos um resposta que no esperada:
ExemploIgualdadeString2.java 01 02 03 04 05 06 07 /** * Exemplo para mostrar igualdade de String. */ public class ExemploIgualdadeString2 { public static void main(String[] args) { String a = new String("a"); String b = "a";

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 90 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


08 09 10 11 12 13 14 15

if(a == b) { System.out.println("As duas Strings so iguais."); } else { System.out.println("As duas Strings so diferentes."); } } }

Neste exemplo, ser impresso As duas Strings so diferentes., pois as variveis no apontam para o mesmo objeto String. Ento cuidado na comparao entre objetos, de preferncia ao mtodo equals(), use comparao == somente com tipos primitivos. Quando criamos uma nova classe, est classe tem um mtodo equals() que vem da classe java.lang.Object. O mtodo equals(), que existe na classe que criamos, tem a mesma funo que a igualdade ( == ). Caso precisemos saber se duas instancias desta mesma classe so iguais, ento temos de sobrescrever o mtodo equals().

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 91 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

7. Assinatura de Mtodos

Formalizando os conceitos de nome de mtodo e de mtodos com parmetros, vamos agora ento tratar de assinatura de mtodo. A assinatura de um mtodo composta por: visibilidade tipo de permisso ao mtodo. retorno tipo de retorno do mtodo ou void caso no tenha retorno. parmetros atributos utilizados dentro do processamento do mtodo. excees informao de algum erro que pode ocorrer na execuo do mtodo. No exemplo a seguir, temos alguns exemplos de mtodos que podemos declarar:
AssinaturaMetodo.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 /** * Classe utilizada para demonstrar a utilizao de diferentes assinaturas * de mtodos. */ public class AssinaturaMetodo { public void imprimir() { System.out.println("Ola!!!"); } public long calcular(int x, int y) { return x * y; } public String buscarDados(int matricula) { return "abcdef"; } public Pessoa consultarPessoa(String nome) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 92 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


19 20 21 22 23 24 return new Pessoa(); } public void enviarEmail(Email e) { } }

Para o compilador os mtodos de mesmo nome, porm com parmetros diferentes so identificados como mtodos distintos entre si. Exemplo: Criamos a classe Televisao, contendo os seguintes mtodos:
Televisao.java 01 02 03 04 05 06 07 08 09 /** * Classe utilizada para demonstrar vrios mtodos * com o mesmo nome, mas com parmetros diferentes. */ public class Televisao { public void alterarCanal() {} public void alterarCanal(int numeroCanal) {} public void alterarCanal(int numeroCanal, int modeloAparelhoTv) {} }

O compilador interpretaria estes trs mtodos de forma distinta, e em uma determinada chamada, saberia exatamente qual deles utilizar.
TelevisaoTeste.java 01 02 03 04 05 06 07 08 09 10 /** * Classe utilizada para demonstrar a chamada de um mtodo, * em uma classe com diversos mtodo com mesmo nome. */ public class TelevisaoTeste { public static void main(String[] args) { Televisao tv = new Televisao(); tv.alterarCanal(10); } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 93 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Note que na chamada ao mtodo alterarCanal(), esta sendo invocado com passagem de um parmetro inteiro, logo o mtodo da classe Televisao a ser executado seria: public void alterarCanal(int numeroCanal) { } O que identifica a assinatura do mtodo a unio das informaes de nome do mtodo e parmetros, logo os seguintes mtodos listados abaixo seriam considerados erros de compilao:
Contas.java 01 02 03 04 05 06 07 08 /** * Classe utilizada para demonstrar vrios mtodos com o mesmo nome e * mesmos parmetros, mas com retorno diferente. */ public class Contas { public int fazerConta(int num1, int num2) { } public float fazerConta(int num1, int num2) { } //Erro de compilao. }

Visto que seus nomes e argumentos so idnticos, mudando apenas o tipo de retorno. Ao conceito de se criar vrios mtodos de mesmo nome, porm com parmetros diferentes entre si, damos o nome de Sobrecarga de Mtodo.

Troca de Mensagens
Na linguagem Java, possvel que objetos distintos se relacionem entre si por meio de seus mtodos. A este tipo de operao damos o nome de Troca de Mensagens. Este tipo de relacionamento pode ser representado pela troca de informaes, chamada de execuo de mtodos, etc. Para que seja possvel aos objetos se conversarem, necessariamente no preciso que um objeto esteja contido dentro de outro, formando uma cadeia, mas basta simplesmente que um referencie os mtodos do outro. A fim de exemplificar melhor o que estamos falando, vamos imaginar uma mesa de bilhar. Em um ambiente deste tipo, para que a bola possa se mover necessrio que o taco a atinja diretamente. Abstraindo esta idia, para ns usurios, o que nos compete apenas o movimento do taco, sendo que a movimentao da bola ao longo da mesa deve ser realizada pela imposio do taco.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 94 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Agora imagine que o Usurio ser representado pela classe TacoTeste, logo:
TacoTeste.java 01 02 03 04 05 06 07 08 09 10 11 12 /** * Classe utilizada para demonstrar a troca * de mensagens entre as classes. */ public class TacoTeste { public static void main(String[] args) { Taco tacoDeBilhar = new Taco(); Bola bola8 = new Bola(); tacoDeBilhar.bater(bola8); } }

Imaginando a situao acima, teramos a classe TacoTeste instanciando objetos de cada um dos dois tipos. Feito isso, uma chamada ao mtodo bater(Bola bola) da classe Taco, indicando qual a bola alvo do taco, este mtodo indica apenas que estamos movendo o taco para acertar uma bola. J na classe Taco, o mtodo bater(Bola bola) encarregado de executar a ao de bater na bola. Logo, teramos algo deste gnero:
Taco.java 01 02 03 04 /** * Classe utilizada para representar um taco de bilhar. */ class Taco {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 95 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


05 06 07 08 09 10 11 12 13 14 /** * Mtodo utilizado para representar a ao do taco * bater na bola de bilhar. * * @param bola - Bola que ser alvo do taco. */ public void bater(Bola bola) { bola.mover(5, 25.5F); } }

Note ento, que diferentemente das classes que desenvolvemos at ento, a chamada do mtodo mover(int forca, float angulo) da classe Bola est sendo referenciado de dentro da classe Taco, sem qualquer interferncia do usurio atravs da classe TacoTeste.
Bola.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Classe utilizada representar uma bola de bilhar. */ class Bola { /** * Mtodo que ser utilizado para fazer o deslocamento * da bola de bilhar. * * @param forca - Intensidade da batida. * @param angulo - Angulo que a bola foi acertada. */ public void mover(int forca, float angulo) { //Cdigo para calcular a tragetria da bola. } }

Este relacionamento entre as classes sem a interveno externa, assemelhando-se a uma conversa entre elas, damos o nome de troca de mensagens.

Varargs
Quando temos um mtodo que no sabemos ao certo quantos parmetros sero passados, podemos passar um vetor ou lista de atributos primitivos ou objetos, mas em Java tambm podemos definir na assinatura do mtodo, que ele recebe um parmetro do tipo varargs.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 96 -

Programao Orientada a Objetos Universidade Metodista de So Paulo O mtodo pode receber quantos parmetros forem necessrios, porm s pode ter apenas um varargs na assinatura do mtodo, sua sintaxe assim: << Tipo ... Identificador >> Exemplo:
VarargsTeste.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 /** * Classe utilizada demostrar a chamada de um mtodo * que recebe parmetros variados. */ public class VarargsTeste { public static void main(String[] args) { //Voc passa quantos parmetros quiser. int soma = somarValores(10, 5, 15, 20); System.out.println(soma); //Voc pode chamar o mtodo sem passar parmetro. int soma2 = somarValores(); System.out.println(soma2); } /** * Mtodo que soma valores inteiros no importando * a quantidade de parmetros. * * @param valores - Parmetros variados. * @return Soma total dos parmetros. */ public static int somarValores(int... valores) { int soma = 0; for(int valor : valores) { soma += valor; } return soma; } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 97 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste exemplo, temos o seguinte mtodo somarValores que recebe um varargs de inteiros, quando chamamos este mtodo podemos passar quantos atributos do tipo inteiro for necessrio, e se quiser tambm no precisa passar nenhum atributo para ele. O varargs um facilitador, ao invs de criar um array ou lista e colocar os valores dentro dele para depois chamar o mtodo, o mesmo pode ser chamado diretamente passando os n valores e os parmetros enviados so automaticamente adicionados em um array do mesmo tipo do varargs. Tambm podemos usar o vargars em um mtodo que recebe outros parmetros, mas quando tem mais parmetros o varargs precisa ser o ultimo parmetro recebido pelo mtodo, por exemplo:
VarargsTeste2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /** * Classe utilizada demostrar a chamada de um mtodo * que recebe parmetros variados. */ public class VarargsTeste2 { public static void main(String[] args) { /* Aqui estamos chamando o mtodo somarValores, passando o * primeiro valor (2) para o atributo multiplicador, e os * valores (10, 5, 15, 20) vo para o varargs valores. */ int soma = somarValores(2, 10, 5, 15, 20); System.out.println(soma); } /** * Mtodo que soma valores inteiros no importando * a quantidade de parmetros. * @param valores - Parmetros variados. * @return Soma total dos parmetros. */ public static int somarValores(int multiplicador, int... valores) { int soma = 0; for(int valor : valores) { soma += valor; } return soma * multiplicador; } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 98 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste exemplo, o mtodo somarValores recebe dois parmetros, um inteiro e um varargs do tipo inteiro, ento quando chamamos este mtodo passamos o atributo multiplicador recebe o valor 2 e o atributo valores recebe os valores 10, 5, 15 e 20. Lembrando que o varargs precisa ser o ultimo parmetro do mtodo e no pode ter mais que um varargs, caso contrario ocorrer erro de compilao, por exemplo:
VarargsTeste3.java 01 02 03 04 05 06 07 08 /** * Classe utilizada demostrar formas erradas do uso de varargs. */ public class VarargsTeste3 { public int somarValores(float... numeros, int... valores) { } public void executarOperacao(double... precos, String operacao) { } }

Portanto, estes dois mtodos ficam com erro de compilao. O mtodo que tem na assinatura um parmetro do tipo varargs s chamado quando nenhuma outra assinatura de mtodo corresponder com a invocao, por exemplo:
VarargsTeste4.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 /** * Classe utilizada demostrar a chamada de um mtodo * que recebe parmetros variados. */ public class VarargsTeste4 { public static void main(String[] args) { //Vai chamar o mtodo que recebe um parmetro inteiro. int valor = somarValores(2); System.out.println(valor); //Vai chamar o mtodo que recebe um varargs. int valor2 = somarValores(2, 5); System.out.println(valor2); } public static int somarValores(int valores) { return valores; } public static int somarValores(int... valores) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 99 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


21 22 23 24 25 26 27 28 29 int soma = 0; for(int valor : valores) { soma += valor; } return soma; } }

Neste exemplo, na primeira chamada do mtodo somarValores passando apenas um atributo inteiro, chamado o mtodo somarValores(int numero). Na segunda chamada so passados vrios parmetros do tipo inteiro, neste caso o mtodo chamado ser o somarValores(int... numeros).

Exerccios
1-) Crie uma classe chamada Calculadora. Esta classe deve possuir os seguintes mtodos: public double operacao(double num1, double num2); Retorna a soma dos dois nmeros. public double operacao(int num1, double num2); Retorna a subtrao dos dois nmeros. public double operacao(double num1, int num2); Retorna o produto dos dois nmeros. public double operacao(int num1, int num2); Retorna o resultado da diviso dos dois nmeros. public double operacao(int num1, short num2); Retorna o resto da diviso dos dois nmeros.

Elabore um roteiro de teste para a sua calculadora e observe os resultados. 2-) Crie uma classe chamada Pessoa sem atributo algum. Para trabalharmos os conceitos de sobrecarga de mtodos, crie os seguintes mtodos: public String dizerInformacao(String nome); Deve retornar um texto dizendo: Meu nome + nome . public String dizerInformacao(int idade); Deve retornar um texto dizendo: Minha idade + idade . public String dizerInformacao(double peso, double altura); Deve retornar um texto dizendo: Meu peso + peso + e minha altura + altura . - 100 -

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

Programao Orientada a Objetos Universidade Metodista de So Paulo Munido do retorno de cada um destes mtodos. Imprima-o em tela. Para praticarmos o uso da classe Scanner, leia estas quatro informaes que devem ser inseridas pelo usurio. 3-) Crie as classes e implemente os mtodos para o seguinte diagrama de classe:

Crie uma classe de teste e elabore um roteiro de teste da suas classes. 4-) Crie uma classe Conta com os seguintes mtodos e atributos:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 101 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

No mtodo depositar por questes de segurana, no deve permitir depsitos superiores a R $ 1.000,00 caso a conta seja do tipo Corrente. O mtodo sacar no deve permitir saques superiores ao saldo total da conta. O mtodo transferir, pode realizar transferncia da conta corrente para a conta poupana, mas o contrario no permitido, tambm no deve permitir que o saldo da conta fique negativo. Feito isso, trace o seguinte roteiro: Crie duas contas, uma do tipo Corrente e outra do tipo Poupana com um saldo inicial qualquer. Tente depositar R$ 1.500,00 reais na conta corrente. Tente depositar R$ 1.500,00 reais na conta poupana. Deposite R$ 98,52 na conta poupana. Tente sacar R$ 100,00 da poupana. Transfira R$ 1.800,00 da corrente para a conta poupana. Transfira R$ 700,00 da poupana para a conta corrente. Saque R$ 1.000,00 da poupana. Saque R$ 1.000,00 da corrente. Na classe de teste, exiba mensagens indicando o retorno e ou o resultado (xito ou falha) de cada um dos mtodos.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 102 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

8. Plain Old Java Object POJO

Plain Old Java Object ou POJO, so objetos Java que seguem um desenho extremamente simplificado. Um POJO um JavaBean que segue definies rgidas de estrutura, sendo elas: Possui um construtor default (padro - sem argumentos) ou no declarar construtor (assim o compilador Java criara um construtor default automaticamente); Possui todos os seus atributos, sejam eles tipos primitivos ou objetos, com a visibilidade privada; No possui mtodos especficos, exceto aqueles que seguem o padro de getter e setter para seus respectivos atributos

OBS: O padro getter a forma de pegar o valor do atributo e o padro setter a forma de alterar o valor do atributo. Este padro baseado na idia de que quanto mais simples o projeto, melhor. O termo foi inventado por Martin Fowler, Rebecca Parsons e Josh MacKenzie em Setembro de 2000. "Ns queramos saber por que as pessoas eram contra o uso de objetos regulares em seus sistemas e conclumos que era devido falta de um nome extravagante para eles. Assim ns demos-lhes um, e funcionou muito bem.". O termo segue o padro de atribuir um nome para tecnologias que no possuem nenhuma caracterstica nova. O termo ganhou aceitao por causa da necessidade de um termo comum e facilmente inteligvel que contrasta com os complicados frameworks de objetos. mais atrativo do que o termo bean do Java devido confuso gerada pela semelhana dos termos JavaBeans e dos EJB (Enterprise JavaBeans). Segue abaixo alguns exemplos do que pode ser considerado um POJO:
Carro.java

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 103 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /** * Este um exemplo tpico de um POJO. Perceba que est classe possui * apenas 2 atributos e um mtodo GET e outro SET para cada um deles. */ public class Carro { private String nome; private String cor; public String getCor() { return cor; } public void setCor(String cor) { this.cor = cor; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }

Oficina.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 /** * Esta classe mesmo fazendo referncia a classe anterior, * continua sendo um POJO. */ public class Oficina { private Carro[] carrosParaManutencao; private String nome; public Carro[] getCarrosParaManutencao() { return carrosParaManutencao; } public void setCarrosParaManutencao(Carro[] carrosParaManutencao) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 104 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


15 16 17 18 19 20 21 22 23 24 25 this.carrosParaManutencao = carrosParaManutencao; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 105 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

9. Pacotes

Na linguagem Java existe uma maneira simples e direta de se organizar arquivos, alm de possibilitar que se utilize mais de uma classe de mesmo nome no mesmo projeto. Essa forma de organizao recebe o nome de empacotamento. No Java utilizamos a palavra package para representar o pacote da classe. A organizao de pacotes ocorre de forma semelhante a uma biblioteca de dados. Vrios arquivos so agrupados em pastas comuns, logo se tem por hbito agrupar arquivos de funes semelhantes em mesmas pastas.

Neste exemplo, temos os seguintes pacotes:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 106 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

br biblioteca imagens model tela util A rvore hierrquica do pacote no possui regras restritas de limitao de quantidade de ns, apenas recomenda-se notao semelhante a da Internet, a fim de reduzir ao mximo a possibilidade de termos mais de um pacote de arquivos de mesmo nome. Uma boa pratica para nomes de pacotes utilizar apenas uma palavra como nome do pacote, por exemplo, biblioteca, pessoa, email, e o nome do pacote escrito em minsculo. O pacote no pode ter o nome de uma palavra-chave do java e no pode comear com nmero ou caracteres especiais (exceto $ e _). No exemplo a seguir vamos criar a estrutura de pacotes br.metodista.telas e dentro deste pacote vamos colocar a classe CadastroLivro:

Criada ento essa hierarquia, o prximo passo declarar no arquivo da classe o nome do pacote ao qual ela pertence. Esta declarao deve ser feita obrigatoriamente na primeira linha do arquivo (sem contar comentrios) da seguinte maneira:
CadastroLivro.java 01 02 03 04 05 06 07 package br.biblioteca.telas; /** * Tela utilizada para cadastrar livros da biblioteca. */ public class CadastroLivro { }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 107 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Note na declarao acima que as pastas foram divididas por pontos. Logo a mesma hierarquia de pastas deve ser seguida nesta declarao. Desta forma, os arquivos ficam realmente organizados e, de certa forma, isolados de outros pacotes. Vale lembrar que, quando criamos uma classe na raiz de nosso projeto esta classe no possui pacote. O pacote de desenvolvimento Java j traz consigo muitos pacotes de funes especificas, sendo alguns eles: PACOTE java.lang java.util java.io java.awt java.net java.sql DESCRIO Pacote usual da linguagem. (Importado por padro) Utilitrios da linguagem Pacote de entrada e sada Pacote de interface grfica Pacote de rede Pacote de banco de dados

Quando se est desenvolvendo uma classe e deseja-se utilizar uma classe de outro pacote, somos obrigados a declarar esta utilizao. Para tal, utilizamos o comando import. De forma semelhante ao comando package, o comando import deve considerar a hierarquia de pastas e separ-las por pontos, da seguinte forma:
CadastroLivro.java 01 02 03 04 05 06 07 08 09 10 11 package br.biblioteca.telas; import br.biblioteca.modelo.Livro; import br.biblioteca.util.MostrarTela; import br.biblioteca.util.XmlConvert; /** * Tela utilizada para cadastrar livros da biblioteca. */ public class CadastroLivro { }

No exemplo acima, demonstramos que a classe CadastroLivro ir utilizar a classe Livro do pacote br.biblioteca.model.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 108 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Quando queremos utilizar muitas classes de um mesmo pacote, podemos importar o pacote inteiro utilizando o caractere asterisco ( * ) no lugar do nome das classes.
CadastroLivro.java 01 02 03 04 05 06 07 08 09 10 package br.biblioteca.telas; import br.biblioteca.modelo.*; /** * Tela utilizada para cadastrar livros da biblioteca. */ public class CadastroLivro { Livro novoLivro = new Livro(); }

Neste exemplo criado um novo objeto a partir da classe Livro, que est dentro do pacote br.biblioteca.model, como utilizamos o * no import, podemos utilizar qualquer classe do pacote model. OBS: Durante o processo de compilao do arquivo .java para .class, o compilador primeiro importa as classes que esto com o pacote completo e depois procura pelas classes que tiveram o pacote inteiro importado, ento normalmente utilizado o nome inteiro do pacote e da classe, assim as classes so compiladas um pouco mais rpido.

Exerccios
1-) O que acontece se tentarmos compilar e executar o seguinte cdigo:
package pessoa.interface.tela; public classe Pessoa { private String nome; protected void setNome(String nome) { this.nome = nome; } public String getNome() { return this.nome; }

package pessoa.interface.tela; public class Funcionario extends Pessoa { public Funcionario(String nome) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 109 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


} setNome(nome);

public String getNome() { return "Funcionario: "+ super.getNome(); }

package pessoa.interface.tela; public class TesteFuncionario { public static void main(String[] args) { Funcionario f = new Funcionario("Cristiano"); System.out.println(f.getNome()); } }

a) Imprime Cristiano b) Imprime Funcionario Cristiano c) Erro porque a classe Funcionario no pode usar o mtodo super.getNome(); d) Erro de compilao e) Erro em tempo de execuo

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 110 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

10. Visibilidade

Em Java, utilizamos alguns modificadores que nos permitem proteger o acesso a um atributo, mtodo ou at mesmo uma classe, de outras classes. Basicamente Java possui quatro modificadores bsicos de acesso, sendo eles:

Modificador de acesso: private


private um modificador de acesso que restringe totalmente o acesso aquele recurso da classe de todas as demais classes, sejam elas do mesmo pacote, de outros pacotes ou at subclasses. Este modificador pode ser aplicado a atributos e mtodos. Exemplo:
Email.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 package br.visibilidade; /** * Classe utilizada para representar um email que ser enviado. */ public class Email { private String remetente; private String destinatario; private String assunto; private String mensagem; public void enviarEmail(String remetente, String destinatario, String assunto, String mensagem) { this.remetente = remetente; this.destinatario = destinatario;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 111 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 this.assunto = assunto; this.mensagem = mensagem; if(this.validarEmail()) { this.enviar(); } } private boolean validarEmail() { boolean ok = false; // Cdigo para validar se as informaes do email esto corretas. return ok; } private void enviar() { // Envia o email. } }

Neste exemplo, temos a classe Email, a partir de outras classes podemos chamar apenas o mtodo enviarEmail(...), os outros mtodos e atributos da classe no podem ser usados por outras classes pois tem o modificador private.
TesteEmail.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 package br.visibilidade; /** * Classe utilizada para testar o envio de email. */ public class TesteEmail { public static void main(String[] args) { Email email = new Email(); email.enviarEmail("rafael@sakurai.com.br", "cristiano@almeida.com.br", "Aula de POO - Visibilidade", "Material da aula de visibilidade j est disponivel."); email.remetente = "teste@almeida.com.br"; //ERRO de Compilao. email.enviar(); //ERRO de Compilao. } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 112 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste exemplo conseguimos criar um objeto a partir da classe Email e enviar o email utilizando o mtodo enviarEmail(...), mas no conseguimos acessar o atributo remetente e o mtodo enviar(), pois so privados e o compilador gera dois erros de compilao: C:\>javac br/visibilidade/TesteEmail.java br\visibilidade\TesteEmail.java:14: remetente has private access in br.visibilidade.Email email.remetente = "teste@almeida.com.br"; // ERRO de Compilao. br\visibilidade\TesteEmail.java:15: enviar() has private access in br.visibilidade.Email email.enviar(); //ERRO de Compilao. ^ 2 errors

Modificador de acesso: default (ou package)


default um modificador um pouco menos restritivo que o private. Este tipo de modificador aplicado a todas as classes, atributos ou mtodos, os quais, no tiveram o seu modificador explicitamente declarado. Este modificador permite que apenas classes do mesmo pacote tenham acesso as propriedades que possuem este modificador. Neste exemplo, temos uma classe Pessoa que no declarou o modificador, portanto o modificador o default.
Pessoa.java 01 02 03 04 05 06 07 08 package br.visibilidade; /** * Classe utilizada para representar uma Pessoa. */ class Pessoa { String nome; }

Se criarmos outra classe dentro do mesmo pacote da classe Pessoa, br.visibilidade, ento est classe tem acesso classe Pessoa tambm.
TestePessoaPacote.java 01 package br.visibilidade;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 113 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


02 03 04 05 06 07 08 09 10 11

/** * Classe utilizada para testar a classe Pessoa. */ public class TestePessoaPacote { public static void main(String[] args) { Pessoa pessoa = new Pessoa(); pessoa.nome = "Rafael Guimares Sakurai"; //OK } }

Agora se tentarmos utilizar a classe Pessoa, a partir de outro pacote, ter erro de compilao, pois no tem acesso.
TestePessoaPacote2.java 01 02 03 04 05 06 07 08 09 10 11 package br.visibilidade.outropacote; /** * Classe utilizada para testar a classe Pessoa. */ public class TestePessoaPacote2 { public static void main(String[] args) { Pessoa pessoa = new Pessoa(); //No encontra a classe Pessoa. pessoa.nome = "Cristiano Camilo dos Santos de Almeida"; } }

Quando tentamos compilar essa classe, temos a seguinte mensagem do compilador: C:\>javac br/visibilidade/outropacote/TestePessoaPacote2.java br\visibilidade\outropacote\TestePessoaPacote2.java:08: cannot symbol symbol: class Pessoa location: class br.visibilidade.outropacote.TestePessoaPacote2 Pessoa pessoa = new Pessoa(); br\visibilidade\outropacote\TestePessoaPacote2.java:08: cannot symbol symbol: class Pessoa location: class br.visibilidade.outropacote.TestePessoaPacote2 Pessoa pessoa = new Pessoa();

find

find

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 114 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Modificador de acesso: protected


protected um modificador um pouco menos restritivo que o default. Com este tipo modificador, podemos declarar que um atributo ou mtodo visvel apenas para as classes do mesmo pacote ou para as subclasses daquela classe. Neste exemplo, temos a classe Produto, e est classe tem o atributo nomeProduto e os mtodos getNomeProduto() e setNomeProduto() que possuem o modificador protected.
Produto.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package br.visibilidade; /** * Classe utilizada para representar um Produto. */ public class Produto { protected String nomeProduto; protected void setNomeProduto(String nomeProduto) { this.nomeProduto = nomeProduto; } protected String getNomeProduto() { return nomeProduto; } }

Se criarmos outra classe no pacote br.visibilidade, podemos utilizar os atributos e mtodos protected declarados na classe Produto.
TesteProdutoPacote.java 01 02 03 04 05 06 07 08 09 10 package br.visibilidade; /** * Classe utilizada para testar a visibilidade protected * do atributo e mtodos da classe Produto. */ public class TesteProdutoPacote { public static void main(String[] args) { Produto prodLapis = new Produto(); prodLapis.nomeProduto = "Lapis";

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 115 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


11 12 13 14 15 16 17 System.out.println(prodLapis.getNomeProduto()); Produto prodCaneta = new Produto(); prodCaneta.setNomeProduto("Caneta"); System.out.println(prodCaneta.getNomeProduto()); } }

Se criarmos uma classe em um pacote diferente, no conseguiremos utilizar os atributos e mtodos da classe Produto, pois no temos acesso ao mtodo.
TesteProdutoOutroPacote.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package br.visibilidade.outropacote; import br.visibilidade.Produto; /** * Classe utilizada para testar a visibilidade protected * do atributo e mtodos da classe Produto a partir de outro * pacote. */ public class TesteProdutoOutroPacote { public static void main(String[] args) { Produto prodCaneta = new Produto(); prodCaneta.setNomeProduto("Caneta"); System.out.println(prodCaneta.getNomeProduto()); } }

Se a classe que est em outro pacote for uma subclasse da classe Produto, ento est classe recebe atravs da herana os atributos e mtodos protected. (Veremos o conceito de herana mais adiante.)
SubProdutoOutroPacote.java 01 02 03 04 05 06 07 08 09 package br.visibilidade.outropacote; import br.visibilidade.Produto; /** * Classe utilizada para representar um Produto. */ public class SubProdutoOutroPacote extends Produto { public String getProduto() {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 116 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


10 11 12 return "Produto: " + getNomeProduto(); } }

Modificador de acesso: public


public o modificador menos restritivo de todos os demais. Declarando classes, atributos ou mtodos com este modificador, automaticamente dizemos que aquela propriedade acessvel a partir de qualquer outra classe. OBS: Dentro de um arquivo .java, s pode existir uma classe do tipo public, e est classe precisa obrigatoriamente ter o mesmo nome que o nome do arquivo .java. Alm dos modificadores de acesso, temos vrios outros modificadores que sero abordados futuramente. A seguir, temos uma relao de todos os modificadores e os seus respectivos impactos quando aplicados a Classes, Mtodos e Atributos. Modificador private protected default public abstract final static native transient synchonized Em uma classe No aplicvel No aplicvel Somente pacote Acesso total No instncia Sem herana No aplicvel No aplicvel No aplicvel No aplicvel Em um mtodo Acesso pela classe Acesso pelo pacote e subclasses Acesso pelo pacote Acesso total Deve ser sobrescrito Acesso pela classe Indica cdigo nativo No aplicvel Em um atributo Acesso pela classe Acesso pelo pacote e subclasses Acesso pelo pacote Acesso total No aplicvel Acesso pela classe No aplicvel No serializavel

No pode ser sobrescrito CONSTANTE

Sem acesso simultneo No aplicvel

Exerccios
1-) Qual das alternativas abaixo esta correta: package p1; public class Pessoa { private String texto = ""; Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 117 -

Programao Orientada a Objetos Universidade Metodista de So Paulo protected void dizer(String texto) { System.out.println(texto); } } package p2; public class TestePessoa { public static void main (String[] args) { Pessoa p = new Pessoa(); p.dizer("Ola"); } } a) Imprime "Ola"; b) No imprime nada c) No compila d) Erro em tempo de execuo

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 118 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

11. Encapsulamento

Encapsular, nada mais do que proteger membros de outra classe de acesso externo, permitindo somente sua manipulao de forma indireta. Isso possvel da seguinte maneira: Consideremos o seguinte exemplo de uma classe Livro:
Livro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package br.encapsulamento; /** * Classe utilizada para representar o Livro. */ public class Livro { private String titulo; private String autor; public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 119 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


25 }

Note que os dois atributos da classe (titulo e autor) so do tipo private, que permite apenas o acesso destas informaes a partir da prpria classe, logo para que seja possvel ler ou alterar essas informaes criamos mtodos ditos mtodos assessores ou ento getters e setters. A princpio parece ser algo sem muita utilidade, mas desta forma podemos criar atributos os quais podemos apenas ler informaes ou ainda gerar tratamentos especficos sempre que outra classe solicita a alterao de um atributo de nossa classe. Encapsule aquilo que pode ser alterado com frequncia na sua aplicao, por exemplo:
Professor.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package br.encapsulamento; /** * Classe utilizada para representar um Professor */ public class Professor { private int registro; private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public int getRegistro() { return registro; } public void setRegistro(int registro) { this.registro = registro; } } Aluno.java 01 02 package br.encapsulamento;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 120 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /** * Classe utilizada para representar um Aluno. */ public class Aluno { private int matricula; private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } }

Note que os atributos das classes Professor e Aluno so private, dessa forma eles s podem ser acessados pelas suas classes, tambm criamos mtodos set (mtodos utilizados para alterar o valor de uma propriedade) e get (mtodo utilizado para obter o valor de uma propriedade) para cada atributo. Dado a classe Professor e Aluno, queremos consultar os alunos e professores pelo nome:
Consultar.java 01 02 03 04 05 06 07 08 09 10 11 package br.encapsulamento; /** * Classe utilizada para consultar os alunos e professores * atravs de seu nome. */ public class Consultar { public Aluno[] consultarAlunoPorNome(Aluno[] alunos, String nome) { Aluno[] alunosEncontrados = new Aluno[alunos.length]; int contAlunos = 0;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 121 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 for(int i = 0; i < alunos.length; i++) { if(alunos[i].getNome().equals(nome)) { alunosEncontrados[contAlunos++] = alunos[i]; } } Aluno[] retorno = new Aluno[contAlunos]; for(int i = 0; i < contAlunos; i++) { retorno[i] = alunosEncontrados[i]; } return retorno; } public Professor[] consultarProfessorPorNome(Professor[] professores, String nome) { Professor[] profEncontrados = new Professor[professores.length]; int contProfessores = 0; for(int i = 0; i < professores.length; i++) { if(professores[i].getNome().equals(nome)) { profEncontrados[contProfessores++] = professores[i]; } } Professor[] retorno = new Professor[contProfessores]; for(int i = 0; i < contProfessores; i++) { retorno[i] = profEncontrados[i]; } return retorno; } }

Agora digamos que nosso programa que busca os alunos e professores esta funcionando corretamente, e precisamos adicionar outra busca que procura coordenadores pelo seu nome.
Coordenador.java 01 02 03 04 package br.encapsulamento; /** * Classe utilizada para representar um Coordenador.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 122 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 */ public class Coordenador { private String cursoCoordenado; private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } }

Para consultar o coordenador pelo nome, precisamos usar um mtodo bem parecido com o que consulta o aluno e professor, mas se notarmos as classes Aluno, Professor e Coordenador tem o atributo nome em comum e exatamente por este atributo que os consultamos. Se criarmos uma classe Pessoa para ser uma classe Pai dessas classes e se a classe Pai tiver o atributo nome, ento todas as subclasses recebem este atributo por herana:
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 package br.encapsulamento; /** * Classe utilizada para representar um Pessoa. */ public class Pessoa { private String nome; public String getNome() { return nome; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 123 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


13 14 15 16 public void setNome(String nome) { this.nome = nome; } }

As subclasses Professor, Aluno e Coordenador ficaram da seguinte forma:


Professor.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package br.encapsulamento; /** * Classe utilizada para representar um Professor. */ public class Professor extends Pessoa { private int registro; public int getRegistro() { return registro; } public void setRegistro(int registro) { this.registro = registro; } } Aluno.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package br.encapsulamento; /** * Classe utilizada para representar um Aluno. */ public class Aluno extends Pessoa { private int matricula; public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 124 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Coordenador.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package br.encapsulamento; /** * Classe utilizada para representar o Coordenador. */ public class Coordenador extends Pessoa { private String cursoCoordenado; public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } }

Para consultar o Aluno, Professor e Coordenador vamos criar apenas um mtodo que recebe um vetor de Pessoa e o nome que ser procurado e retorna um vetor com as Pessoas encontradas:
ConsultarPessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 package br.encapsulamento; /** * Classe utilizada para consultar de uma forma genrica qualquer * subclasse de Pessoa atravs de seu nome. */ public class ConsultarPessoa { public Pessoa[] consultarAlunoPorNome(Pessoa[] pessoas, String nome) { Pessoa[] pessoasEncontradas = new Pessoa[pessoas.length]; int contPessoas = 0; for(int i = 0; i < pessoas.length; i++) { if(pessoas[i].getNome().equals(nome)) { pessoasEncontradas[contPessoas++] = pessoas[i]; } } Pessoa[] retorno = new Pessoa[contPessoas]; for(int i = 0; i < contPessoas; i++) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 125 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


20 21 22 23 24 25 retorno[i] = pessoasEncontradas[i]; } return retorno; } }

Dessa forma usamos herana e encapsulamos a forma de encontrar um Aluno, Pessoa e Coordenador, agora se tivermos que adicionar um Diretor, por exemplo, nosso mtodo de consulta no precisa ser alterado, precisamos apenas criar a classe Diretor e fazer ela filha da classe Pessoa.

Exerccios
1-) Crie uma classe chamada Comparador. Esta classe no deve possuir nenhum atributo e nenhum mtodo construtor. Esta classe deve possuir mtodos capazes de receber dois parmetros, compar-los e por fim retornar true, caso sejam iguais, e false caso sejam diferentes. public boolean comparaInt(int num1, int num2); public boolean comparaDouble(double num1, double num2); public boolean comparaString(String texto1, String texto2);

Lembre-se que em Java, as Strings so tratadas como objetos! Elabore um roteiro que teste os trs mtodos de sua nova classe. 2-) Crie uma classe chamada Pessoa com os seguintes atributos: String nome; int idade; E com um mtodo construtor que inicialize estes dois atributos. public Pessoa(String novoNome, int novaIdade); Feito isso, crie uma classe de teste e instancie cinco pessoas com os seguintes atributos: 1- Joo, 24 anos ( ex: Pessoa pessoa1 = new Pessoa(Joo, 24); ) 2- Carlos, 24 anos 3- Joo, 32 anos 4- Joo, 32 anos 5 = 3 (ao invs de utilizar o construtor, inicialize-a com a 3 Pessoa ex: Pessoa pessoa1 = pessoa3; ) Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 126 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Agora, compare-os da seguinte maneira e imprima os resultados... if(1==2) if(3==4) if(1.idade == 2.idade) if(1.nome.equals(4.nome)) if(5==3) 3-) Crie uma classe que serve como utilitrio para String, est classe tem um mtodo que recebe uma String texto e um varargs de String parmetros, voc deve ler atravs da console, qual o texto, quantos parmetros tem no texto e quais so os parmetros, por exemplo: texto = Oi, meu nome {0} e tenho {1} anos. quantidade de parmetros 2 parmetros: Rafael e 24 Depois de ler esses dados seu programa deve imprimir: Oi, meu nome Rafael e tenho 24 anos. OBS: O texto pode ter {n} parmetros, este apenas um exemplo. 4-) Crie uma classe com visibilidade default chamada ContaBancaria, pertencente ao pacote metodista.poo.aula10.banco com os seguintes atributos:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 127 -

Programao Orientada a Objetos Universidade Metodista de So Paulo E a classe filha public final ContaCorrente , pertencente tambm ao pacote metodista.poo.aula10.banco, com o seguinte atributo:

Para testarmos nossa classe, crie uma classe de teste que deve pertencer ao pacote metodista.poo.aula10, depois instancie um objeto do tipo ContaCorrente. Teste todas as formas de acesso possveis aos membros da classe ContaBancaria e ContaCorrente. Note que a partir da classe de teste voc no dever conseguir instanciar um objeto do tipo ContaBancaria e que a classe ContaCorrente no dever suportar nenhuma subclasse.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 128 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

12. Interfaces

Interface um recurso da linguagem Java que apresenta inmeras vantagens no sentido da modelagem e instanciao de objetos, porm deve-se entender claramente os conceitos bsicos da orientao a objetos a fim de utiliz-la plenamente. Uma interface similar a um contrato, atravs dela podemos especificar quais mtodos as classes que implementam esta interface so obrigados a implementar. Exemplo de interface UML:

ou Estes so dois modos de se representar uma interface utilizando a UML, criamos uma interface chamada Banco, em Java est interface fica do seguinte modo:
Banco.java 01 02 03 04 05 06 package material.exemploInterface; /** * Interface utilizada para representar os mtodos minimos que * os bancos precisam implementar. */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 129 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


07 08 09 10 11 12 public interface Banco { public abstract void manutencaoConta(Conta conta); public abstract boolean saque(Conta conta, double valor); public abstract boolean deposito(Conta conta, double valor); public abstract void extrato(Conta conta); }

Para criarmos uma interface em Java, utilizamos a palavra interface antes do seu nome. Na interface declaramos os mtodos de forma abstrata, tendo apenas sua assinatura e terminando com ponto e vrgula ( ; ) e todos os mtodos precisam ser pblicos. Podemos declarar atributos, porm todos os atributos de uma interface so constantes publicas. Uma interface pode estender (sub-interface) outras interfaces. Dentro da interface no podemos: - implementar mtodo - construtor - estender classe - implementar outra interface - no pode ser final Quando uma classe implementa uma interface, est classe obrigatoriamente precisa implementar todos os mtodos declarados na interface, apenas quando usamos classes abstratas implementando interface que no precisamos obrigatoriamente implementar todos os mtodos (classes abstratas sero vistas mais para frente). Na UML a implementao de uma interface feita da seguinte forma:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 130 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste exemplo, temos duas classes BancoSakurai e BancoCristiano implementando a interface Banco. Nas classes podem ser feitas implementaes diferentes dos mtodos, mas as assinaturas dos mtodos precisam ser iguais as da interface, podemos tambm adicionar mais mtodos que os obrigatrios. Neste exemplo tambm estamos usando uma classe conta:
Conta.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package material.exemploInterface; /** * Classe utilizada para representar uma Conta bancaria. */ public class Conta { /** * Nome do proprietario da Conta. */ private String nomeProprietario; /** * Nmero da Conta. */ private int numero; /** * Saldo da Conta. */ private double saldo; public String getNomeProprietario() { return nomeProprietario; } public void setNomeProprietario(String nomeProprietario) { this.nomeProprietario = nomeProprietario; } public int getNumero() { return numero; } public void setNumero(int numero) { this.numero = numero;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 131 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


36 37 38 39 40 41 42 43 44 45 } public double getSaldo() { return saldo; } public void setSaldo(double saldo) { this.saldo = saldo; } }

O cdigo Java dessas duas classes ficam da seguinte forma:


BancoSakurai.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 //Verifica se tem saldo para realizar a manuteno da conta. public void manutencaoConta(Conta conta) { boolean temSaldo = conta.getSaldo() >= 0.25; } /** * Construtor padro da classe. * * Cria uma conta para o banco sakurai. */ public BancoSakurai() { this.contaBancoSakurai = new Conta(); this.contaBancoSakurai.setNomeProprietario("Banco Sakurai"); this.contaBancoSakurai.setNumero(0); this.contaBancoSakurai.setSaldo(0d); /** * Classe utilizada para representar o Banco Sakurai */ public class BancoSakurai implements Banco { /** * Conta que representa o Banco Sakurai. */ private Conta contaBancoSakurai; package material.exemploInterface;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 132 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 public void extrato(Conta conta) { } public boolean deposito(Conta conta, double valor) { //Realiza o deposito na conta. double novoValor = conta.getSaldo() + valor; conta.setSaldo(novoValor); System.out.println("Deposito efetuado!!!"); return true; } } //Toda vez que fizer um saque faz cobra a manuteno da conta. manutencaoConta(conta); return true; } else { System.out.println("No conseguiu fazer o saque!!!"); //Se no conseguir fazer o saque, mostra o extrato da conta. extrato(conta); return false; public boolean saque(Conta conta, double valor) { //Verifica se tem saldo suficiente para fazer o saque if(conta.getSaldo() >= valor) { //Realiza o saque na conta. double novoValor = conta.getSaldo() - valor; conta.setSaldo( novoValor ); System.out.println("Saque efetuado!!!"); } } //Deposita o dinheiro da manutencao na conta do banco sakurai. deposito(this.contaBancoSakurai, 0.25); } else { System.out.println("No conseguiu cobrar a manuteno da conta" + conta.getNumero() + " !!!"); if(temSaldo) { double novoSaldo = conta.getSaldo() - 0.25; conta.setSaldo(novoSaldo);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 133 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 } } } public boolean transferencia(Conta contaOrigem, Conta contaDestino, double valor) { boolean fezSaque = saque(contaOrigem, valor); //Verifica se conseguiu sacar dinheiro na conta de origem. if(fezSaque) { //Faz o deposito na conta de destino. deposito(contaDestino, valor); System.out.println("Transferencia efetuada."); return true; } else { System.out.println("No conseguiu fazer a transferencia."); return false; } System.out.println("\n -- BANCO SAKURAI -- \n"); System.out.println("-> EXTRATO CONTA\n"); System.out.println("Nome: " + conta.getNomeProprietario()); System.out.println("Numero: " + conta.getNumero()); System.out.println("Saldo: " + conta.getSaldo()); System.out.println("\n---------------------\n");

Nesta implementao o BancoSakurai alem de fornecer os mtodos obrigatrios da interface Banco, tambm disponibiliza um mtodo adicional chamado transferencia(Conta contaOrigem, Conta contaDestino, double valor).
BancoCristiano.java 01 02 03 04 05 06 07 08 09 10 11 12 13 package material.exemploInterface; /** * Classe utilizada para representar o Banco Cristiano. */ public class BancoCristiano implements Banco { private Conta contaBancoCristiano; public BancoCristiano() { this.contaBancoCristiano = new Conta(); this.contaBancoCristiano.setNomeProprietario("Banco Cristiano"); this.contaBancoCristiano.setNumero(0); this.contaBancoCristiano.setSaldo(0d);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 134 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 } public void manutencaoConta(Conta conta) { //Sempre executa o saque na conta bancaria. double novoSaldo = conta.getSaldo() - 0.01; conta.setSaldo(novoSaldo); //Deposita o dinheiro da manuteno na conta do Banco Cristiano. double saldoBanco = this.contaBancoCristiano.getSaldo() + 0.01; this.contaBancoCristiano.setSaldo(saldoBanco); } public boolean saque(Conta conta, double valor) { //Verifica se tem saldo suficiente para fazer o saque if(conta.getSaldo() >= valor) { //Realiza o saque na conta. double novoValor = conta.getSaldo() - valor; conta.setSaldo( novoValor ); System.out.println("Saque efetuado!!!"); //Toda vez que fizer um saque faz cobra a manuteno da conta. manutencaoConta(conta); return true; } else { System.out.println("No conseguiu fazer o saque!!!"); //Se no conseguir fazer o saque, mostra o extrato da conta. extrato(conta); return false; } } public boolean deposito(Conta conta, double valor) { //Realiza o deposito na conta. double novoValor = conta.getSaldo() + valor; conta.setSaldo(novoValor); System.out.println("Deposito efetuado!!!"); //Toda vez que fizer um deposito faz cobra a manuteno da conta. manutencaoConta(conta); return true; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 135 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


57 58 59 60 61 62 63 64 65 public void extrato(Conta conta) { System.out.println("\n -- BANCO CRISTIANO -- \n"); System.out.println("-> EXTRATO CONTA\n"); System.out.println("Nome: " + conta.getNomeProprietario()); System.out.println("Numero: " + conta.getNumero()); System.out.println("Saldo: " + conta.getSaldo()); System.out.println("\n---------------------\n"); } }

Nesta classe BancoCristiano, podemos ver que ele possui apenas os mtodos obrigatrios da interface Banco. Est implementao tem um algoritmo diferente do BancoSakurai, aqui o mtodo manutencaoConta() tem um valor que ser retirado da conta mesmo que a conta no tenha mais saldo. Assim podemos perceber que a interface serve como uma base, informando os mtodos mnimos que devem ser implementados e cada classe responsvel pela lgica de negocio utilizado nos mtodos.
BancoTeste.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 package material.exemploInterface; /** * Classe utilizada para testar a interface Banco, e as * classes BancoCristiano e BancoSakurai. */ public class BancoTeste { public static void main(String[] args) { Banco bancoCristiano = new BancoCristiano(); Conta contaC = new Conta(); contaC.setNomeProprietario("Cristiano Camilo"); contaC.setNumero(1); contaC.setSaldo(1000); bancoCristiano.deposito(contaC, 150.50); bancoCristiano.saque(contaC, 500); bancoCristiano.extrato(contaC); Banco bancoSakurai = new BancoSakurai(); Conta contaS = new Conta(); contaS.setNomeProprietario("Rafael Sakurai");

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 136 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


22 23 24 25 26 27 28 29 contaS.setNumero(1); contaS.setSaldo(500); bancoSakurai.deposito(contaS, 40.99); bancoSakurai.saque(contaS, 300); bancoSakurai.extrato(contaS); } }

Neste exemplo criamos dois bancos e duas contas e fizemos algumas operaes em cima das contas e no final imprimimos o extrato das contas. Note a seguinte sintaxe: Banco bancoCristiano = new BancoCristiano(); Repare que estamos criando uma varivel bancoCristiano do tipo da interface Banco, depois estamos criando um objeto da classe BancoCristiano que uma classe que implementa a interface Banco. Este tipo de sintaxe muito usado quando usamos polimorfismo. (Polimorfismo ser abordado mais adiante) Quando executarmos a classe BancoTeste, temos a seguinte sada no console: C:\>javac material\exemploInterface\BancoTeste.java C:\>java material.exemploInterface.BancoTeste Deposito efetuado!!! Saque efetuado!!! -- BANCO CRISTIANO --> EXTRATO CONTA Nome: Cristiano Camilo Numero: 1 Saldo 650.48 ---------------------Deposito efetuado!!! Saque efetuado!!! Deposito efetuado!!! -- BANCO SAKURAI --> EXTRATO CONTA

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 137 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Nome: Rafael Sakurai Numero: 1 Saldo: 240.74 ---------------------Quando usamos uma varivel usando o tipo interface, podemos apenas chamar os mtodos que possuem na interface, a seguinte linha causar um erro de compilao: bancoSakurai.transferencia(contaS, contaC, 1000.00); Neste exemplo teremos um erro de compilao, pois a interface Banco no tem a assinatura para o mtodo transferencia(Conta contaOrigem, Conta contaDestino, double valor), este mtodo disponibilizado atravs da classe BancoSakurai, ento para us-lo precisaremos de uma varivel do tipo BancoSakurai. BancoSakurai banco = new BancoSakurai(); Uma interface em Java, aps sua compilao, tambm gera um arquivo .class, assim como qualquer outra classe em Java.

Exerccios
1-) Vamos criar um programa Java para ordenar vrios tipos de objeto diferente, utilizando o algoritmo de Bubble Sort. Para isto vamos utilizar uma interface chamada Comparavel. Esta interface ir possuir a assinatura de mtodo que todas as classes que desejam ser comparadas precisa implementar:
Comparavel.java 01 02 03 04 05 06 07 08 09 10 11 package metodista.exercicioInterface; /** * Interface que deve ser implementada por todas as classes que * devem ser ordenadas. */ public interface Comparavel { /** * Assinatura de mtodo que toda classe que quer permitir * a comparao entre seus objetos precisa implementar.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 138 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


12 13 14 15 16 17 18 19 * * @param o - Objeto que ser comparado. * @return 0 se os objetos forem iguais. * > 0 se o objeto recebido menor que o objeto que ser comparado. * < 0 se o objeto recebido maior que o objeto que ser comparado. */ public abstract int comparar(Object o); }

Vamos criar uma classe que ordena um array de objetos que so do tipo Comparavel:
Ordenar.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package metodista.exercicioInterface; /** * Classe utilizada para ordenar qualquer tipo de classe * que implementa a interface Comparavel. */ public class Ordenar { /** * Mtodo que utiliza o algoritmo de bubble sort * para ordenar um vector de objetos do tipo <code>Comparavel</code>. * * @param objetos - Vetor de objetos que sero ordenados. */ public void ordenar(Comparavel[] objetos) { for(int i = 0; i < objetos.length; i++) { for(int j = i + 1; j < objetos.length; j++) { /* Verifica se os objetos no esto na ordem. */ if(objetos[i].comparar(objetos[j]) > 0) { /* Troca os objetos de lugar no vetor. */ Comparavel temp = objetos[i]; objetos[i] = objetos[j]; objetos[j] = temp; } } } } }

Como todos os objetos que so comparveis implementam a interface Comparavel, ento criamos o mtodo ordenar, que recebe um vetor de objetos do tipo Comparavel, e como uma classe implementa os mtodos da interface, sabemos que todas as classes Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 139 -

Programao Orientada a Objetos Universidade Metodista de So Paulo comparveis tero o mtodo comparar, por isso podemos ordenar os objetos usando o mtodo objeto[i].comparar(objeto[j]). Agora, vamos criar uma classe que implemente a interface Comparavel. Quando uma classe implementa uma interface, esta classe, obrigatoriamente, precisa implementar todos os mtodos declarados na interface. Apenas quando usamos classes abstratas implementando interface que no precisamos, obrigatoriamente, implementar todos os mtodos.
Livro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package metodista.exercicioInterface; /** * Classe utilizada para representar um Livro, est classe * implementa a interface Comparavel. */ public class Livro implements Comparavel { private String autor; private String titulo; public Livro(String autor, String titulo) { this.autor = autor; this.titulo = titulo; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public int comparar(Object o) { int comparacao = 0;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 140 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


35 36 37 38 39 40 41 42 43 44 45 46 47 //Verifica se o objeto que vai comparar do tipo Livro. if(o instance of Livro) { Livro livro = (Livro) o; comparacao = this.getAutor().compareTo(livro.getAutor()); //Se os autores forem iguais, compara o titulo dos livros. if(comparacao == 0) { comparacao = this.getTitulo().compareTo(livro.getTitulo()); } } return comparacao; } }

A classe livro implementou o mtodo comparar para fazer a comparao de acordo com o autor e ttulo do livro. Agora, vamos criar uma classe para testar a ordenao de um vetor de Livros.
TestarOrdenacao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package metodista.exercicioInterface; /** * Classe utilizada para testar a ordenao generica. */ public class TestarOrdenacao { public static void main(String[] args) { /* Cria um vetor de livros. */ Livro[] livros = new Livro[4]; livros[0] = new Livro("Sakurai", "Almoando com Java"); livros[1] = new Livro("Cristiano", "Classes Java em fila indiana"); livros[2] = new Livro("Sakurai", "Java em todo lugar"); livros[3] = new Livro("Cristiano", "Viajando no Java"); /* Ordena os livros */ Ordenar o = new Ordenar(); o.ordenar(livros); /* Imprime os livros ordenados. */ for(int cont = 0; cont < livros.length; cont++) { System.out.println("Autor: " + livros[cont].getAutor()); System.out.println("Livro: " + livros[cont].getTitulo()); System.out.println("\n--------\n");

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 141 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


24 25 26 } } }

Quando chamamos o.ordenar(livros), estamos passando o vetor de objetos livros para ser ordenado. Como Livro implementa Comparavel podemos passar um objeto do tipo Livro em que esperado um objeto do tipo Comparavel. O mtodo ordenar() ir chamar o mtodo comparar() que foi implementado pela classe Livro, isto feito em tempo de execuo da aplicao, a JVM verifica qual o tipo da classe do objeto e chama o mtodo que foi implementado nele, isto chamado de Polimorfismo. Quando testamos esta classe, temos a seguinte sada: Autor: Cristiano Titulo: Classes Java em fila indiana. --------Autor: Cristiano Titulo: Viajando no Java --------Autor: Sakurai Titulo: Almoando com Java --------Autor: Sakurai Titulo: Java em todo lugar --------2-) Crie uma classe Animal que possui os atributos especie e raca, faa est classe implementar a interface Comparavel, e implemente o mtodo comparar de forma que compare por especie e raca. Teste a ordenao da classe Animal.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 142 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

13. Herana

Em Java, podemos criar classes que herdem atributos e mtodos de outras classes, evitando rescrita de cdigo. Este tipo de relacionamento chamado de Herana. Para representarmos este tipo de relacionamento na linguagem, devemos utilizar a palavra reservada extends, de forma a apontar para qual classe a nossa nova classe deve herdar seus atributos e mtodos. Neste exemplo, demonstraremos a vantagem do reaproveitamento de cdigo utilizando a Herana. Temos as classes Funcionario e Coordenador que possuem o atributo nome e matricula em comum.
Funcionario.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 package material.heranca; /** * Classe utilizada para representar o Funcionario. */ public class Funcionario { private String nome; private int matricula; private String departamento; public Funcionario(String nome, int matricula, String departamento) { this.nome = nome; this.matricula = matricula; this.departamento = departamento; } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 143 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


20 21 22 23 24 25 26 27 public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getDepartamento() { return departamento; } public void setDepartamento(String departamento) { this.departamento = departamento; } } Coordenador.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package material.heranca; /** * Classe utilizada para representar o Coordenador. */ public class Coordenador { private String nome; private int matricula; private String cursoCoordenado; public Coordenador(String nome, int matricula, String cursoCoordenado) { this.nome = nome; this.matricula = matricula; this.cursoCoordenado = cursoCoordenado; } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } }

Como esses atributos, nome e matricula, so comuns para ambas as classes, e elas possuem algo a mais em comum que seu propsito, ambas so utilizadas para representar Pessoas.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 144 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Podemos criar uma classe Pessoa que ter os atributos nome e matricula, e por meio da herana reaproveitaremos esses atributos nas classes Funcionario e Coordenador.
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package material.heranca; /** * Classe utilizada para representar a Pessoa. */ public class Pessoa { private String nome; private int matricula; /** * Construtor que recebe o nome da pessoa. * * @param nome */ public Pessoa(String nome, int matricula) { this.nome = nome; this.matricula = matricula; } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }

Agora vamos alterar a classe Funcionario e Coordenador:


Funcionario.java 01 02 03 04 05 06 07 08 09 10 package material.heranca; /** * Classe utilizada para representar um Funcionario que uma Pessoa. */ public class Funcionario extends Pessoa { private String departamento; public Funcionario(String nome, int matricula, String departamento) { super(nome, matricula);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 145 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


11 12 13 14 15 16 17 18 this.departamento = departamento; } public String getDepartamento() { return departamento; } public void setDepartamento(String departamento) { this.departamento = departamento; } } Coordenador.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 package material.heranca; /** * Classe utilizada para representar um Coordenador que uma Pessoa. */ public class Coordenador extends Pessoa { private String cursoCoordenado; public Coordenador(String nome, int matricula, String cursoCoordenado) { super(nome, matricula); this.cursoCoordenado = cursoCoordenado; } public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } }

Com a declarao acima, temos as classes Funcionario e Coordenador como classes filha ou subclasses da classe pai Pessoa. Com isso podemos dizer que as subclasses Funcionario e Coordenador herdam todos os atributos e mtodos da sua super classe Pessoa. Por isso, lembre-se, o Funcionario UMA Pessoa, pois uma subclasse, logo, apenas possui algumas caractersticas a mais do que Pessoa, porm podemos sempre manuse-lo como uma Pessoa, logo, tambm possvel se fazer o seguinte tipo de declarao:
TesteFuncionario.java 01 02 03 04 package material.heranca; /** * Classe utilizada para testar a Herana da classe

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 146 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 * Funcionario. */ public class TesteFuncionario { public static void main(String[] args) { /* Declaraes comuns. */ Pessoa camilo = new Pessoa("Camilo", 123); Funcionario rafael = new Funcionario("Rafael", 111, "informatica"); /* Todo Funcionario uma Pessoa. */ Pessoa sakurai = new Funcionario("Sakurai", 222, "telecomunicao"); /* Erro de compilao, porque nem toda Pessoa um Funcionario. */ Funcionario cristiano = new Pessoa("Cristiano", 456); } }

Porm note que na linha 18, temos um erro de compilao, pois uma Pessoa nem sempre um Funcionario, afinal de contas, poderamos ter a seguinte situao:

Neste exemplo, temos a super classe Pessoa, e trs subclasses Funcionario, Aluno e Professor. Uma classe pode herdar apenas de uma classe (super classe). Quando uma classe no define explicitamente que est herdando outra classe ento, esta classe filha de java.lang.Object, ou seja, a classe Object a classe pai de todas as classes. Por Object ser pai de todas as classes, todas as classes herdam os seguintes mtodos dela:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 147 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Quando lidamos com classes que possuem a relao de herana, podemos fazer uso de duas palavras-chave que servem para identificar se estamos utilizando um mtodo e ou atributo da classe atual ou de sua super classe. Estes comandos so: this super Define que o recurso pertence classe atual. Define que o recurso pertence super classe.

Podemos visualizar que a classe Coordenador utiliza ambas as palavras-chaves:


Coordenador.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 package material.heranca; /** * Classe utilizada para representar um Coordenador que uma Pessoa. */ public class Coordenador extends Pessoa { private String cursoCoordenado; public Coordenador(String nome, int matricula, String cursoCoordenado) { super(nome, matricula); this.cursoCoordenado = cursoCoordenado; } public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } }

O construtor que recebe o nome, matrcula e curso do coordenador. Note que neste construtor temos a chamada super(nome, matricula), que ir chamar o construtor da classe Pessoa que recebe um String e um inteiro como parmetro.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 148 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Dentro deste mesmo construtor temos a seguinte chamada this.cursoCoordenado = cursoCoordenado . Utilizando a palavra-chave this , referenciaremos o atributo cursoCoordenador da prpria classe Coordenador.

Exerccios
1-) Crie uma classe Computador com os seguintes mtodos e atributos:

Feito isso, crie mais duas outras classes chamadas Desktop e Notebook, classes filhas de Computador, com os seguintes atributos e mtodos a mais, alguns sobrescritos: << Para resgatar as informaes da super classe use o modificador super >>

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 149 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Para testarmos nosso ambiente, crie uma classe de teste que instancie trs objetos, sendo um de cada um dos tipos. Para atestar a questo da herana, nos objetos dos tipos Notebook e Desktop, faa chamadas aos mtodos da super classe Computador como, por exemplo, o mtodo dizerInformacoes(). 2-) Crie uma classe Veculo com os seguintes mtodos e atributos:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 150 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Feito isso, crie mais trs subclasses filhas de Veiculo, atribuindo a cada uma delas um novo atributo e 2 novos mtodos. Crie um roteiro de testes que comprove o funcionamento de suas classes. 3-) Dado as classes abaixo informe qual(is) do(s) modificador(es) de acesso no podem ser utilizados no mtodo getNome() da classe Funcionrio. class Pessoa { String nome; String getNome() { return this.nome; } } class Funcionario extends Pessoa { String getNome() { return Funcionrio: + super.nome; } } a) b) c) d) private padro (default) protected public

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 151 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

14. Classes Abstratas

Em Java, temos um tipo especial de classe chamado classe abstrata. Este tipo de classe possui uma caracterstica muito especfica, que o de no permitir que novos objetos sejam instanciados a partir desta classe. Por este motivo, as classes abstratas possuem o nico propsito de servirem como super classes a outras classes do Java. Em Java definimos uma classe como abstrata utilizando a palavra reservada abstract na declarao da classe, por exemplo:
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 package material.abstrata; /** * Classe Abstrata representando uma Pessoa. */ public abstract class Pessoa { private String nome; public Pessoa(String nome) { this.nome = nome; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 152 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Na linha 6 estamos criando uma classe abstrata atravs da palavra-chave abstract. Uma classe abstrata desenvolvida para representar entidades e conceitos abstratos, sendo utilizada como uma classe pai, pois no pode ser instanciada. Ela define um modelo (template) para uma funcionalidade e fornece uma implementao incompleta - a parte genrica dessa funcionalidade - que compartilhada por um grupo de classes derivadas. Cada uma das classes derivadas completa a funcionalidade da classe abstrata adicionando um comportamento especfico. Uma classe abstrata normalmente possui mtodos abstratos. Esses mtodos so implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento especfico. O mtodo abstrato define apenas a assinatura do mtodo e, portanto, no contm cdigo assim como feito nas Interfaces. Uma classe abstrata pode tambm possuir atributos e mtodos implementados, componentes estes que estaro integralmente acessveis nas subclasses, a menos que o mesmo seja do tipo private. Como todo mtodo abstrato precisa ser implementado pela classe filha, ento no pode ser private, pois no seria visvel na subclasse. Neste exemplo, criaremos uma classe abstrata chamada Tela . Nesta classe implementaremos alguns mtodos que devem ser utilizados por todas as telas do computador de bordo de um veculo, como por exemplo, setTitulo() para informar o ttulo da tela e imprimir(), que imprime as informaes na tela. Nesta classe definiremos tambm a assinatura de um mtodo abstrato chamado obterInformacao(), que deve ser implementado pelas classes filhas.
Tela.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 package material.abstrata; /** * Classe abstrata que possui os mtodos bsicos para * as telas do computador de bordo de um veiculo. */ public abstract class Tela { private String titulo; public void setTitulo(String titulo) { this.titulo = titulo; } public abstract String obterInformacao();

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 153 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


16 17 18 19 20 public void imprimir() { System.out.println(this.titulo); System.out.println("\t" + obterInformacao()); } }

Agora criaremos a classe TelaKilometragem, que ser uma subclasse da classe abstrata Tela. Esta classe ser utilizada para mostrar a km atual percorrida pelo veculo.
TelaKilometragem.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package material.abstrata; /** * Tela que mostra a kilometragem percorrida por um veiculo. */ public class TelaKilometragem extends Tela { /* Atributo que guarda o valor da km atual do veiculo. */ int km = 0; /** * Construtor que iniciliza o titulo da tela. */ public TelaKilometragem() { /* Atribui o valor do titulo desta tela. */ super.setTitulo("Km Atual"); } /** * Implementa o mtodo abstrato da classe Tela, * neste mtodo buscamos a km atual do veiculo. * * @return Texto com a km atual. */ @Override public String obterInformacao() { km += 10; return String.valueOf(km) + " km"; } }

Vamos, agora, criar uma classe para testar a nossa aplicao. Neste teste, criaremos um objeto da classe TelaKilometragem e chamar o mtodo imprimir(), que esta classe herdou da classe Tela. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 154 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

TesteTelaKm.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 package material.abstrata; /** * Classe utilizada para testar a Tela Kilometragem. */ public class TesteTelaKm { public static void main(String[] args) { TelaKilometragem tk = new TelaKilometragem(); tk.imprimir(); System.out.println("\n------------\n"); tk.imprimir(); } }

Quando definimos Tela tk = new TelaKilometragem(), estamos guardando um objeto do tipo TelaKilometragem dentro de uma varivel do tipo Tela. Podemos fazer isso porque toda TelaKilometragem uma subclasse de Tela. Quando chamamos o mtodo tk.imprimir(), estamos chamando o mtodo que foi implementado na classe abstrata Tela, mas note que o mtodo imprimir() usa o mtodo obterInformacao(), que foi implementado na classe TelaKilometragem. Em tempo de execuo, a JVM verifica o tipo do objeto e chama o mtodo que foi implementado nele, isto chama-se Polimorfismo. Temos a seguinte sada no console: Km Atual " 10 km ---------Km Atual " 20 km Segue abaixo um quadro comparativo entre Interface e Classe Abstrata: Classe Abstrata Pode possui atributos de instncia Interface Possui apenas constantes

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 155 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Possui mtodos de diversas visibilidade e mtodos implementados ou abstratos estendida por classes (sub-classes) Uma subclasse s pode estender uma nica classe abstrata (regra bsica da herana em Java) Hierarquia de herana com outras classes abstratas Todos os mtodos so public e abstract implementada por classes Uma classe pode implementar mais de uma interface Hierarquia de herana com outras interfaces

Exerccios
1-) Crie uma classe abstrata chamada Animal, com a seguinte implementao:

Feito isso, desenvolva duas subclasses da classe Animal. Cada uma delas com a seguinte especificao:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 156 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 157 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Feito isso, crie uma classe para testar suas 2 subclasses. Tente instanciar diretamente a classe Animal. Crie o mtodo abaixo na classe principal, apenas para relembrar o conceito de generalizao:

2-) Analise o diagrama abaixo e desenvolva um sistema que ir imprimir a descrio que conter (titulo, artista, numero da faixa, data de fabricao no formato dd/MM/yyyy) e o valor do CD ou DVD com desconto e sem desconto.

Ao executar a classe Principal, teremos a seguinte sada no console: Sada: ################# Titulo: These days

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 158 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Artista: Bon Jovi Num Faixas: 1 Data de Fabricao: 21/03/2011 Sem desconto: R$100.0 Com desconto: R$85.0 ################# Titulo: Still in The Tail Artista: Scorpions Num Faixas: 3 Data de Fabricao: 01/01/2010 Sem desconto: R$120.0 Com desconto: R$108.0 3-) Continuando o exerccio 2, vamos criar uma venda de Produtos, em que um Cliente pode comprar quantos produtos ele quiser. Para dados de entrega do produto necessrio realizar o cadastro do endereo do cliente. Ao executar o programa, temos a seguinte sada no console: Sada: Cliente: Chimena #### Endereo de entrega #### Endereo: Rua Alfeu Tavares Nmero: 320 Bairro: Rudge Ramos Cidade: So Bernardo do Campo CEP: 09000-110 Produtos comprados: ################# Titulo: These days Artista: Bon Jovi Num Faixas: 1 Data de Fabricao: 23/03/2011 Sem desconto: R$100.0 Com desconto: R$85.0 ################# Titulo: Still in The Tail Artista: Scorpions Num Faixas: 3 Data de Fabricao: 01/01/2010 Sem desconto: R$120.0 Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 159 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Com desconto: R$108.0 Valor Total: R$220.0 Valor Com Desconto: R$193.0

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 160 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

15. Excees em Java

A linguagem Java possui um mecanismo especial para o tratamento de erros que possam ocorrer em tempo de execuo do programa. Diferentemente de outras linguagens, o surgimento de um erro ocasiona a interrupo imediata do programa, porm em Java podemos tratar esta situao de erro de uma forma adequada e evitando, assim, a interrupo do programa. Uma exceo, basicamente uma classe de Java representada na sua forma mais genrica pela classe java.lang.Exception, logo todas as excees que ocorram ao longo da execuo do seu programa podem ser tratadas como objetos do tipo Exception. Uma caracterstica importante sobre excees que, pelo fato delas poderem ocorrer a qualquer momento, estas so literalmente lanadas de volta para a cadeia de execuo e chamada das classes. Por exemplo:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 161 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Bloco try / catch


Como a exceo lanada por toda a cadeia de classes do sistema, a qualquer momento possvel se pegar essa exceo e dar a ela o tratamento adequado. Para se fazer este tratamento, necessrio pontuar que um determinado trecho de cdigo que ser observado e que uma possvel exceo ser tratada de uma determinada maneira, segue um exemplo deste novo bloco:
ExemploExcecao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 package material.excecao; /** * Classe utilizada para demonstrar o bloco try / catch. */ public class ExemploExcecao { public static void main(String[] args) { try { /* Trecho de cdigo no qual uma * exceo pode acontecer. */ } catch (Exception ex) { /* Trecho de cdigo no qual uma * exceo do tipo "Exception" ser tratada. */ } } }

No caso acima, o bloco try, o trecho de cdigo em que uma exceo esperada e o bloco catch, em correspondncia ao bloco try, prepara-se para pegar a exceo ocorrida e dar a ela o tratamento necessrio. Uma vez declarado um bloco try, a declarao do bloco catch torna-se obrigatria. Na linha 12 o bloco catch declara receber um objeto do tipo Exception, lembrando do conceito da herana, todas as excees do Java so classes filhas de Exception. Algo importante de ser comentado, que quando uma exceo ocorre, as demais linhas de cdigo deixam de ser executadas at encontrar o bloco catch que ir tratar a exceo. Exemplo:
ExemploTryCatch.java 01 package material.excecao;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 162 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

import java.util.Scanner; /** * Classe que demonstra o uso do try / catch. */ public class ExemploTryCatch { public static void main(String[] args) { Scanner s = new Scanner(System.in); try { System.out.print("Digite um valor inteiro..:"); int numero1 = s.nextInt(); System.out.print("Digite um valor inteiro..:"); int numero2 = s.nextInt(); System.out.println(numero1+ " + " + numero2 + " = " + (numero1+numero2)); } catch (Exception ex) { System.out.println("ERRO - Valor digitado nao e um numero inteiro!"); } } }

Observemos o exemplo acima. Neste cdigo, caso acontea um erro na linha 13, as linhas de 14 a 17 no seriam executadas, retornando ento o cdigo a ser executado apenas a partir da linha 19 (trecho correspondente ao bloco catch). Uma vez que uma exceo foi tratada por um bloco catch, a execuo do programa segue normalmente. Caso no ocorra erro durante a execuo teremos a seguinte sada no console: C:\>javac material\excecao\ExemploTryCatch.java C:\>java material.excecao.ExemploTryCatch Digite um valor inteiro..:5 Digite um valor inteiro..:3 5 + 3 = 8 Se no lugar de um nmero inteiro for digitado outra informao teremos a seguinte sada no console: C:\>javac material\excecao\ExemploTryCatch.java C:\>java material.excecao.ExemploTryCatch Digite um valor inteiro..:10 Digite um valor inteiro..:abc Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 163 -

Programao Orientada a Objetos Universidade Metodista de So Paulo ERRO - Valor digitado nao e um numero inteiro!

Palavra chave throw


Tambm possvel que voc prprio envie uma exceo em alguma situao especifica, como por exemplo, em uma situao de login em que o usurio digita incorretamente sua senha. Para realizarmos tal tarefa necessria a utilizao da palavra chave throw da seguinte maneira: throw new << Exceo desejada >>(); Vamos ver um exemplo de lanamento de uma exceo do tipo Exception:
ExemploThrow.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package material.excecao; import java.util.Scanner; /** * Classe utilizada para demonstrar o uso da palavra chave throw, * utilizada quando queremos lanar uma exceo. */ public class ExemploThrow { public static final String SENHASECRETA = "123456"; public static void main(String[] args) { try { Scanner s = new Scanner(System.in); System.out.print("Digite a senha: "); String senha = s.nextLine(); if(!senha.equals(SENHASECRETA)) { throw new Exception("Senha invalida!!!"); } System.out.println("Senha correta!!!\nBem vindo(a)!!!"); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 164 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Note que, assim que a palavra throw for utilizada, a implementao do bloco try / catch ser obrigatria, caso a exceo em questo seja do tipo checked. Observe tambm que a palavra reservada new foi utilizada, visto que a exceo um novo objeto que deve ser criado na memria. Isso se faz necessrio para que a exceo possa ser lanada por toda a pilha de execuo at que seja devidamente tratada ou acarrete no trmino da aplicao. Quando executamos este cdigo, temos a seguinte sada no console, note que no primeiro teste entramos com uma senha invalida abc, portanto foi lanado a exceo, no segundo teste entramos com a senha valida 123456 e executamos a aplicao por completo. C:\>javac material\excecao\ExemploThrow.java C:\>java material.excecao.ExemploThrow Digite a senha: abc Senha invalida!!! C:\>javac material\excecao\ExemploThrow.java C:\>java material.excecao.ExemploThrow Digite a senha: 123456 Senha correta!!! Bem vindo(a)!!! Alguns mtodos importantes da classe Exception: Exception.printStackTrace(); Imprime em tela a pilha de execuo. Muito comum para auxiliar no diagnstico de erros. Exception.getMessage(); Retorna uma String com a mensagem contida na exceo. Exception.getClass(); Retorna uma String com o nome complete da classe da exceo.

Bloco finnaly
A palavra chave finally representa um trecho de cdigo que ser sempre executado, independentemente se uma exceo ocorrer. Por exemplo:
ExemploFinally.java 01 02 03 04 05 package material.excecao; import java.util.Scanner; /**

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 165 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 * Classe que demonstra o uso do bloco finally. */ public class ExemploFinally { public static void main(String[] args) { Scanner s = new Scanner(System.in); try { int dividendo, divisor; System.out.print("Digite o valor do dividendo: "); dividendo = s.nextInt(); System.out.print("Digite o valor do divisor: "); divisor = s.nextInt(); if(divisor == 0) { throw new Exception("Nao eh permitido fazer uma divisao por zero!"); } System.out.println(dividendo+" / "+divisor+" = "+(dividendo / divisor)); } catch (Exception ex) { System.out.println("Erro: " + ex.getMessage()); } finally { System.out.println("Bloco Finally."); } } }

No exemplo anterior, a mensagem Bloco Final!, sempre ser exibida, ocorrendo ou no um Exception. Caso no ocorra erro durante a execuo teremos a seguinte sada no console: C:\>javac material\excecao\ExemploFinally.java C:\>java material.excecao.ExemploFinally Digite o valor do dividendo: 7 Digite o valor do divisor: 2 7 / 2 = 3 Bloco Finally Se digitarmos zero no valor do divisor ser lanado uma exceo, note que o bloco finally ser executado mesmo que ocorra alguma exceo: C:\>javac material\excecao\ExemploFinally.java C:\>java material.excecao.ExemploFinally Digite o valor do dividendo: 6 Digite o valor do divisor: 0 Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 166 -

Programao Orientada a Objetos Universidade Metodista de So Paulo ERRO: Nao eh permitido fazer uma divisao por zero! Bloco Finally O bloco finally muito utilizado quando queremos liberar algum recurso como, por exemplo, uma conexo com o banco de dados, um arquivo de dados, etc. Veremos mais adiante alguns cdigos que fazem uso do finally para este propsito.

Palavra chave throws


Caso em algum mtodo precise lanar uma exceo, mas voc no deseja trat-la, quer retorna-la para o objeto que fez a chamada ao mtodo que lanou a exceo, basta utilizar a palavra chave throws no final da assinatura do mtodo. Quando utilizamos o throws precisamos tambm informar qual ou quais excees podem ser lanadas. Exemplo:
ExemploThrows.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package material.excecao; import java.util.Scanner; /** * Classe utilizada para demonstrar o uso da palavra chave throws, * deixando para quem chamar o mtodo tratar alguma possivel exceo. */ public class ExemploThrows { public static void main(String[] args) { Scanner s = new Scanner(System.in); try { ExemploThrows et = new ExemploThrows(); System.out.print("Digite o valor do dividendo: "); double dividendo = s.nextDouble(); System.out.print("Digite o valor do divisor: "); double divisor = s.nextDouble(); double resultado = et.dividir(dividendo, divisor); System.out.println("O resultado da divisao eh: " + resultado);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 167 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


24 25 26 27 28 29 30 31 32 33 34 35 36 } catch (Exception ex) { System.out.println(ex.getMessage()); } } public double dividir(double dividendo, double divisor) throws Exception { if(divisor == 0) { throw new Exception("Nao e permitido fazer uma divisao por zero!"); } return dividendo / divisor; } }

Note que na linha 29 declaramos na assinatura do mtodo que ele pode ou no lanar uma exceo do tipo java.lang.Exception. E o mtodo public static void main(String[] args) ser responsvel por tratar alguma exceo que o mtodo dividir(double dividendo, double divisor) possa lanar. Caso no ocorra erro durante a execuo teremos a seguinte sada no console: C:\>javac material\excecao\ExemploThrows.java C:\>java material.excecao.ExemploThrows Digite o valor do dividendo: 7 Digite o valor do divisor: 2 O resultado da divisao eh: 3.5 Se digitarmos zero no valor do divisor ser lanado uma exceo pelo mtodo dividir(), esta exceo ser tratada pelo mtodo main(): C:\>javac material\excecao\ExemploThrows.java C:\>java material.excecao.ExemploThrows Digite o valor do dividendo: 5 Digite o valor do divisor: 0 Nao e permitido fazer uma divisao por zero!

Hierarquia das Exceptions


A princpio, Java possui diversos tipos especficos de exceo, cada um deles diretamente relacionado a uma operao especfica, por este motivo para que uma classe seja considerada uma exceo imprescindvel que ela de alguma forma seja filha de java.lang.Exception. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 168 -

Programao Orientada a Objetos Universidade Metodista de So Paulo As excees que so subclasses de java.lang.Exception so normalmente divididas em duas parte as Checked e Unchecked, que explicaremos mais adiante. No quadro abaixo, temos um exemplo da hierarquia de algumas subclasses de Exception. Uma das subclasses mais comuns a java.lang.RuntimeException, sobretudo para os usurios finais, pois como podem acontecer em qualquer parte do cdigo durante sua execuo, normalmente, quando no tratadas ocasionam na interrupo do programa.

Checked Exceptions
As checked exceptions, so excees j previstas pelo compilador. Usualmente so geradas pela palavra chave throw (que discutido mais adiante). Como ela prevista j em tempo de compilao, se faz necessria a utilizao do bloco try / catch ou da palavra chave throws. A princpio, todas as classes filhas de Exception so do tipo checked, exceto pelas subclasses de java.lang.RuntimeException (exceo em tempo de execuo).

Unchecked Exceptions
Um dos fatores que tornam a RuntimeException e suas classes filhas to especficas em relao as demais subclasses de Exception que elas so excees no diretamente Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 169 -

Programao Orientada a Objetos Universidade Metodista de So Paulo previstas por acontecer em tempo de execuo, ou seja, so unchecked exceptions. Por exemplo:
ExemploRuntimeException.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package material.excecao; import java.util.Scanner; /** * Classe utilizada para demonstrar excees filhas de RuntimeException. */ public class ExemploRuntimeException { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("Digite um numero inteiro..: "); int numero = s.nextInt(); System.out.println("Numero lido: " + numero); } }

Observe que no trecho de cdigo acima, temos uma varivel do tipo int recebendo uma entrada do usurio tambm do tipo int. Porm, vamos supor que nosso usurio no digite um inteiro, mas sim um caractere. C:\>javac material\excecao\ExemploRuntimeException.java C:\>java material.excecao.ExemploRuntimeException Digite um numero inteiro..: abc Exception in thread "main" java.util.InputMismatchException " at java.util.Scanner.throwFor(Unknown Source) " at java.util.Scanner.next(Unknown Source) " at java.util.Scanner.nextInt(Unknown Source) " at java.util.Scanner.nextInt(Unknown Source) " at material.excecao.ExemploRuntimeException.main(ExemploRuntime Exception.java:15) Este tipo de exceo, que acontece somente em tempo de execuo, a princpio no era tratado e uma exceo do tipo java.util.InputMismatchException ser gerada e nosso programa encerrado. Agora iremos prever este erro, utilizando o bloco try / catch:
ExemploRuntimeException2.java 01 02 03 package material.excecao; import java.util.InputMismatchException;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 170 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.util.Scanner; /** * Classe utilizada para demonstrar excees filhas de RuntimeException. */ public class ExemploRuntimeException2 { public static void main(String[] args) { int numero = 0; boolean validado = false; while(!validado) { try { Scanner s = new Scanner(System.in); System.out.print("Digite um numero inteiro..: "); numero = s.nextInt(); validado = true; } catch (InputMismatchException ex) { System.out.println("O valor inserido nao e um numero inteiro!"); } } System.out.println("O valor lido foi: " + numero); } }

Desta forma, a digitao incorreta do usurio ser tratada e uma mensagem de erro ser exibida caso uma exceo acontea, a varivel validado no receberia o valor true. C:\>javac material\excecao\ExemploRuntimeException2.java C:\>java material.excecao.ExemploRuntimeException2 Digite um numero inteiro..: abc O valor inserido nao e um numero inteiro! Digite um numero inteiro..: x O valor inserido nao e um numero inteiro! Digite um numero inteiro..: 7 O valor lido foi: 7

Errors
Errors so um tipo especial de Exception que representam erros da JVM, tais como estouro de memria, entre outros. Para este tipo de erro normalmente no feito tratamento, pois sempre quando um java.lang.Error ocorre a execuo do programa interrompida.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 171 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Tratando mltiplas Excees


possvel se tratar mltiplos tipos de exceo dentro do mesmo bloco try / catch, para tal, basta declara-los um abaixo do outro, assim como segue:
ExemploMultiplasExcecoes.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package material.excecao; import java.util.InputMismatchException; /** * Classe utilizada para demonstrar o uso de varios catchs. */ public class ExemploMultiplasExcecoes { public static void main(String[] args) { try { /* Trecho de cdigo no qual uma exceo pode acontecer. */ } catch (InputMismatchException ex) { /* Trecho de cdigo no qual uma exceo do tipo "InputMismatchException" ser tratada. */ } catch (RuntimeException ex) { /* Trecho de cdigo no qual uma exceo do tipo "RuntimeException" ser tratada. */ } catch (Exception ex) { /* Trecho de cdigo no qual uma exceo do tipo "Exception" ser tratada. */ } } }

OBS: As excees tratadas pelos catchs devem seguir a ordem da mais especifica para a menos especifica.

Criando sua exceo


Na linguagem Java podemos tambm criar nossas prprias excees, normalmente fazemos isso para garantir que nossos mtodos funcionem corretamente, dessa forma podemos lanar excees com mensagens de fcil entendimento pelo usurios, ou que possa facilitar o entendimento do problema para quem estiver tentando chamar seu mtodo possa tratar o erro.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 172 -

Programao Orientada a Objetos Universidade Metodista de So Paulo No exemplo abaixo vamos criar uma exceo chamada ErroDivisao que ser lanada quando ocorrer uma diviso incorreta, para isso precisamos criar esta classe filha de Exception.
ErroDivisao.java 01 02 03 04 05 06 07 08 09 10 package material.excecao; /** * Exceo que deve ser lanada quando uma diviso invalida. */ public class ErroDivisao extends Exception { public ErroDivisao() { super("Divisao invalida!!!"); } }

Agora vamos criar a classe TesteErroDivisao, que iremos utilizar para testar o lanamento da nossa exceo ErroDivisao, crie o mtodo restoDaDivisao que ir calcular o resto da diviso de dois nmeros e lanara a exceo ErroDivisao caso tenha o valor do divisor maior que o valor do dividendo.
TesteErroDivisao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 package material.excecao; import java.util.Scanner; /** * Classe utilizada para demonstrar o uso da exceo ErroDivisao. */ public class TesteErroDivisao { public static void main(String[] args) { try { Scanner s = new Scanner(System.in); System.out.print("Digite o valor do dividendo: "); int numero1 = s.nextInt(); System.out.print("Digite o valor do divisor: "); int numero2 = s.nextInt(); TesteErroDivisao teste = new TesteErroDivisao(); System.out.println("Resto: " + teste.restoDaDivisao(numero1, numero2)); } catch (ErroDivisao ex) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 173 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


22 23 24 25 26 27 28 29 30 31 32 33 System.out.println(ex.getMessage()); } } public int restoDaDivisao(int dividendo, int divisor) throws ErroDivisao { if(divisor > dividendo) { throw new ErroDivisao(); } return dividendo % divisor; } }

Quando executamos a classe TesteErroDivisao caso no ocorra nenhum problema ser apresentado o resto da diviso, se ocorrer algum erro ser apresentado a mensagem Diviso Invalida!!!. C:\>javac material\excecao\TesteErroDivisao.java C:\>java material.excecao.TesteErroDivisao Digite o valor do dividendo: 5 Digite o valor do divisor: 2 Resto: 1 C:\>javac material\excecao\TesteErroDivisao.java C:\>java material.excecao.TesteErroDivisao Digite o valor do dividendo: 3 Digite o valor do divisor: 7 Divisao invalida!!!

Exerccios
1-) Crie uma classe que aceite a digitao de dois nmeros e faa a diviso entre eles exibindo seu resultado. Sua classe deve tratar as seguintes excees: ArithmeticException e InputMismatchException 2-) Crie uma classe que crie um vetor de inteiros de 10 posies. Feito isso, permita que o usurio digite valores inteiros afim de preencher este vetor. No implemente nenhum tipo controle referente ao tamanho do vetor, deixe que o usurio digite valores at que a entrada 0 seja digitada.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 174 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Uma vez digitado o valor 0, o mesmo deve ser inserido no vetor e a digitao de novos elementos deve ser interrompida. Feita toda a coleta dos dados, exiba-os em tela. Sua classe deve tratar as seguintes excees: ArrayIndexOutOfBoundsException e InputMismatchException 3-) Crie uma classe Login com a seguinte modelagem: Login private String usuario; // Determina o nome do usurio private String senha; // Determina a senha do usurio. E os mtodos: public Login(String _usuario, String _senha) { // Construtor padro } public void setSenha (String _senha) { // Troca a senha do usurio. } public boolean fazerLogin(String _usuario, String _senha){ /* Deve receber informaes de usurio e senha e compara-las com as da classe. Caso sejam realmente iguais, deve retornar verdadeiro, ou ento deve lanar uma nova exceo dizendo qual credencial est errada, tratar essa exceo dentro do prprio mtodo imprimindo o erro em tela e por fim retornar false. Ex: try{ if(<<usurio incorreto>>) throw new Exception(Usurio incorreto); } catch (Exception e) { System.out.println(Erro); } */ } Feito isso, crie uma classe para testar a inicializao de um objeto do tipo Login e que utilize o mtodo fazerLogin, com informaes digitadas pelo usurio. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 175 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

4-) O que ser impresso se tentarmos compilar e executar a classe TesteExcecao? public class MinhaExcecao extends Exception {} public class TesteExcecao { public void teste() throws MinhaExcecao { throw new MinhaExcecao(); } public static void main(String[] args) { MinhaExcecao me = null; try { System.out.println("try "); } catch (MinhaExcecao e) { System.out.println("catch "); me = e; } finally { System.out.println("finally "); throw me; } System.out.println("fim"); } } a) b) c) d) e) Imprime Imprime Imprime Imprime Erro de "try " "try catch " "try catch finally " "try catch finally fim" compilao

5-) Crie uma classe chamada ContaBancaria, pertencente ao pacote exercicio. excecao.contas com os seguintes atributos: private double saldo; // Determina o saldo da conta. private double limite; // Determina o limite de crdito do cheque especial. E os mtodos: public ContaBancaria(double valorSaldo, double valorLimite){} Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 176 -

Programao Orientada a Objetos Universidade Metodista de So Paulo // Construtor padro da classe. public double getSaldo(){} // Retorna o saldo da conta. protected double getLimite(){} // Retorna o limite da conta. public double getSaldoComLimite(){} // Retorna o saldo da conta somado ao limite. public void sacar(double valor) throws ContaException {} // Deve decrementar o valor do saque da Conta. Retorna true caso a operao tenha sido bem sucedida, ou seja, a conta possui este valor (lembre-se de considerar o limite). public void depositar(double valor) throws ContaException {} // Deve incrementar o valor a Conta. E crie tambm a seguinte classe: ContaException extends Exception public ContaException (String _mensagem); Construtor padro da classe. Deve chamar o mesmo construtor da Superclasse. Requisitos A sua classe conta bancria deve permitir apenas saques inferiores a R$ 500,00 ou que no faam com que a soma entre o saldo e o limite da conta resultem em um valor menor do que zero. Caso estas condies no se cumpram, deve ser lanada uma ContaException com uma mensagem que identifique o tipo de erro. A conta no deve permitir depsitos superiores a R$ 1.000,00. Caso esta condio no se cumpra, deve ser lanada uma ContaException com uma mensagem que identifique o tipo de erro. Crie uma classe para testar a classe ContaBancaria

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 177 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

16. Polimorfismo

Quando trabalhamos com herana e dizemos que uma subclasse PessoaFisica e PessoaJuridica so filhas da super classe Pessoa, podemos ento dizer que um PessoaFisica e PessoaJuridica UMA Pessoa, justamente por ser uma extenso ou tipo mais especificado deste. Essa a semntica da herana.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 178 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Dizer que uma Pessoa UMA PessoaFisica est errado, porque ela pode tambm ser uma PessoaJuridica. Quando trabalhamos com uma varivel do tipo Pessoa que uma super classe, podemos fazer est varivel receber um objeto do tipo PessoaFisica ou PessoaJuridica, por exemplo:

Com isso, podemos dizer que polimorfismo a capacidade de um objeto ser referenciado de diversas formas diferentes e com isso realizar as mesmas tarefas (ou chamadas de mtodos) de diferentes formas. Um exemplo do uso do polimorfismo utilizando a classe Pessoa, seria todas as subclasses sobrescreverem o mtodo getNome().
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package material.polimorfismo; /** * Classe utilizada para representar uma Pessoa. */ public class Pessoa { private String nome; public String getNome() { return nome; } public void setNome(final String nome) { this.nome = nome; } } PessoaFisica.java 01 02 03 04 05 06 07 package material.polimorfismo; /** * Classe utilizada para representar uma Pessoa Fsica * que UMA subclasse de Pessoa. */ public class PessoaFisica extends Pessoa {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 179 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 private long cpf; public PessoaFisica() { } public long getCpf() { return cpf; } public void setCpf(long cpf) { this.cpf = cpf; } public String getNome() { return "Pessoa Fisica: " + super.getNome() + " - CPF: " + this.getCpf(); } }

A subclasse PessoFisica sobrescreve o mtodo getNome() e retorna a seguinte frase: Pessoa Fisica: nomePessoa CPF: cpfPessoa.
PessoaJuridica.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 } public void setCnpj(long cnpj) { this.cnpj = cnpj; } public long getCnpj() { return cnpj; public PessoaJuridica() { } /** * Classe utilizada para representar uma Pessoa Fisica * que UMA subclasse de Pessoa. */ public class PessoaJuridica extends Pessoa { private long cnpj; package material.polimorfismo;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 180 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


20 21 22 23 24 public String getNome() { return "Pessoa Juridica: " + super.getNome() + " - CNPJ: " + this.getCnpj(); } }

A subclasse PessoaJuridica sobrescreve o mtodo getNome() e retorna a seguinte frase: Pessoa Juridica: nomePessoa CNPJ: cnpjPessoa. Desta maneira, independentemente do nosso objeto PessoaFisica e PessoaJuridica ter sido atribudo a uma referencia para Pessoa, quando chamamos o mtodo getNome() de ambas variveis, temos a seguinte sada: Pessoa Fisica: Cristiano - CPF: 0 Pessoa Juridica: Rafael - CNPJ: 0 Exemplo:
TestePessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package material.polimorfismo; /** * Classe utilizada para demonstrar o uso do polimorfismo, * vamos criar um vetor de Pessoa e adicionar nele objetos * do tipo PessoaFisica e PessoaJuridica. */ public class TestePessoa { public static void main(String[] args) { Pessoa fisica = new PessoaFisica(); fisica.setNome("Cristiano"); fisica.setCpf(12345678901L); Pessoa juridica = new PessoaJuridica(); juridica.setNome("Rafael"); Pessoa[] pessoas = new Pessoa[2]; pessoas[0] = fisica; pessoas[1] = juridica; for(Pessoa pessoa : pessoas) { System.out.println(pessoa.getNome()); }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 181 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


24 25 } }

Sada: C:\>javac material\polimorfismo\TestePessoa.java C:\>java material.polimorfismo.TestePessoa Pessoa Fisica: Cristiano - CPF: 0 Pessoa Juridica: Rafael - CNPJ: 0 Mesmo as variveis sendo do tipo Pessoa, o mtodo getNome() foi chamado da classe PessoaFisica e PessoaJuridica, porque durante a execuo do programa, a JVM percebe que a varivel fisica est guardando um objeto do tipo PessoaFisica, e a varivel juridica est guardando um objeto do tipo PessoaJuridica. Note que neste exemplo apenas atribumos o valor do nome da Pessoa, no informamos qual o CPF ou CNPJ da pessoa, se tentarmos utilizar a varivel do tipo Pessoa para atribuir o CPF atravs do mtodo setCpf() teremos um erro de compilao, pois somente a classe PessoaFisica possui este mtodo: public static void main(String[] args) { Pessoa fisica = new PessoaFisica(); fisica.setNome("Cristiano"); fisica.setCpf(12345678901L); Durante a compilao teremos o seguinte erro informando que a classe material. polimorfismo.Pessoa no possui o mtodo setCpf(long): C:\>javac material\polimorfismo\TestePessoa.java material\polimorfismo\TestePessoa.java:12: cannot find symbol symbol : method setCpf(long) location: class material.polimorfismo.Pessoa " fisica.setCpf(12345678901L); ^ 1 error Ateno: mesmo o objeto sendo do tipo PessoaFisica, quando chamamos um mtodo atravs da classe Pessoa, s podemos chamar os mtodos que existem na classe Pessoa. Durante a execuo do programa, a JVM verifica qual a classe de origem do objeto e chama o mtodo desta classe. Para podermos atribuir o valor para CPF ou CNPJ, preciso ter variveis do tipo PessoaFisica e PessoaJuridica.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 182 -

Programao Orientada a Objetos Universidade Metodista de So Paulo No exemplo a seguir as variveis so do tipo PessoaFisica e PessoaJuridica, elas sero guardadas dentro de um vetor de Pessoa:
TestePessoa2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package material.polimorfismo; /** * Classe utilizada para demonstrar o uso do polimorfismo, * vamos criar um vetor de Pessoa e adicionar nele objetos * do tipo PessoaFisica e PessoaJuridica. */ public class TestePessoa2 { public static void main(String[] args) { PessoaFisica fisica = new PessoaFisica(); fisica.setNome("Cristiano"); fisica.setCpf(12345678901L); PessoaJuridica juridica = new PessoaJuridica(); juridica.setNome("Rafael"); juridica.setCnpj(1000100012345678L); Pessoa[] pessoas = new Pessoa[2]; pessoas[0] = fisica; pessoas[1] = juridica; for(Pessoa pessoa : pessoas) { System.out.println(pessoa.getNome()); } } }

Agora quando executarmos este programa tem a seguinte sada: C:\>javac material\polimorfismo\TestePessoa2.java C:\>java material.polimorfismo.TestePessoa2 Pessoa Fisica: Cristiano - CPF: 12345678901 Pessoa Juridica: Rafael - CNPJ: 1000100012345678 Se criarmos variveis do tipo PessoaFisica ou PessoaJuridica, atribuirmos os valores para nome e cpf ou cnpj, depois disso podemos fazer variveis do tipo Pessoa terem referencia para o mesmo objeto que as variveis do tipo PessoaFisica e PessoaJuridica, por exemplo:
TestePessoa3.java

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 183 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package material.polimorfismo; /** * Classe utilizada para demonstrar o uso do polimorfismo, * vamos criar duas variaveis do tipo Pessoa e adicionar nele objetos * do tipo PessoaFisica e PessoaJuridica. */ public class TestePessoa3 { public static void main(String[] args) { PessoaFisica fisica = new PessoaFisica(); fisica.setNome("Cristiano"); fisica.setCpf(12345678901L); PessoaJuridica juridica = new PessoaJuridica(); juridica.setNome("Rafael"); juridica.setCnpj(1000100012345678L); Pessoa pessoa1 = fisica; Pessoa pessoa2 = juridica; System.out.println("Pessoa 1"); System.out.println(pessoa1.getNome()); System.out.println("Pessoa 2"); System.out.println(pessoa2.getNome()); } }

Na linha 18 foi criado uma varivel pessoa1 do tipo Pessoa que recebe um objeto do tipo PessoaFisica. Na linha 19 foi criado uma varivel pessoa2 do tipo Pessoa que recebe um objeto do tipo PessoaJuridica. Quando executarmos este programa tem a seguinte sada: C:\>javac material\polimorfismo\TestePessoa3.java C:\>java material.polimorfismo.TestePessoa3 Pessoa 1 Pessoa Fisica: Cristiano - CPF: 12345678901 Pessoa 2 Pessoa Juridica: Rafael - CNPJ: 1000100012345678 Dessa vez o valor do cpf e cnpj so impressos, pois foram previamente preenchidos. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 184 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Casting (converso) de objetos


Vimos anteriormente que uma Pessoa (super classe) nem sempre UMA PessoaFisica (subclasse), mas quando estamos trabalhando com uma super classe e temos a certeza de qual o tipo de subclasse ele est representando podemos fazer o casting de objetos, para guardar o objeto em sua classe, funciona de forma similar ao casting de atributos primitivos. No exemplo a seguir, vamos criar duas variveis do tipo Pessoa com objetos do tipo PessoaFisica e PessoaJuridica, depois vamos tambm criar uma varivel do tipo Object (que a super classe de todas as classes) e guardar nela um objeto do tipo String.
TestePessoa4.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package material.polimorfismo; /** * Classe utilizada para demonstrar o uso do polimorfismo, * vamos criar duas variaveis do tipo Pessoa e adicionar nele objetos * do tipo PessoaFisica e PessoaJuridica. */ public class TestePessoa4 { public static void main(String[] args) { Pessoa pessoa1 = new PessoaFisica(); pessoa1.setNome("Cristiano"); Pessoa pessoa2 = new PessoaJuridica(); pessoa2.setNome("Rafael"); Object objeto = "Programacao Orientada a Objetos"; PessoaFisica fisica = (PessoaFisica) pessoa1; fisica.setCpf(12345678901L); PessoaJuridica juridica = (PessoaJuridica) pessoa2; juridica.setCnpj(1000100012345678L); String texto = (String) objeto; System.out.println(fisica.getNome()); System.out.println(juridica.getNome()); System.out.println(texto); }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 185 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


30 }

Na linha 18 estamos fazendo um casting de Pessoa para PessoaFisica. Na linha 21 estamos fazendo um casting de Pessoa para PessoaJuridica. Na linha 24 estamos fazendo um casting de Object para String. Temos a seguinte sada no console: C:\>javac material\polimorfismo\TestePessoa4.java C:\>java material.polimorfismo.TestePessoa4 Pessoa Fisica: Cristiano - CPF: 12345678901 Pessoa Juridica: Rafael - CNPJ: 1000100012345678 Programacao Orientada a Objetos

Exerccios
1-) Crie uma classe Funcionario com o seguinte atributo: private double salario; Determina o salrio do funcionrio. E os mtodos: public double getSalario(); Retorna o salrio do funcionrio. public double setSalario(double salario); Coloca valor no salrio do funcionrio. public double calcularParticipacaoNosLucros(); Retorna 0; E as seguintes classes filhas, com apenas um mtodo: << Gerente >> public double calcularParticipacaoNosLucros(); Calcula a participao nos lucros do funcionrio. Frmula: Salrio * 0,5 << Secretaria >> public double calcularParticipacaoNosLucros(); Calcula a participao nos lucros do funcionrio. Frmula: Salrio * 0,2

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 186 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Feito isso, instancie dois objetos de cada um dos tipos das subclasses, mas armazenando-os em referencias para Funcionario, da seguinte forma: Funcionario carlos = new Gerente(); Funcionario amanda = new Secretaria(); Teste o polimorfismo, referenciando o mtodo calcularParticipacaoNosLucros(). 2-) Crie uma classe Computador com os seguintes atributos: private int velocidadeDoProcessador; Determina a velocidade do processador. private int qtdMemoria; Determina a quantidade de memria. private String fabricanteDoProcessador; Determina a quantidade de memria. E os seguintes mtodos: public Computador(int vel, int memo, String proc); Construtor base da classe. public String dizerInformacoes(); Deve retornar o texto: Sou um computador. Meu processador + fabricanteDoProcessador + trabalha a uma velocidade + velocidadeDoProcessador + . Possuo + qtdMemoria + Mb de memria.. public final String getFabricanteDoProcessador(); Retorna o fabricante do processador. public final int getVelocidadeDoProcessador(); Retorna a velocidade do processador. public final int getQtdMemoria(); Retorna a quantidade de memria. Feito isso, crie mais duas outras classes chamadas Desktop e Notebook, classes filhas de Computador, com os seguintes atributos e mtodos a mais, alguns sobrescritos: << Notebook >> public int qtdAltoFalantes; Determina a quantidade de alto-falantes. public boolean possuiTouchPad; true caso possua touchPad e false caso no o possua.. E os seguintes mtodos:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 187 -

Programao Orientada a Objetos Universidade Metodista de So Paulo public Notebook(int vel, int memo, String proc); Construtor base da classe. Deve assumir que qtdAltoFalantes = 0 e possuiTouchPad = false. public Notebook(int vel, int memo, String proc, int falantes, boolean touch); Novo construtor da classe. public int getQtdAltoFalantes (); Retorna a quantidade de alto-falantes. public boolean isPossuiTouchPad(); Retorna true caso possua touchPad. public String retornaInformacoesCompletas(); Deve retornar o texto: Sou um notebook. Meu processador + super.getFabricanteDoProcessador() + trabalha a uma velocidade + super.getVelocidadeDoProcessador() + . Possuo + super.getQtdMemoria() + Mb de memria. Tenho um total de + qtdAltoFalantes + alto-falantes; << para resgatar as informaes da super classe use a palavra chave super >> public String dizerInformacoes(); Deve retornar o texto: Sou um notebook. Meu processador + fabricanteDoProcessador + trabalha a uma velocidade + velocidadeDoProcessador + . Possuo + qtdMemoria + Mb de memria.. << Desktop >> public String corDoGabinente; Determina a cor do gabinete. public int potenciaDaFonte; Inteiro que armazena a potncia da fonte. Ex: 300, 350, 400, etc. E os seguintes mtodos: public Desktop(int vel, int memo, String proc); Construtor base da classe. Deve assumir que corDoGabinete = new String(branco) e potenciaDaFonte = 400. public Desktop(int vel, int memo, String proc, String cor, int pot); Novo construtor da classe. public String getCorDoGabinente(); Retorna a cor do gabinete. public int getPotenciaDaFonte(); Retorna a potncia da fonte. public String retornaInformacoesCompletas(); Deve retornar o texto: Sou um desktop. Meu processador + super.getFabricanteDoProcessador() + Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 188 -

Programao Orientada a Objetos Universidade Metodista de So Paulo trabalha a uma velocidade + super.getVelocidadeDoProcessador() + . Possuo + super.getQtdMemoria() + Mb de memria. Meu gabinete de cor + corDoGabinete + .; << para resgatar as informaes da super classe use o modificador super >> public String dizerInformacoes(); Deve retornar o texto: Sou um desktop. Meu processador + fabricanteDoProcessador + trabalha a uma velocidade + velocidadeDoProcessador + . Possuo + qtdMemoria + Mb de memria.. Para testarmos nosso ambiente, crie uma classe Principal que instancie trs objetos, sendo um de cada um dos tipos. Para atestar a questo da herana, nos objetos dos tipos Notebook e Desktop, faa chamadas aos mtodos da super classe Computador como, por exemplo, o mtodo dizerInformacoes(). Feito isso, para testarmos o polimorfismo, instancie objetos dos tipos NoteBook e Desktop e atribua-os a referencias de Computador. Agora teste o polimorfismo, invocando o mtodo dizerInformacoes().

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 189 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

17. Conexo com bancos de dados - J.D.B.C.

O banco de dados onde persistimos (armazenamos) os dados que pertencem ao nosso sistema. A maioria dos bancos de dados comerciais hoje em dia do tipo relacional e derivam de uma estrutura diferente da orientada a objetos. Para executarmos o manuseio de informaes em um banco de dados, devemos fazer uso de sub-linguagens de banco de dados (Database Sub Language DSL), voltadas para as operaes do banco de dados. Geralmente, as sub-linguagens de dados so compostas da combinao de recursos para a definio de dados (Data Definition Language DDL) e recursos especficos para a manipulao de dados (Data Manipulation Language DML). A conhecida linguagem de consulta SQL (Structured Query Language) uma destas linguagens que fornece suporte tanto a DDL como a DML. Para efetivarmos a conexo de um programa desenvolvido em Java com uma base de dados qualquer, a linguagem Java implementa um conceito de ponte, que implementa todas as funcionalidades que um banco de dados padro deve nos fornecer.

No desenho acima podemos notar o relacionamento direto da JDBC com o banco de dados, porm este relacionamento depende tambm da extenso desta ponte que representada

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 190 -

Programao Orientada a Objetos Universidade Metodista de So Paulo pela implementao JDBC escolhida. Esta implementao depende do banco de dados com o qual queremos nos comunicar e a ela damos o nome de Driver. Para gerenciar estes drivers de conexo, a linguagem Java possui um gerente de drivers chamado java.sql.DriverManager. O driver do MySQL pode ser adicionado atravs das Propriedades do Projeto, na aba Biblioteca utilize o boto Adicionar Biblioteca e selecione MySQL JDBC Driver. OBS: caso voc queria colocar o driver de outro banco de dados preciso clicar no boto Adicionar JAR/Pasta e selecionar o arquivo .jar que representa o drive desejado (OBS: no site do fabricante possvel obter este driver).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 191 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Para criarmos uma conexo com o banco de dados primeiramente necessrio informarmos qual driver de conexo o DriverManager deve utilizar. Feita essa disponibilizao do arquivo de driver, na programao se faz necessrio registrar o driver do banco de dados no sistema. Para isso, basta carreg-lo atravs do mtodo Class.forName() . Esse mtodo abre uma classe que se registra com o DriverManager.getConnection(). A partir da classe DriverManager, podemos utilizar um mtodo chamado getConnection, com o qual poderemos nos conectar a uma determinada base de dados utilizando uma String padro de conexo.
Conexao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 } public Connection conectar() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root"); System.out.println("Conectou no banco de dados."); } catch (SQLException ex) { System.out.println("Erro: No conseguiu conectar no BD."); } catch (ClassNotFoundException ex) { System.out.println("Erro: No encontrou o driver do BD."); } /** * Classe utilizada para conectar e desconectar do banco de dados. */ public class Conexao { public static void main(String[] args) { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); conexao.desconectar(conn); import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; package material.jdbc;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 192 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 } } } } } catch (SQLException ex) { System.out.println("No conseguiu desconectar do BD."); public void desconectar(Connection conn) { try { if(conn != null && !conn.isClosed()) { conn.close(); System.out.println("Desconectou do banco de dados."); } return conn;

Na linha 20 estamos carregando o driver do banco de dados MySQL com.mysql.jdbc. Driver. Na linha 21, utilizamos o mtodo getConnection da classe DriverManager para criar uma conexo com o banco de dados armazenado em um objeto do tipo java.sql.Connection. O mtodo getConnection() recebe trs parmetros: 1 url de conexo com o banco de dados, 2 usurio e 3 senha. Para fazer a conexo com o banco de dados precisamos tratar algumas excees que podem ocorrer: Na linha 23, tratamos a exceo java.sql.SQLException que lanada caso no consiga criar uma conexo com o Banco de Dados. Na linha 25, tratamos a exceo java.lang.ClassNotFoundException que lanada caso no consiga carregar o driver do banco de dados. Depois de utilizar a conexo com o banco de dados muito importante que liberemos esta conexo, ou seja, precisamos encerrar a conexo com o banco de dados. Na linha 32 temos o mtodo desconectar que recebe uma Connection como parmetro, dentro deste mtodo estamos verificando se a conexo com o banco ainda no foi encerrada para depois encerra-la. Quando tentamos encerrar uma conexo com o banco tambm pode ocorrer alguma exceo para isso na linha 38 estamos tratando caso ocorra alguma java.sql.SQLException. Quando executamos esta classe, temos a seguinte sada no console: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 193 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Conectou no banco de dados. Desconectou do banco de dados.

Consulta de dados
Uma vez conectado, podemos ento solicitar a execuo de comandos SQL, para que tenhamos acesso a este tipo de chamada ao banco de dados necessrio criarmos um java.sql.Statement. O Statement o objeto que servir de instrumento para a execuo de comandos SQL, porm importante ressaltar que o intuito de uma consulta a um banco de dados o de receber uma informao, logo, fundamental que essa resposta seja armazenada em uma estrutura. Para isso podemos utilizar a classe java.sql.ResultSet que deve receber o retorno do mtodo executeQuery que responsvel por executar a consulta. Exemplo:
Consulta.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package material.jdbc; import import import import java.sql.Connection; java.sql.ResultSet; java.sql.SQLException; java.sql.Statement;

/** * Classe utilizada para demonstrar a consulta ao banco de dados. */ public class Consulta { public static void main(String[] args) { Consulta consultaBD = new Consulta(); consultaBD.consulta(); } public void consulta() { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); try { String consulta = "SELECT * FROM PESSOA WHERE NOME like 'A%'"; Statement stm = conn.createStatement();

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 194 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


24 25 26 27 28 29 30 31 32 33 34 35 36 37 ResultSet resultado = stm.executeQuery(consulta); while(resultado.next()) { System.out.print(resultado.getLong("ID")); System.out.print(" - " + resultado.getString("NOME")); System.out.print(" - " + resultado.getInt("IDADE") + "\n"); } } catch (SQLException ex) { System.out.println("No conseguiu consultar os dados de Pessoa."); } finally { conexao.desconectar(conn); } } }

Quando executamos essas classe, temos a seguinte sada no console: Conectou no banco de dados. 1 - Ana - 30 5 - Amanda - 23 Desconectou do banco de dados. Note pelo exemplo anterior que o mtodo responsvel por executar a consulta na base de dados foi o executeQuery na linha 24. Observe tambm a forma como o ResultSet foi percorrido na linha 26. A classe ResultSet oferece o mtodo next() para percorrer a resposta dada pelo banco de dados. Caso nossa consulta acima lista houvesse retornado 4 linhas, por padro o ResultSet estaria com seu ponteiro posicionado na posio -1, logo, antes de ler a primeira linha de resposta de sua consulta necessrio a chamada a este mtodo next() para que o ponteiro passe para a primeira posio e possa resgatar as informaes desejadas. O mtodo next() retorna true, caso ainda existam novas linhas na resposta e false quando no tem mais registros para percorrer. importante ressaltar que apenas um nico objeto ResultSet pode ser aberto por vez por Statement ao mesmo tempo. Para resgatar as informaes desejadas, a classe ResultSet oferece mtodos do tipo get para todos os tipos de dados primitivos, exceto char. Todos estes mtodos devem receber como parmetro o nome da coluna de resposta, assim como no exemplo anterior, ou o nmero correspondente a posio da coluna retornada.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 195 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Manipulao de dados
Podemos utilizar a classe Statement para guardar (persistir) ou atualizar as informaes na base de dados, utilizando o mtodo execute.
Manipulacao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public void atualizar() { } } Statement stm = conn.createStatement(); stm.execute(adicionar); System.out.println("Adicionou a pessoa Rafael no BD."); } catch (SQLException ex) { System.out.println("No conseguiu adicionar uma pessoa no BD."); } finally { conexao.desconectar(conn); public void inserir() { Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); try { 25)"; String adicionar = "INSERT INTO PESSOA (NOME, IDADE) VALUES ('Rafael', } /** * Classe utilizada para demonstrar como adicionar ou atualizar dados * */ public class Manipulacao { public static void main(String[] args) { Manipulacao manipulacao = new Manipulacao(); manipulacao.inserir(); manipulacao.atualizar(); no banco de dados. import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; package material.jdbc;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 196 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 } } } Statement stm = conn.createStatement(); stm.executeUpdate(atualizar); System.out.println("Atualizou o nome de Rafael para Cristiano."); } catch (SQLException ex) { System.out.println("No conseguiu atualizar uma pessoa no BD."); } finally { conexao.desconectar(conn); Conexao conexao = new Conexao(); Connection conn = conexao.conectar(); try { String atualizar = "UPDATE PESSOA SET NOME = 'Cristiano' WHERE NOME = 'Rafael'";

Na linha 24, pedimos para o Statement adicionar um novo registro na tabela PESSOA do banco de dados. Na linha 40, pedimos para o Statement atualizar um registro da tabela PESSOA do banco de dados. Note que para adicionar ou atualizar as informaes no banco de dados, podemos utilizar o mtodo execute. A classe Statement possui o mtodo execute para adicionar ou atualizar um registro no banco de dados e o mtodo executeUpdate para atualizar as informaes no banco de dados, a diferena que este mtodo retorna um inteiro com a quantidade de registros que foram alterados. Aps a concluso das operaes e leitura ou de manipulao de dados, importante a chamada ao mtodo close(), tanto da classe Statement como da classe Connection, para que a conexo com o banco de dados seja finalizada.

Relao de algumas bases de dados


Banco
Microsoft ODBC MySQL

Driver
sun.jdbc.odbc.JdbcOdbcDriver com.mysql.jdbc.Driver

String de Conexo
jdbc:odbc:<<nome da base>> jdbc:mysql://<<ipDoBanco>>/<<baseDeDados>>

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 197 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


jdbc:oracle:thin:@<<ipDoBanco>>:1521:<<nomeDaBase>> ou Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@ (DESCRIPTION= (ADDRESS_LIST=(ADDRESS = (PROTOCOL = TCP)(HOST = <<ipDoBanco>>)(PORT = 1521))) (CONNECT_DATA =(SERVICE_NAME = <<nomeDaBase>>)))

Exemplo de aplicao C.R.U.D. (Create, Read, Update, Delete)


Neste exemplo vamos, passo a passo, criar uma aplicao completa de acesso a uma base de dados utilizando JDBC. Para esta aplicao, iremos criar um sistema de cadastro de veculos. Para tal, criamos o POJO Carro, como segue abaixo:
Carro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package material.jdbc.exemplo; /** * Classe utilizada para representar um carro. */ public class Carro { private String placa; private String modelo; private Double potencia; public String getModelo() { return modelo; } public void setModelo(String modelo) { this.modelo = modelo; } public String getPlaca() { return placa; } public void setPlaca(String placa) { this.placa = placa; } public Double getPotencia() {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 198 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


28 29 30 31 32 33 34 return potencia; } public void setPotencia(Double potencia) { this.potencia = potencia; } }

Agora que j temos modelado a nossa classe principal, devemos definir como nosso programa ir interagir com a base de dados. Para estabelecermos a conexo com a base de dados de uma maneira mais simples, faremos uso da classe Conexao, conforme segue abaixo:
Conexao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package material.jdbc.exemplo; import import import import import java.sql.Connection; java.sql.DriverManager; java.sql.ResultSet; java.sql.SQLException; java.sql.Statement;

/** * Classe utilizada para executar as aes sobre o banco de dados. */ public class Conexao { private Connection conn = null; private Statement stm = null; private ResultSet rs = null; private Connection conectar() { try { String usuario = "root"; String senha = "root"; String ipDoBanco = "localhost"; String nomeDoBanco = "carro"; String stringDeConexao = "jdbc:mysql://" + ipDoBanco + "/" + nomeDoBanco; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(stringDeConexao, usuario, senha); System.out.println("Conectou no banco de dados."); } catch (SQLException ex) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 199 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 System.out.println("Erro: No conseguiu conectar no BD."); } catch (ClassNotFoundException ex) { System.out.println("Erro: No encontrou o driver do BD."); } return conn; } public ResultSet executarConsulta(String consulta) { conn = conectar(); try { stm = conn.createStatement(); rs = stm.executeQuery(consulta); } catch (SQLException ex) { System.out.println("No conseguiu executar a consulta\n" + consulta); //Caso ocorra algum erro desconecta do banco de dados. desconectar(); } return rs; } public boolean executarDML(String dml) { boolean ok = false; conn = conectar(); try { stm = conn.createStatement(); stm.execute(dml); ok = true; } catch (SQLException ex) { System.out.println("Nao conseguiu executar o DML\n" + dml); } finally { desconectar(); } return ok; } public void desconectar() { fecharResultSet(this.rs); fecharStatement(this.stm); fecharConnection(this.conn);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 200 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 } } public void fecharConnection(Connection conn) { try { if(conn != null && !conn.isClosed()) { conn.close(); System.out.println("Desconectou do banco de dados."); } } catch (SQLException ex) { System.out.println("Nao conseguiu desconectar do BD."); } } public void fecharStatement(Statement stm) { try { if(stm != null && !stm.isClosed()) { stm.close(); } } catch (SQLException ex) { System.out.println("Erro ao fechar o procedimento de consulta."); } } public void fecharResultSet(ResultSet resultado) { try { if(resultado != null && !resultado.isClosed()) { resultado.close(); } } catch (SQLException ex) { System.out.println("Erro ao fechar o resultado da consulta."); } }

Utilizaremos um padro de projeto chamado DAO (Data Acess Object). O DAO deve saber buscar os dados do banco e converter em objetos para ser usado pela sua aplicao. Semelhantemente, deve saber como pegar os objetos, converter em instrues SQL e mandar para o banco de dados. Desta forma conseguimos distinguir fortemente a modelagem do sistema da modelagem de dados e das regras de negcio. Geralmente, temos um DAO para cada objeto do domnio do sistema, ou seja, para nosso exemplo criaremos uma classe CarroDAO com as quatro operaes bsicas, definidas por seus mtodos.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 201 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

CarroDAO.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package material.jdbc.exemplo; import java.sql.ResultSet; import java.sql.SQLException; /** * Classe utilizada para executar as operaes no banco de dados, * que envolvem o Carro. */ public class CarroDAO { public void incluir(Carro carro) { String incluir = "INSERT INTO CARRO VALUES ('" + carro.getPlaca() + "', '" + carro.getModelo() + "', " + carro.getPotencia() + ")"; Conexao conexao = new Conexao(); conexao.executarDML(incluir); } public Carro consultarPorPlaca(String placa) { Conexao conexao = new Conexao(); Carro carro = null; try { String consulta = "SELECT * FROM CARRO WHERE PLACA = '" + placa + "'"; ResultSet rs = conexao.executarConsulta(consulta); if(rs.next()) { carro = new Carro(); carro.setModelo(rs.getString("MODELO")); carro.setPlaca(rs.getString("PLACA")); carro.setPotencia(rs.getDouble("POTENCIA")); } } catch (SQLException ex) { System.out.println("Nao conseguiu consultar os dados do Caminhao."); } finally { conexao.desconectar(); } return carro; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 202 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 public void alterarPorPlaca(Carro carro) { String update = "UPDATE CARRO SET MODELO = '" + carro.getModelo() + "', POTENCIA = " + carro.getPotencia() + "WHERE PLACA = '" + carro.getPlaca() + "'"; Conexao conexao = new Conexao(); conexao.executarDML(update); } public void excluir(Carro carro) { String delete = "DELETE FROM CARRO WHERE PLACA='" + carro.getPlaca() + "'"; Conexao conexao = new Conexao(); conexao.executarDML(delete); } }

Para que a classe acima no apresente nenhum erro de compilao, necessrio que voc acrescente a biblioteca (arquivo .jar) correspondente ao seu banco de dados. Para o nosso exemplo, devemos importar o arquivo correspondente ao banco de dados MySQL. Observe que nosso mtodo incluir() apenas recebe o objeto Carro a ser inserido na base de dados e internamente faz toda a operao relacionada ao banco de dados. Desta forma, conseguimos isolar toda esta interao com a base de dados do restante do cdigo, tornando-o mais simples de se realizar qualquer tipo de manuteno. O mtodo consultarPorPlaca recebe apenas a placa de um carro (imagine que esta informao uma chave da tabela e que no devemos ter mais de um carro com a mesma placa) e que retorna um objeto do tipo Carro com todos os seus atributos devidamente alimentados. O mtodo alterarPorPlaca() recebe um objeto Carro e a partir de sua placa faz a atualizao nos atributos placa e potencia. O mtodo excluir() recebe o Carro como parmetro e o apaga da base de dados, Para testarmos nosso sistema, crie um programa semelhante ao abaixo:
TestarCarro.java 01 02 03 04 05 package material.jdbc.exemplo; import java.util.Scanner; /**

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 203 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 * Classe utilizada para testar o CRUD de Carro. */ public class TestarCarro { public static void main(String[] args) { CarroDAO carroDAO = new CarroDAO(); char opcao = ' '; do { Carro carro = null; opcao = menu(); switch(opcao) { case 'I': carro = coletarDados(); carroDAO.incluir(carro); break; case 'E': String placaExcluir = consultarPlaca(); carro = carroDAO.consultarPorPlaca(placaExcluir); carroDAO.excluir(carro); break; case 'A': carro = coletarDados(); carroDAO.alterarPorPlaca(carro); break; case 'C': String placaConsultar = consultarPlaca(); carro = carroDAO.consultarPorPlaca(placaConsultar); break; } mostrarDadosCarro(carro); } while(opcao != 'S'); } public static char menu() { Scanner s = new Scanner(System.in); char opcao = ' '; System.out.println("Escolha a sua opcao: "); System.out.println("\t(I)ncluir"); System.out.println("\t(E)xcluir"); System.out.println("\t(A)lterar"); System.out.println("\t(C)onsultar"); System.out.println("\t(S)air"); System.out.print("\nOpcao: ");

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 204 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 opcao = s.nextLine().toUpperCase().charAt(0); return opcao; } public static String consultarPlaca() { Scanner s = new Scanner(System.in); System.out.print("Digite a placa do carro: "); return s.nextLine(); } public static Carro coletarDados() { Scanner s = new Scanner(System.in); Carro carro = new Carro(); System.out.print("Digite a placa do carro: "); carro.setPlaca(s.nextLine()); System.out.print("Digite o modelo do carro: "); carro.setModelo(s.nextLine()); System.out.print("Digite a potencia do carro: "); carro.setPotencia(s.nextDouble()); return carro; } public static void mostrarDadosCarro(Carro carro) { if(carro != null) { System.out.println("\n############### DADOS DO CARRO #################"); System.out.println("PLACA: " + carro.getPlaca()); System.out.println("MODELO: " + carro.getModelo()); System.out.println("POTENCIA DO MOTOR: " + carro.getPotencia()); System.out.println("############### DADOS DO CARRO ################# \n"); } } }

Ao executarmos a classe TestarCarro, temos a seguinte sada no console: Escolha a sua opcao: " (I)ncluir " (E)xcluir " (A)lterar Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 205 -

Programao Orientada a Objetos Universidade Metodista de So Paulo " " (C)onsultar (S)air

Opcao: A console fica aguardando at que digitemos alguma opo, primeiro vamos criar um novo carro para isto vamos entrar com a opo I: Digite a placa do carro: abc-1234 Digite o modelo do carro: X3 Digite a potencia do carro: 450 Conectou no banco de dados. Desconectou do banco de dados.
############### DADOS DO CARRO ################# PLACA: abc-1234 MODELO: X3 POTENCIA DO MOTOR: 450.0 ############### DADOS DO CARRO #################

Escolha a sua opcao: " (I)ncluir " (E)xcluir " (A)lterar " (C)onsultar " (S)air Opcao: Se consultarmos todos os carros cadastrados no banco de dados aparecer o carro que acabamos de criar: mysql> select * from carro; +----------+--------+----------+ | placa | modelo | potencia | +----------+--------+----------+ | abc-1234 | X3 | 450.00 | +----------+--------+----------+ 1 row in set <0.05 sec> Agora vamos utilizar a opo C para consultar um carro pela placa abc-1234: Opcao: C Digite a placa do carro: abc-1234 Conectou no banco de dados. Desconectou do banco de dados.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 206 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


############### DADOS DO CARRO ################# PLACA: abc-1234 MODELO: X3 POTENCIA DO MOTOR: 450.0 ############### DADOS DO CARRO #################

Escolha a sua opcao: " (I)ncluir " (E)xcluir " (A)lterar " (C)onsultar " (S)air Opcao: Agora vamos utilizar a opo A para alterar as informaes de modelo e potencia: Opcao: A Digite a placa do carro: abc-1234 Digite o modelo do carro: X4 Digite a potencia do carro: 350 Conectou no banco de dados. Desconectou do banco de dados.
############### DADOS DO CARRO ################# PLACA: abc-1234 MODELO: X4 POTENCIA DO MOTOR: 350.0 ############### DADOS DO CARRO #################

Escolha a sua opcao: " (I)ncluir " (E)xcluir " (A)lterar " (C)onsultar " (S)air Opcao: Se consultarmos todos os carros cadastrados no banco de dados aparecer o carro que acabamos de alterar: mysql> select * from carro; +----------+--------+----------+ | placa | modelo | potencia | +----------+--------+----------+ | abc-1234 | X4 | 350.00 |

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 207 -

Programao Orientada a Objetos Universidade Metodista de So Paulo +----------+--------+----------+ 1 row in set <0.00 sec> Agora vamos utilizar a opo E para apagar o carro do banco de dados. Opcao: E Digite a placa do carro: abc-1234 Conectou no banco de dados. Desconectou do banco de dados. Conectou no banco de dados. Desconectou do banco de dados.
############### DADOS DO CARRO ################# PLACA: abc-1234 MODELO: X4 POTENCIA DO MOTOR: 350.0 ############### DADOS DO CARRO #################

Escolha a sua opcao: " (I)ncluir " (E)xcluir " (A)lterar " (C)onsultar " (S)air Opcao: Se consultarmos todos os carros, no teremos nenhum registro no banco de dados: mysql> select * from carro; Empty set <0.00 sec>

Exerccios
1-) Crie uma aplicao CRUD (Salvar, Consultar, Atualizar e Apagar) para controlar as informaes referentes a Produto (nome, preco, tipo e data de validade). 2-) Crie uma aplicao para controlar a venda e o estoque dos produtos criados no exerccio anterior. O controle de estoque deve conter o Produto e sua Quantidade em estoque, cada vez que um produto vendido deve ser reduzido do estoque a quantidade de produtos e quando a

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 208 -

Programao Orientada a Objetos Universidade Metodista de So Paulo quantidade em estoque for menor ou igual a 10, ento deve informar que necessrio comprar mais produto, se o estoque for 0 (zero) ento no deve permitir a venda do produto.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 209 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

18. Interfaces grficas - SWING

A Linguagem Java oferece dois pacotes bsicos para o desenvolvimento de interfaces grficas, sendo eles o AWT e o Swing. Em nosso curso, faremos uso do pacote swing, que um pacote derivado do awt com a vantagem de ser 100% multiplataforma. Todos os pacotes oferecem recursos para criao de janelas, barras de menu, guias, botes, etc... Utilizando o NetBeans como IDE de desenvolvimento para interfaces grficas O NetBeans uma IDE de desenvolvimento que oferece suporte aos mais variados segmentos de desenvolvimento Java, desde o desenvolvimento de aplicaes robustas at aplicaes para dispositivos portteis, porm seu grande diferencial est no desenvolvimento de interfaces grficas, por oferecer um ambiente amigvel e simples. A seguir, termos um passo a passo, listando os principais pontos de como se criar uma aplicao grfica no NetBeans. Passo 1 Criando um projeto Para que seja possvel se criar e organizar seus arquivos Java, primeiramente necessria a criao de um novo projeto. Para tal, use a opo: File (Arquivo) New Project... (Novo Projeto)

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 210 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na aba Categories (Categorias) selecione a opo e na aba Projects (Projetos) selecione a opo Java Application (Aplicao Java). Isso nos remete a criao de um projeto padro do Java. Feito isso, clique em Next (Prximo) uma nova janela ser exibida, solicitando que mais informaes sejam fornecidas:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 211 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Nesta janela, devemos preencher o campo Project Name (Nome do Projeto) com alguma informao. Preferencialmente, coloque um nome que tenha relao com o programa que voc ir desenvolver. Mais abaixo existe a opo Project Location (Localizao do projeto). Neste campo, podemos alterar o local onde os arquivos desenvolvidos sero salvos. Ateno: caso voc queira resgatar suas classes mais tarde, este ser o caminho que voc acessar para localizar seus arquivos .java. Dentro do projeto tem uma pasta chamada src e dentro desta pasta fica os arquivos fontes. A opo Set as Main Project (Definir como Projeto Principal), apenas identificar a IDE que este seu projeto principal de trabalho, caso voc possua mais de um projeto aberto dentro do NetBeans. Por fim, na opo Create Main Class (Criar Classe Principal), possvel criar uma classe inicial no projeto. Esta classe ser responsvel por iniciar a chamada a outras classes do projeto. Coloque um nome que julgar melhor, sendo que no nosso caso colocamos o nome Principal, devido a sua funo em nosso projeto. Clique em Finish (Finalizar). Passo 2 Criando uma nova classe (JFrame) Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 212 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Inicialmente, nosso projeto ser dividido em 4 pastas principais, sendo que a pasta na qual criaremos nossos novos arquivos Java ser a de nome Source Packages (Pacotes de Cdigo-Fonte).

Clicando com o boto direito do mouse sobre nome Source Package, ou sobre o nome do pacote metodista.aula.swing, temos acesso a um menu de opes. Dentro deste menu, mais especialmente na primeira opo: New (Novo), podemos escolher qual o tipo de novo componente desejamos criar. Para a criao de uma janela, selecione a opo JFrame Form (Formulrio JFrame), conforme figura abaixo.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 213 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Com isso uma nova janela ser exibida: Nesta nova janela coloque apenas o Class Name (Nome da Classe), conforme a figura abaixo e clique em Finish (Finalizar).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 214 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Passo 3 Editando visualmente seu novo Formulrio JFrame Com nossa classe devidamente criada, seremos automaticamente direcionados para a tela de edio grfica.

Ao lado direito, temos a Palette (Paleta), com a lista de componentes que podem ser colocados no JFrame, e logo abaixo a janela de Properties (Propriedades). Ao lado esquerdo, temos a janela do Project (Projeto), logo abaixo o Navigator (Navegador) e o Inspector (Inspetor). O Inspetor nos mostra todos os componentes que j foram adicionados ao JFrame. A seguir, na janela do Inspector (Inspetor), vamos clicar com o boto direito do mouse no JFrame, e indo at a opo Set Layout (Definir Layout), podemos escolher a opo Null Layout, a qual nos dar mais liberdade para trabalhar com o JFrame. Caso seja da preferncia, podemos manter marcada a opo Free Design (Desenho Livre), que habilitar o novo assistente de criao de janelas chamado Matisse. O Matisse um assistente bastante interessante que procura automaticamente alinhar e dimensionar os componentes, de forma padronizada e seguindo as melhores prticas de desenvolvimento.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 215 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Agora selecione o JFrame clicando sobre ele uma vez com o boto esquerdo do mouse na janela principal, ou na janela do Inspector e na janela de Propriedades vamos selecionar a opo Code (Cdigo). Na nova listagem que ser exibida, altere o valor de Form Size Policy (Poltica de Tamanho de Formulrio) para Generate Resize Code (Gera Cdigo de Redimensionamento).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 216 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Este modo de redimensionamento utilizado para os itens da tela serem ajustados automaticamente conforme o tamanho da janela alterado. Para trocar entre o ambiente de Design (Desenho) que mostra um ambiente mais grfico e fcil de visualizar os componentes e o ambiente de Fonte (Source) que mostra o cdigo fonte da classe, usamos as seguintes abas:

Passo 4 Adicionando novos componentes ao Formulrio JFrame Agora iremos adicionar trs novos componentes ao nosso JFrame: JButton (boto) JLabel (rotulo) JTextField (campo para entrada de texto) Para isso, na janela Paleta, selecione o primeiro destes componentes e clique dentro do JFrame no local onde deve ficar o componente. Repita este Procedimento para os outros dois componentes, como resultando queremos ter algo semelhante a janela abaixo:

Com cada um dos componentes devidamente organizados na tela, podemos mov-los ou alterar o seu tamanho livremente.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 217 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Ao clicar com o boto direito do mouse sobre cada um dos componentes, ser listado algumas opes:

Iremos selecionar a opo Change Variable Name... (Mudar o nome da varivel) e vamos colocar os seguintes nomes nas variveis: o JTextField vamos chamar de entrada; o JButton vamos chamar de botao; e o JLabel vamos chamar de saida. Feito isso, mais uma vez, clique com o boto direito do mouse sobre cada um dos trs componentes e selecione a opo Edit Text (Editar Texto), para alterar o texto exibido em Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 218 -

Programao Orientada a Objetos Universidade Metodista de So Paulo cada um destes componentes. Por hora, vamos apagar o texto do JTextField e do JLabel e vamos alterar o texto do JButton para Clique aqui. O resultado ser algo prximo da janela abaixo:

Note que o JLabel mesmo no parecendo visvel, ele ainda est no JFrame e pode ser visto e selecionado atravs do Inspector. Aps estes passos, possvel notar que o novo nome do componente pode ser obtido tanto na janela do Inspector como, aps selecionar o componente desejado, na janela de Propriedades, propriedade Variable Name (Varivel Nome).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 219 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Note que todos os componentes que estamos trabalhando aqui so Objetos e o JFrame, JButton, JTextField e JLabel. Quando adicionamos estes componentes na tela, estamos criando uma nova instancia dos objetos deles. Passo 5 Adicionando uma ao ao boto Para adicionarmos uma ao ou um Evento propriamente dito ao boto, devemos clicar sobre ele (ou sobre seu correspondente na janela do Inspector) com o boto direito do mouse e dentro da opo Events (Eventos), devemos selecionar Action e por fim a opo actionPerformed, desta forma ser automaticamente mudado a viso do projeto para o modo de edio de fonte (Source).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 220 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Uma vez no modo de edio Fonte, estar com o cursor dentro do seguinte texto:

Lembre-se... o // simboliza uma linha de comentrio, logo apague esta linha e no lugar dela escreva o texto abaixo, ficando ento este trecho de cdigo da seguinte maneira:

Na Linha 72, lemos o contedo de texto que existe no componente entrada (o JTextField) e armazenamos seu valor na varivel do tipo String chamada dados. Na linha 73, colocamos no componente saida (o JLabel) o texto que havamos guardado na varivel String. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 221 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Com isso, sabemos agora que com os cdigos getText() e setText(), podemos pegar ou colocar um texto em um dos componentes, assim como fizemos no passo 4, porm durante a execuo do programa. Por fim, devemos chamar essa nossa nova janela de algum lugar, ento clique 2 vezes sobre a classe Principal no menu Projeto e a editaremos da seguinte maneira:
Principal.java 01 02 03 04 05 06 07 08 09 10 11 12 package metodista.aula.swing; /** * Classe utilizada para demonstrar como criar um objeto de uma classe * filha de JFrame e exibil na tela. public class Principal { public static void main(String[] args) { PrimeiroForm form = new PrimeiroForm(); //Mostra o JFrame na tela. form.setVisible(true); } }

Na linha 8 estamos criando um objeto do nosso formulrio (PrimeiroForm) e na linha 10 estamos declarando que o mesmo deve ficar visvel. Feito isso, basta salvar ambos os arquivos e clicar com o boto direito do mouse sobre a classe Principal.java na janela do Projeto e selecionar a opo Run File (Executar Arquivo). Por fim, nosso programa ser executado, e note que ao se digitar algo na JTextField e clicar no boto Clique Aqui, todo o texto inserido na JTextField ser transferido para a JLabel.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 222 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Utilizando o JFrame
O JFrame uma classe que representa uma janela ou quadro da aplicao desktop, dentro dele podemos adicionar diversos componentes como botes, textos, campos de digitao, listas, imagens.

Alguns dos mtodos mais utilizados do JFrame so: JFrame.setDefaultCloseOperation(int operation) Seta a forma como a janela do JFrame deve ser fechada, seus valores podem ser: - HIDE (Janela continua aberta, mas no mostrada na tela) - DO_NOTHING (No faz nada) - EXIT_ON_CLOSE (Encerra todo o programa, usando o System.exit(0)) - DISPOSE (Fecha a janela) Exemplo: setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); JFrame.setTitle(String title) Altera o titulo da janela, este mtodo recebe uma String como titulo. Exemplo: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 223 -

Programao Orientada a Objetos Universidade Metodista de So Paulo setTitle("Primeiro Formulrio"); JFrame.setResizable(Boolean resizable) Dependendo do valor true (verdadeiro) ou false (falso), a janela JFrame permite ter seu tamanho alterado durante sua execuo. Exemplo: setResizable(false); JFrame.setName(String name) Altera o nome da janela JFrame. Exemplo: setName("principal"); Para trocar a cor do JFrame, podemos fazer da seguinte forma: this.getContentPane().setBackground(new java.awt.Color(204, 255, 204));

Utilizando JTextField
O pacote Swing, conta com uma classe chamada JTextField. Esta classe responsvel por receber texto quando adicionada a um container (JFrame). Para adicion-lo a sua aplicao, localize-o no painel ao lado direito na Paleta, clique sobre ele e clique sobre o JFrame. Aps o JTextField ter sido posicionado, possvel alterar sua disposio e tamanho no formulrio.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 224 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Este campo capaz de receber qualquer tipo de dado, seja ele numrico ou caractere, mas todos os caracteres digitados nele so guardados dentro de uma String. E vimos anteriormente que podemos alterar o nome e texto do JTextField. Alguns dos mtodos mais utilizados do JTextField so: JTextField.getText() Retorna o valor digitado dentro do campo solicitado. Exemplo: String texto = entrada.getText(); JTextField.setText(String texto) Coloca uma String dentro do campo JTextField solicitado. Exemplo: entrada.getText(O texto deve estar entre aspas duplas); JTextField.setEditable(boolean valor) Dependendo do valor passado true (verdadeiro) ou false (falso) permite ou no a edio do campo. Exemplo: entrada.setEditable(true);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 225 -

Programao Orientada a Objetos Universidade Metodista de So Paulo JTextField.setEnabled(boolean valor) Dependendo do valor passado true (verdadeiro) ou false (falso) desativa o campo solicitado. Exemplo: entrada.setEditable(false); JTextField.setFont(Font font) Altera o tipo de formato da fonte do componente JTextField. Este mtodo recebe um objeto do tipo Font que defini a fonte, estilo do texto e tamanho. Exemplo: entrada.setFont(new java.awt.Font("Arial", 1, 10)); JTextField.setBackground(Color c) Alterar a cor do fundo do JTextField. Este mtodo recebe um objeto do tipo Color, que utiliza o padro RGB para definir a cor. Exemplo: entrada.setBackground(new java.awt.Color(204, 255, 204));

Utilizando JButton
Assim como o JTextField, o componente JButton tambm faz parte do pacote Swing. Esta classe uma das mais importantes de todas as aplicaes, pois na maioria dos casos, nela em que adicionamos as aes que desejamos que nosso programa execute. Para adicionlo a sua aplicao, localize-o na Paleta e clique dentro do JFrame na posio desejada. Depois de posicionado, possvel alterar sua disposio e tamanho.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 226 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Tambm como fizemos com o JTextField, recomendvel alterar o texto e o nome da varivel que representar este componente no programa. Para tal, utilize os mesmos procedimentos listados no trecho que fala do JTextField. Neste momento aconselhvel uma ateno especial ao nome do boto para que o mesmo seja intuitivo no sentido de auxiliar o usurio na utilizao do seu programa. Alguns dos mtodos mais utilizados do JButton so: JButton.getText() Retorna o texto escrito no boto. O mesmo digitado na criao do programa pela opo Edit Text Editar Texto, do boto direito do mouse. Exemplo: String texto = botao.getText(); JButton.setText(String texto) Coloca uma String dentro do boto JButton solicitado. Exemplo: botao.setText(O texto deve estar entre aspas duplas); JButton.setEnabled(boolean valor) Dependendo do valor passado true (verdadeiro) ou false (falso) desativa o campo solicitado. Exemplo: botao.setEditable(false); JButton.setFont(Font font)

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 227 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Altera o tipo de formato da fonte do componente JButton. Este mtodo recebe um objeto do tipo Font que defini a fonte, estilo do texto e tamanho. Exemplo: botao.setFont(new java.awt.Font("Arial", 1, 10)); JButton.setBackground(Color c) Alterar a cor do fundo do JButton. Este mtodo recebe um objeto do tipo Color, que utiliza o padro RGB para definir a cor. Exemplo: botao.setBackground(new java.awt.Color(204, 255, 204)); JButton.setIcon(ImageIcon imageIcon) Adiciona um cone dentro do boto. Este mtodo recebe um objeto o tipo ImageIcon que representa uma imagem, e esta imagem pode estar dentro do seu projeto ou pode estar em algum diretrio do micro. Exemplo: botao.setIcon(new javax.swing.ImageIcon(getClass().getResource( "/imagens/ ok.jpg")));

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 228 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Utilizando o JLabel
O JLabel um componente utilizado para mostrar textos ou imagens na tela. Para adicionlo a sua aplicao, localize-o na Paleta e clique dentro do JFrame na posio desejada. Depois de posicionado, possvel alterar sua disposio, tamanho, texto e nome.

Alguns dos mtodos mais utilizados do JLabel so: JLabel.getText() Retorna o texto escrito no boto. O mesmo digitado na criao do programa pela opo Edit Text Editar Texto, do boto direito do mouse. Exemplo: String texto = saida.getText(); JLabel.setText(String texto) Coloca uma String dentro do label JLabel solicitado. Uma coisa interessante que a propriedade text do JLabel pode receber um texto no formato HTML. Exemplo: saida.setText(O texto deve estar entre aspas duplas); JLabel.setFont(Font font) Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 229 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Altera o tipo de formato da fonte do componente JLabel. Este mtodo recebe um objeto do tipo Font que defini a fonte, estilo do texto e tamanho. Exemplo: saida.setFont(new java.awt.Font("Arial", 1, 10)); JLabel.setBackground(Color c) Alterar a cor do fundo do JLabel. Este mtodo recebe um objeto do tipo Color, que utiliza o padro RGB para definir a cor. Exemplo: saida.setBackground(new java.awt.Color(204, 255, 204)); JLabel.setIcon(ImageIcon imageIcon) Adiciona uma imagem dentro do JLabel. Este mtodo recebe um objeto o tipo ImageIcon que representa uma imagem, e esta imagem pode estar dentro do seu projeto ou pode estar em algum diretrio do micro. Exemplo: saida.setIcon(new javax.swing.ImageIcon(getClass().getResource( "/imagens/ saida.jpg")));

19.Utilizando o JComboBox
O JComboBox utilizado para mostrar uma lista de itens no qual o usurio deve escolher um deles. Para adicion-lo a sua aplicao, localize-o na Paleta e clique dentro do JFrame na posio desejada. Depois de posicionado, possvel alterar sua disposio, tamanho, texto e nome.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 230 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Alguns dos mtodos mais utilizados do JComboBox so: JComboBox.setModel(ComboBoxModel aModel) Adiciona os itens que sero listados dentro do JComboBox. Exemplo: cmbNomes.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Rafael", "Cristiano", "Leonardo" })); JComboBox.getSelectedItem() Retorna o item que foi selecionado no formato de Objeto. Exemplo: String nomeSelecionado = (String) cmbNomes.getSelectedItem(); JComboBox.setMaximumRowCount(int count) Informa qual a quantidade mxima de itens sero exibidos no JComboBox, se o tamanho mximo for menor que a quantidade de itens dentro do JComboBox, ento ser mostrado uma barra de rolagem dentro dele. Exemplo: cmbNomes.setMaximumRowCount(2); JComboBox.setFont(Font font)

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 231 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Altera o tipo de formato da fonte do componente JComboBox. Este mtodo recebe um objeto do tipo Font que defini a fonte, estilo do texto e tamanho. Exemplo: cmbNomes.setFont(new java.awt.Font("Verdana", 1, 12));

Imagens no Swing
Para se manusear imagens no Java, mais especificamente no Swing muito simples. Para tal, basta utilizar um componente j conhecido do tipo JLabel. Assim como o exemplo anterior, crie um formulrio JFrame e adicione ao mesmo um componente JLabel, como segue no exemplo a seguir:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 232 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Feito isso, existem duas maneiras de se adicionar uma figura a este componente. A mais simples delas simplesmente acessando o menu de propriedades deste item, e alterando a sua propriedade de nome Icon.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 233 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Clicando ento nessa propriedade uma janela de configuraes ser exibida e lhe ser dada a opo de adicionar uma figura dentro do projeto ou dentro de algum diretrio do computador ou url. Com isso, teremos ento uma janela com a figura desejada:

Assim como foi possvel alterarmos o valor desta propriedade no menu de propriedades do NetBeans, tambm possvel incluir ou alterar uma figura em tempo de execuo. Para isto, podemos fazer uso do seguinte mtodo: <<JLabel>>.setIcon( ) Este mtodo, setIcon(), deve receber como parmetro um objeto do tipo Icon, para isto, utilize a seguinte sintaxe: <<JLabel>>.setIcon(new ImageIcon("foto.jpg")); Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 234 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Onde o arquivo de foto deve estar na pasta inicial do projeto. Caso deseje utilizar caminhos relativos, utilize a notao desde a raiz do sistema operacional, por exemplo: <<JLabel>>.setIcon(new ImageIcon("c:/minhasFotos/foto.jpg")); Para alterar uma imagem em tempo de execuo por outra contida dentro de seu projeto, basta utilizar o seguinte comando: <<JLabel>>.setIcon(new ImageIcon(getClass().getResource(/pacote/arquivo))); Onde /pacote/arquivo o endereo completo da figura dentro de seu projeto. Note que este mtodo mais interessante, visto que a figura ir compor seu projeto e no necessitar ser colocada em um caminho fixo no sistema operacional, por exemplo: projetoJava/imagens/Logo.gif Agora sabendo como manusear fotos em tempo de execuo, sabemos ento como alterar fotos de acordo com a interao do usurio com nosso programa. A utilizao do componente ImageIcon no automaticamente entendida pelo Java, logo, necessrio que na linha que antecede a declarao da classe (public class Imagens extends javax.swing.JFrame { ) seja acrescentada uma importao deste componente da seguinte forma: import javax.swing.ImageIcon;

Exemplo de aplicao desktop.


Neste exemplo vamos criar uma tela para cadastrar pessoas e essas pessoas sero armazenadas dentro de um vetor de pessoas e exibido uma lista com os nomes das pessoas cadastradas. Vamos criar um novo Projeto Java chamado ListaPessoas, e adicionar um pacote chamado metodista.poo.listapessoas.tela e outro pacote chamado metodista.poo.listapessoas. pessoa, nosso projeto deve ficar assim:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 235 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Agora dentro do pacote metodista.poo.listapessoas.pessoa vamos criar uma classe chamada Pessoa que possui os atributos nome e idade.
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 package metodista.poo.listapessoas.pessoa; /** * Classe utilizada para demonstrar como criar um objeto de uma classe * filha de JFrame e exibil na tela. public class Principal { public static void main(String[] args) { PrimeiroForm form = new PrimeiroForm(); //Mostra o JFrame na tela. form.setVisible(true); } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 236 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Vamos criar uma tela dentro do pacote metodista.poo.listapessoas.tela, para o usurio digitar o nome e idade da pessoa e guardar essas informaes em um vetor de Pessoas.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 237 -

Programao Orientada a Objetos Universidade Metodista de So Paulo O JTextField que guarda o texto do nome chama txtNome e o JTextField que guarda o texto da idade chama txtIdade. O JButton que possui a funo de Cadastrar uma nova pessoa chama btnCadastrar. Foram adicionados mais alguns atributos e mtodos conforme cdigo abaixo:
TelaCadastroPessoas.java 01 02 03 04 05 06 07 08 09 10 11 12 package metodista.aula.swing; /** * Classe utilizada para demonstrar como criar um objeto de uma classe * filha de JFrame e exibil na tela. public class Principal { public static void main(String[] args) { PrimeiroForm form = new PrimeiroForm(); //Mostra o JFrame na tela. form.setVisible(true); } }

Na linha 11 foi declarado um vetor de Pessoa chamado pessoas que suporta at 100 objetos dentro ele.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 238 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Na linha 12 foi declarado um inteiro que serve como contador, para marcar quantas pessoas foram adicionadas no vetor. Na linha 95 foi criado um mtodo que chamado quanto o boto acionado. Na linha 96 pega os valores do txtNome e txtIdade, cria um objeto do tipo Pessoa. Na linha 97 adiciona este novo objeto Pessoa dentro do vetor de pessoas. Na linha 98 incrementa o contador que informa quantas pessoas tem cadastradas no vetor. Agora vamos adicionar na tela de cadastro de pessoas uma JLabel para mostrar para o usurio quais so as pessoas que foram guardadas dentro do vetor.

E vamos alterar o cdigo do mtodo acionado quando o boto cadastrar acionado para poder atualizar a lista de pessoas cadastradas:
TelaCadastroPessoas.java 01 02 03 04 05 06 07 08 package metodista.aula.swing; /** * Classe utilizada para demonstrar como criar um objeto de uma classe * filha de JFrame e exibil na tela. public class Principal { public static void main(String[] args) { PrimeiroForm form = new PrimeiroForm();

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 239 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


09 10 11 12 //Mostra o JFrame na tela. form.setVisible(true); } }

Na linha 120, chama o mtodo atualizarListaPessoas, passando o vetor de pessoas e o JLabel que ser atualizado. Na linha 121 e 122 deixa o JTextField do nome e idade em branco. Na linha 125, est declarando um mtodo que faz a atualizao do JLabel que mostra as pessoas cadastradas. Na linha 126, cria uma String que vai guardar o nome e idade de todas as pessoas, est String ser escrita no formato HTML. Na linha 127 a 129, temos um for que passa pelo vetor de pessoas e guarda na String o texto encontrado. Na linha 130, encerro o texto HTML dentro da String. Na linha 132, atribui o valor da String listaPessoas no JLabel lblPessoas.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 240 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

JFileChooser
Existe um componente Swing que serve para localizar e selecionar um ou mais arquivos no sistema operacional, seu nome JFileChooser (Selecionador de arquivo). Este componente est localizado na barra lateral e representado pelo item:

Vamos criar um exemplo de aplicao para listar todos os arquivos de um diretrio: Nossa tela ser esta mostrada na viso de Projeto. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 241 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Note que o componente JFileChooser foi adicionado na parte de Outros componentes, pois este um componente um pouco grande e mante-lo dentro do JFrame acaba atrapalhando visualmente o desenvolvimento da tela. Nas propriedades do JFileChooser podemos definir atravs da propriedade f i l e S e l e c t i o n M o d e s e e l e i r a a c e i t a r F I L E S _ O N LY ( S o m e n t e A r q u i v o s ) , DIRECTORIES_ONLY (Somente Diretrios) e FILES_AND_DIRECTORIES (Arquivos e Diretrios). Va m o s c o n f i g u r a r n o s s o J F i l e C h o o s e r p a r a a c e i t a r s o m e n t e d i r e t r i o s (DIRECTORIES_ONLY), pois vamos ler todos os arquivos do diretrio selecionado.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 242 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Depois de montado a tela vamos adicionar a ao do boto Pesquisar que ser responsvel por abrir a tela do Selecionador de Arquivo (JFileChooser) e listar todos os arquivos dentro da rea de texto (JTextArea).
ExemploFileChooser.java 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 for(int cont = 0; cont < arquivos.length; cont++) { File arquivo = arquivos[cont]; if(arquivo.isFile()) { if(cont == 0) { areaArquivos.setText(arquivo.getName()); } else { File diretorio = jFileChooser1.getSelectedFile(); if(diretorio != null) { txtDiretorio.setText(diretorio.getAbsolutePath()); File[] arquivos = diretorio.listFiles(); private void btnPesquisarActionPerformed(java.awt.event.ActionEvent evt) { jFileChooser1.showOpenDialog(this);

areaArquivos.setText(areaArquivos.getText() + " \n" + arquivo.getName()); 100 } 101 102 103 104 } } } }

Quando executarmos a aplicao teremos a seguinte tela:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 243 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Quando clicar no boto Pesquisar abre a seguinte janela do Selecionador de Arquivos:

Depois de selecionar o diretrio e clicar no boto Open, sero listados na rea de texto todos os arquivos do diretrio.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 244 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Utilizando o JMenuBar, JMenu e JMenuItem


Para criao de menus utilizamos os componentes JMenuBar para montar a barra do menu, JMenu para criar o menu e JMenuItem para criar os itens do menu. Vamos criar um programa para cadastrar, consultar, alterar ou excluir Livros, este programa ser feito utilizando Swing e utiliza um menu para chamar outras telas. A tabela do banco de dados tem as seguintes colunas, neste exemplo utilizaremos o MySql, mas pode ser feito em qualquer outro banco de dados.: ID TITULO AUTOR ISBN PAGINAS Nmero - Chave Primaria - Obrigatrio Texto - Obrigatrio Texto Texto Nmero

create table Livro ( id int not null auto_increment, titulo varchar(50) not null, autor varchar(50) not null, isbn varchar(20) not null, paginas int not null, primary key(id) ); Vamos criar agora a classe Livro: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 245 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Livro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public Integer getPaginas() { return paginas; } public void setPaginas(Integer paginas) { this.paginas = paginas; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } } public Livro(Integer id, String titulo, String autor, String isbn, Integer paginas) { this.id = id; this.titulo = titulo; this.autor = autor; this.isbn = isbn; this.paginas = paginas; } public Livro(String titulo, String autor, String isbn, Integer paginas) { this.titulo = titulo; this.autor = autor; this.isbn = isbn; this.paginas = paginas;) { /** * Classe utilizada para representar um Livro. */ public class Livro { private Integer id; private String titulo; private String autor; private String isbn; private Integer paginas; package material.swing.modelo;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 246 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


39 40 41 42 } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; }

Vamos criar uma classe chamada Conexao para fazer a conexo e desconexo do banco de dados.
Livro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 /* Cria a conexo com o Mysql. */ this.conn = DriverManager.getConnection("jdbc:mysql://localhost/ gerenciarlivro", "root", "root"); System.out.println("Conectado no banco da dados."); } catch (ClassNotFoundException ex) { /** * Mtodo que cria a conexo com o banco de dados. * * @return Connection representando a conexo com o banco de dados. */ private void conectar() throws Exception { try { /* Carrega o driver de conexo do MySql. */ Class.forName("com.mysql.jdbc.Driver"); } public Conexao() throws Exception { conectar(); /** * Classe utilizada para realizar a conexo e desconexo do banco de dados. */ public class Conexao { private Connection conn = null; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; package material.swing.dao;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 247 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 } } } catch (SQLException ex) { ex.printStackTrace(); System.out.println("No conseguiu fechar a conexo com o banco de dados."); } } /** * Mtodo que fecha a conexo com o banco de dados. * * @param conn - Connection que ser fechada. */ public void desconectar() { try { /* Se a conexo no for nula e no estiver fechada, ento fecha a conexo com o banco de dados.*/ if(this.conn != null && !this.conn.isClosed()) { this.conn.close(); System.out.println("Desconectado do banco de dados."); } /** * Mtodo que pega a conexo. * * @return Connection */ public Connection getConn() { return this.conn; } } ex.printStackTrace(); throw new Exception("Erro ao carregar o driver do Mysql."); } catch (SQLException ex) { ex.printStackTrace(); throw new Exception("Nao conseguiu conectar com o banco de dados.");

Agora vamos cria a classe LivroDAO que ser responsvel por manipular os dados referentes a livro no banco de dados:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 248 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


Livro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package material.swing.dao; import import import import import import java.sql.ResultSet; java.sql.SQLException; java.sql.Statement; java.util.ArrayList; java.util.List; material.swing.modelo.Livro;

/** * Classe utilizada para realizar as operaes de Livro no Banco de dados. */ public class LivroDAO { public Livro salvar(Livro livro) throws Exception { Conexao conexao = new Conexao(); Statement stm = null; ResultSet rs = null; try { stm = conexao.getConn().createStatement(); if(livro.getId() == null) { String consultarId = "SELECT MAX(ID) + 1 PROXIMO_ID FROM LIVRO"; rs = stm.executeQuery(consultarId); if(rs.next()) { livro.setId(rs.getInt("PROXIMO_ID")); String insert= "INSERT INTO LIVRO (ID, TITULO, AUTOR, ISBN, + " VALUES (" + livro.getId() + ", '" + livro.getTitulo() + "', '" + livro.getAutor() + "', '" + livro.getIsbn() + "', " + livro.getPaginas() + ")"; stm.execute(insert); } } else { String atualizar = " UPDATE LIVRO SET TITULO = '" + livro.getTitulo() "', AUTOR = '" + livro.getAutor() + "', ISBN = '" + livro.getIsbn() + "', PAGINAS = " + livro.getPaginas() + " WHERE ID = " + livro.getId();

PAGINAS)"

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 249 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

System.out.println(atualizar); stm.execute(atualizar); } } catch (SQLException ex) { ex.printStackTrace(); throw new Exception("Erro ao salvar o livro no banco de dados."); } finally { if(rs != null && !rs.isClosed()) { rs.close(); } if(stm != null && !stm.isClosed()) { stm.close(); } conexao.desconectar(); } return livro; } public boolean excluir(Integer id) throws Exception { boolean apagou = false; Conexao conexao = new Conexao(); Statement stm = null; try { String delete = "DELETE FROM LIVRO WHERE ID = " + id; stm = conexao.getConn().createStatement(); stm.execute(delete); apagou = true; } catch (SQLException ex) { ex.printStackTrace(); throw new Exception("Erro ao excluir o livro no banco de dados."); } finally { if(stm != null && !stm.isClosed()) { stm.close(); } conexao.desconectar(); } return apagou; } public List<Livro> consultarTodos() throws Exception { List<Livro> livros = new ArrayList<Livro>(); Conexao conexao = null;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 250 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 } 113 } Statement stm = null; ResultSet rs = null; try { conexao = new Conexao(); String consulta = "SELECT * FROM LIVRO ORDER BY TITULO"; stm = conexao.getConn().createStatement(); rs = stm.executeQuery(consulta); while(rs.next()) { Livro livro = new Livro(rs.getInt("ID"), rs.getString("TITULO"), rs.getString("AUTOR"), rs.getString("ISBN"), rs.getInt("PAGINAS")); livros.add(livro); } } catch (SQLException ex) { ex.printStackTrace(); throw new Exception("Erro ao consultar os livros no banco de dados."); } finally { if(rs != null && !rs.isClosed()) { rs.close(); } if(stm != null && !stm.isClosed()) { stm.close(); } conexao.desconectar(); } return livros;

Feito a parte de comunicao com o banco de dados, vamos criar a tela principal do sistema: Crie um JFrame chamado Biblioteca e adicione dentro dele um Menu Bar (JMenuBar) :

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 251 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Quando criamos um JMenuBar, o mesmo j vem com dois JMenu (File e Edit), altere os textos deles para Arquivo e Livro, depois altere o nome das variveis para menuArquivo e menuLivro respectivamente:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 252 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Agora dentro do menu Arquivo, vamos adicionar um Menu Item (JMenuItem), esse item ter o nome Sair e o nome da varivel deve ser alterado para arquivoSair. Nossa JFrame deve ficar da seguinte forma:

O item Sair ser utilizado para encerrar a aplicao. Dentro do menu Livro, adicione os seguintes Menu Itens (Novo e Listar) e os nomes das variveis devem ser livroNome e livroListar respectivamente:

Agora vamos criar um novo JFrame chamado LivroNovo, que ser utilizado para cadastrar novos livros:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 253 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Nesta tela vamos definir os seguintes construtores:


NovoLivro.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package material.swing.tela; import javax.swing.JOptionPane; import material.swing.dao.LivroDAO; import material.swing.modelo.Livro; /** * Classe utilizada para representar a tela de cadastro de livro. */ public class LivroNovo extends javax.swing.JFrame { private Livro livro; public LivroNovo() { this.livro = new Livro(); initComponents(); } public LivroNovo(Livro livro) { initComponents(); this.livro = livro; txtAutor.setText(livro.getAutor()); txtIsbn.setText(livro.getIsbn()); txtPaginas.setText(String.valueOf(livro.getPaginas()));

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 254 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


24 25 txtTitulo.setText(livro.getTitulo()); }

O boto Limpar deve apagar todos os campos da tela.


NovoLivro.java 124 private void limpar() { 125 txtAutor.setText(null); 126 txtIsbn.setText(null); 127 txtPaginas.setText(null); 128 txtTitulo.setText(null); 129 } 130 131 private void btnLimparActionPerformed(java.awt.event.ActionEvent evt) { 132 limpar(); 133 }

O boto Salvar deve salvar os dados do livro na base de dados interessante validar o campo antes de salvar os dados.
NovoLivro.java 135 136 private boolean validarCampos() { if(txtTitulo.getText() == null || txtTitulo.getText().equals("") || txtTitulo.getText().trim().length() == 0) { 137 JOptionPane.showMessageDialog(this, "Campo titulo obrigatrio.", 138 139 140 141 142 if(txtAutor.getText() == null || txtAutor.getText().equals("") || txtAutor.getText().trim().length() == 0) { 143 JOptionPane.showMessageDialog(this, "Campo autor obrigatrio.", 144 145 146 147 148 if(txtIsbn.getText() == null || txtIsbn.getText().equals("") || txtIsbn.getText().trim().length() == 0) { 149 JOptionPane.showMessageDialog(this, "Campo ISBN obrigatrio.", 150 151 152 } "AVISO", JOptionPane.ERROR_MESSAGE); return false; } "AVISO", JOptionPane.ERROR_MESSAGE); return false; } "AVISO", JOptionPane.ERROR_MESSAGE); return false;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 255 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


153 154 if(txtPaginas.getText() == null || txtPaginas.getText().equals("") || txtPaginas.getText().trim().length() == 0) { 155 JOptionPane.showMessageDialog(this, "Campo Pginas obrigatrio.", 156 157 158 159 160 161 162 163 try { int paginas = Integer.valueOf(txtPaginas.getText()); } catch (Exception ex) { } "AVISO", JOptionPane.ERROR_MESSAGE); return false;

JOptionPane.showMessageDialog(this, "O Campo Pginas deve conter apenas nmero inteiro.", 164 "AVISO", JOptionPane.ERROR_MESSAGE); 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 if(!atualizar) { JOptionPane.showMessageDialog(this, "Livro salvo com sucesso!", "Informao", JOptionPane.INFORMATION_MESSAGE); limpar(); } else { this.setVisible(false); LivroDAO dao = new LivroDAO(); dao.salvar(livro); } if(validarCampos()) { livro.setAutor(txtAutor.getText()); livro.setIsbn(txtIsbn.getText()); livro.setTitulo(txtTitulo.getText()); livro.setPaginas(Integer.valueOf(txtPaginas.getText())); private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) { try { boolean atualizar = true; if(livro.getId() == null) { atualizar = false; } return true; } return false;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 256 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


192 193 194 195 } } catch (Exception ex) { }

JOptionPane.showMessageDialog(this, ex.getMessage(), "ERRO", JOptionPane.ERROR_MESSAGE); 196 } 197 }

Crie tambm um JFrame chamado LivroListar, que ser usado para mostrar todos os livros cadastrados e tambm ser usado para excluir um livro ou chamar a tela para alterar os dados do livro:

Vamos criar um mtodo dentro da classe LivroListar para recarregar a tabela mostrando as informaes dos livros que consultamos:
LivroListar.java 82 83 84 85 86 private DefaultTableModel recarregarTabela() { DefaultTableModel modelo = new DefaultTableModel(); modelo.addColumn("ID"); modelo.addColumn("Ttulo"); modelo.addColumn("Autor");

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 257 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


87 88 89 90 91 92 93 94 95 96 97 98 99 } } catch (Exception ex) { for(Livro livro : livros) { modelo.addRow(new Object[] {livro.getId(), livro.getTitulo(), livro.getAutor(), livro.getIsbn(), livro.getPaginas()}); try { LivroDAO dao = new LivroDAO(); List<Livro> livros = dao.consultarTodos(); modelo.addColumn("ISBN"); modelo.addColumn("Pginas");

JOptionPane.showMessageDialog(this, ex.getMessage(), "ERRO", JOptionPane.ERROR_MESSAGE); 100 } 101 102 103 } return modelo;

Personalize o cdigo de criao da tabela, para quando ela for inicializada j consultar as informaes do banco.

O boto Excluir deve excluir o registro de livro que estiver selecionado na tabela.
LivroListar.java 105 106 107 private void brnExcluirActionPerformed(java.awt.event.ActionEvent evt) { try { if(tableLivros.getSelectedRow() >= 0) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 258 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 } } catch (Exception ex) { } if(excluiu) { tableLivros.setModel(recarregarTabela()); JOptionPane.showMessageDialog(this, "Livro apagado com sucesso.", "Apagar Livro", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(this, "Livro no foi apagado.", "Apagar Livro", JOptionPane.ERROR_MESSAGE); LivroDAO dao = new LivroDAO(); boolean excluiu = dao.excluir(id); Integer id = (Integer) tableLivros.getValueAt(tableLivros.getSelectedRow(), 0);

JOptionPane.showMessageDialog(this, ex.getMessage(), "ERRO", JOptionPane.ERROR_MESSAGE); 124 } 125 }

O boto Alterar deve chamar a tela de LivroNovo, passando o objeto livro que foi selecionado na tabela.
LivroListar.java 127 128 129 130 131 132 133 134 135 136 137 138 139 } } LivroNovo ln = new LivroNovo(livro); ln.setVisible(true); private void btnAlterarActionPerformed(java.awt.event.ActionEvent evt) { if(tableLivros.getSelectedRow() >= 0) { Integer id = (Integer) tableLivros.getValueAt(tableLivros.getSelectedRow(), 0); String titulo = (String) tableLivros.getValueAt(tableLivros.getSelectedRow(), 1); String autor = (String) tableLivros.getValueAt(tableLivros.getSelectedRow(), 2); String isbn = (String) tableLivros.getValueAt(tableLivros.getSelectedRow(), 3); Integer paginas = (Integer) tableLivros.getValueAt(tableLivros.getSelectedRow(), 4); Livro livro = new Livro(id, titulo, autor, isbn, paginas);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 259 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Depois de criado as telas LivroNovo e LivroListar vamos adicionar as aes nos itens do menu da tela Biblioteca: O item do menu Arquivo Sair ter o seguinte cdigo que serve para fechar a aplicao.
Biblioteca.java 72 73 74 private void arquivoSairActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); }

O item do menu Livro Novo ter o seguinte cdigo que serve para abrir a tela de Novo Livro.
Biblioteca.java 76 77 78 79 private void livroNovoActionPerformed(java.awt.event.ActionEvent evt) { LivroNovo ln = new LivroNovo(); ln.setVisible(true); }

O item do menu Livro Listar ter o seguinte cdigo que serve para abrir a tela de Listar
Livros.
LivroListar.java 81 82 83 84 private void livroListarActionPerformed(java.awt.event.ActionEvent evt) { LivroListar ll = new LivroListar(); ll.setVisible(true); }

Exerccios
1-) Vamos criar uma calculadora utilizado o Swing. Nossa calculadora dever ter as seguintes operaes: adio, subtrao, diviso e multiplicao. 2-) Crie uma aplicao CRUD (Salvar, Consultar, Atualizar e Apagar) para controlar as informaes referentes Produto (nome, preo, tipo e data de validade) utilize uma interface grfica Swing. OBS: Utilize a estrutura criada no exerccio 1 do capitulo de JDBC. 3-)Realizar a incluso, alterao, excluso e consulta dos dados fornecidos abaixo, no banco de dados. Criar tela em Swing. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 260 -

Programao Orientada a Objetos Universidade Metodista de So Paulo SCRIPT PARA CRIAO DA TABELA : CREATE TABLE IMOVEL ( ID NUMBER, TIPO_IMOVEL VARCHAR2(1), AREA_UTIL NUMBER(6,2), VALOR NUMBER(7,2), DESCRICAO VARCHAR2(200) ); Diagrama de Classes

Passos: Criar classe Imovel com seus getters e setters; Criar classe ImovelDAO com: Conexo com o banco; Desconexo com o banco; Consulta de dados; Insero de dados; Alterao de dados; Excluso de dados.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 261 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 262 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Exemplos de aplicaes Swing


Exemplo de tratamento de exceo usando Swing Primeiramente vamos criar uma tela com o seguinte layout:

Esta nossa tela de exemplo, ir se comunicar com uma classe chamada Divisao, com o seguinte cdigo:
Divisao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 package material.exemplo.calculadora; /** * Classe responsavel por calcular o resto da diviso de dois nmeros. */ public class Divisao { public int restoDaDivisao(int dividendo, int divisor) throws ErroDaConta { if(divisor > dividendo) { throw new ErroDaConta(); } return dividendo % divisor; } }

Note que no exemplo acima, uma nova exceo do tipo ErroDaConta est sendo lanada linha 09, mas no ser tratada por um bloco try, ser remetida a classe que a chama, no nosso caso a classe representada pela tela acima. Isto pode ser observado pelo comando throws na linha 07. Agora criaremos a nossa classe de exceo ErroDaConta.
Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 263 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

ErroDaConta.java 01 02 03 04 05 06 07 08 09 10 11 12 package material.exemplo.calculadora; /** * Classe utilizada para representar uma exceo durante uma diviso invalida. */ public class ErroDaConta extends Exception { private static final long serialVersionUID = 3397131173998746565L; public ErroDaConta() { super("Diviso invalida!"); } }

Desta forma estamos criando nossa prpria exceo, declarando que nossa classe filha de Exception, e que por este motivo ser uma checked exception. Na linha 10 o seguinte construtor da classe Exception est sendo invocado:
Exception.java 40 41 42 public Exception(String message) { super(message); }

Agora que j definimos as classes iniciais, vamos ao cdigo de nossa classe JFrame, do incio do exemplo.
Calculadora.java 101 102 103 104 105 106 107 108 109 110 111 112 113 try { int resto = div.restoDaDivisao(dividendo, divisor); txtResto.setText(String.valueOf(resto)); } catch (ErroDaConta ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "ERRO", JOptionPane.ERROR_MESSAGE); int dividendo = Integer.parseInt(dividendoT); int divisor = Integer.parseInt(divisorT); private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) { Divisao div = new Divisao(); String dividendoT = txtDividendo.getText(); String divisorT = txtDivisor.getText();

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 264 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


114 115 } catch (ArithmeticException ex) {

JOptionPane.showMessageDialog(this, "Diviso por zero!", "ERRO", JOptionPane.ERROR_MESSAGE); 116 } catch (NumberFormatException ex) { 117 JOptionPane.showMessageDialog(this, "Nmero invalido!", "ERRO", JOptionPane.ERROR_MESSAGE); 118 } 119 }

Perceba que, como fizemos uma chamada ao mtodo restoDaDivisao() e o mesmo pode lanar uma exceo ErroDaConta, somos forados a utilizar o bloco try para fazer este tratamento. Conforme a linha 114 tambm est prevendo a possibilidade de nosso usurio solicitar uma diviso por zero, tipo de erro este que representado no Java por uma java.lang.ArithmeticException e na linha 116 estamos prevendo a digitao de um nmero no inteiro atravs da exceo java.lang.NumberFormat Exception (ambas classes filhas de RunTimeException) que no necessitaria ser tratada, pois uma Unchecked Exception.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 265 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Exemplo de aplicao C.R.U.D. com exibio em tela Neste exemplo vamos criar uma tela que ser utilizada para visualizar os caminhes que foram cadastrados, para adicionar novos caminhes e para apagar os caminhes. O script para criao da base de dados e tabela no MySQL:
CREATE DATABASE VEICULOS; USE VEICULOS; CREATE TABLE CAMINHAO ( CODIGO INT NOT NULL, PLACA VARCHAR(8) NOT NULL, MODELO VARCHAR(50) NOT NULL );

OBS: No se esquea de adicionar o driver do banco de dados no seu projeto. Vamos utilizar a classe Caminhao abaixo:
Caminhao.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 package material.swing.crud; /** * Classe utilizada para representar um Caminho. */ public class Caminhao { private Integer codigo; private String placa; private String modelo; public Caminhao() { } public Integer getCodigo() { return codigo; } public void setCodigo(Integer codigo) { this.codigo = codigo; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 266 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

public String getPlaca() { return placa; } public void setPlaca(String placa) { this.placa = placa; } public String getModelo() { return modelo; } public void setModelo(String modelo) { this.modelo = modelo; } }

Vamos agora criar uma classe chamada CaminhaoDAO, que ser utilizada para acessar os dados referentes ao caminho.
CaminhaoDAO.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 /** * Classe utilizada para conectar e desconectar do banco de dados, * salvar, alterar, apagar e consultar todos os caminhes. */ public class CaminhaoDAO { public Connection abrirConexao() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/veiculos", "root", "root"); System.out.println("Conexo criada com sucesso."); import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; package material.swing.crud;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 267 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 } } } } catch (SQLException ex) { ex.printStackTrace(); System.out.println("Erro ao fechar conexo com o BD."); public void fecharConexao(Connection conn) { try { if(conn != null && !conn.isClosed()) { conn.close(); System.out.println("Conexo fechada com sucesso."); } } return conn; } catch (ClassNotFoundException ex) { System.out.println("Erro ao carregar o driver do BD."); } catch (SQLException ex) { ex.printStackTrace(); System.out.println("Erro ao conectar no banco de dados.");

Na linha 14, temos o mtodo que criar as conexes com o banco de dados. Na linha 29, temos o mtodo que fechar as conexes com o banco de dados.
CaminhaoDAO.java 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public Caminhao[] consultarTodos() { Caminhao[] caminhoes = null; Connection conn = null; try { conn = abrirConexao(); if(conn != null) { String consulta = "SELECT * FROM CAMINHAO"; Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(consulta); int cont = 0; while(rs.next()) { cont++;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 268 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 } if(cont > 0) { caminhoes = new Caminhao[cont]; rs.beforeFirst(); int linha = 0; while(rs.next()) { Caminhao caminhao = new Caminhao(); caminhao.setCodigo(rs.getInt("CODIGO")); caminhao.setPlaca(rs.getString("PLACA")); caminhao.setModelo(rs.getString("MODELO")); caminhoes[linha++] = caminhao; } } } } catch (SQLException ex) { ex.printStackTrace(); System.out.println("Erro ao consultar os dados do BD."); } finally { fecharConexao(conn); } return caminhoes; }

Na linha 41, declaramos um mtodo que ser utilizado para consultar todos os caminhes cadastrados. Na linha 48, criamos uma String com a consulta de todos os caminhes da tabela CAMINHAO. Na linha 50, executa a consulta e guarda seu resultado dentro de um ResultSet. Na linha 53, temos um while que serve para percorrer todos os registros do ResultSet para sabermos quantas linhas foram retornadas. Na linha 57, caso o contador tenha o valor maior que 0 (zero), significa que tem registros de caminho na tabela do banco de dados.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 269 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na linha 58, criamos um vetor de Objetos Caminhao, de acordo com a quantidade de registros. Na linha 59, fazemos o ResultSet apontar para antes do primeiro registro, j que percorremos ele inteiro na linha 52 e o mesmo est apontando para o final do ResultSet. Na linha 62, temos um while que ir percorrer todo o ResultSet, criando objetos do tipo Caminhao e guardando os valores consultados da base de dados dentro desses objetos, e depois guardando o objeto caminhao dentro do vetor de caminhes. Na linha 75, utilizamos o bloco finally para fechar a conexo com o banco de dados. Na linha 79, retornamos o vetor de caminhes.
CaminhaoDAO.java 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 public boolean salvarCaminhao(Caminhao caminhao) { boolean salvou = false; Connection conn = null; try { conn = abrirConexao(); String adicionar = "INSERT INTO CAMINHAO VALUES (" + caminhao.getCodigo() + ", '" + caminhao.getPlaca() + "', '" + caminhao.getModelo() + "')"; Statement stm = conn.createStatement(); stm.execute(adicionar); salvou = true; } catch (SQLException ex) { ex.printStackTrace(); System.out.println("Erro ao salvar o caminho no BD."); } finally { fecharConexao(conn); } return salvou; }

Na linha 82, declaramos o mtodo que ir salvar os caminhes na base de dados, este mtodo retorna um boolean informando se conseguiu ou no salvar.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 270 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na linha 88, criamos uma String com o cdigo SQL de insero do caminho na base de dados. Na linha 92, executamos a insero na base de dados. Na linha 97, utilizamos o bloco finally para fechar a conexo com o banco de dados. Na linha 101, retornamos o valor do boolean informando se o caminho foi salvo no banco de dados.
CaminhaoDAO.java 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 public boolean excluirCaminhao(Integer codigo) { boolean excluiu = false; Connection conn = null; try { conn = abrirConexao(); String excluir = "DELETE FROM CAMINHAO WHERE CODIGO = " + codigo; Statement stm = conn.createStatement(); stm.execute(excluir); excluiu = true; } catch (SQLException ex) { ex.printStackTrace(); System.out.println("Erro ao apagar o caminho no BD."); } finally { fecharConexao(conn); } return excluiu; }

Na linha 104, declaramos o mtodo que ir apagar os caminhes da base de dados a partir do seu cdigo, depois ir retornar um boolean informando se conseguiu ou no apagar o caminho. Na linha 109, criamos uma String com o cdigo SQL para apagar o registro do caminho da base de dados. Na linha 111, apagamos o caminho da base de dados. Na linha 117, utilizamos o bloco finally para fechar a conexo com o banco de dados.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 271 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na linha 121, retornamos o valor do boolean informando se o caminho foi removido do banco de dados
CaminhaoDAO.java 124 public boolean alterarCaminhao(Caminhao caminhao) { 125 boolean alterou = false; 126 Connection conn = null; 127 128 try { 129 conn = abrirConexao(); 130 String alterar = "UPDATE CAMINHAO SET PLACA = '" + caminhao.getPlaca() + 131 "'," + " MODELO = '" + caminhao.getModelo() + "' WHERE CODIGO = " + 132 caminhao.getCodigo(); 133 System.out.println(alterar); 134 Statement stm = conn.createStatement(); 135 stm.execute(alterar); 136 alterou = true; 137 } catch (SQLException ex) { 138 ex.printStackTrace(); 139 System.out.println("Erro ao alterar o caminho no BD."); 140 } finally { 141 fecharConexao(conn); 142 } 143 144 return alterou; 145 } 146 }

Na linha 124, declaramos o mtodo que ir alterar os caminhes da base de dados, ser possvel atualizar os campos PLACA e MODELO do caminho. Na linha 130, criamos uma String com o cdigo SQL para atualizar o registro do caminho da base de dados. Na linha 134, atualizamos o caminho da base de dados. Na linha 140, utilizamos o bloco finally para fechar a conexo com o banco de dados. Na linha 144, retornamos o valor do boolean informando se o caminho foi atualizado no banco de dados Vamos criar um JFrame chamado CaminhaoTela para desenharmos a tela do programa.
Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 272 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Dentro do JFrame, adicione um Painel de rolagem (JScrollPane), ele utilizado para fazer barra de rolagem.

Adicione uma Tabela (JTable) dentro do Painel de rolagem, vamos utilizar a tabela para mostrar todos os caminhes que foram cadastrados.

Altere o nome da varivel que representa o objeto da tabela para tabelaCaminhoes.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 273 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Adicione um Separador (JSeparator) na tela, para separarmos a parte que ir listar os caminhes, da parte de edio dos caminhes.

Adicione na tela os Rtulos (JLabel), Campo de texto (JTextField) e Botes (Button - JButton), e altere seus textos conforme a imagem abaixo:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 274 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Altere tambm o nome das variveis dos Campos de texto e Botes conforme abaixo: txtCodigo Campo texto para digitao do cdigo do caminho. txtPlaca Campo texto para digitao da placa do caminho. txtModelo Campo texto para digitao do modelo do caminho. btnNovo Boto que limpa os campos. btnSalvar Boto para salvar um novo caminho. btnAlterar Boto para alterar os dados do caminho. btnApagar Boto para apagar os dados do caminho. Dentro do JFrame CaminhaoTela.java, vamos adicionar o seguinte mtodo que ser usado para carregar os valores referentes aos caminhes cadastrados no banco de dados.
CaminhaoTela.java 140 141 142 143 144 145 146 147 148 149 150 151 152 public DefaultTableModel recarregarTabela() { CaminhaoDAO caminhaoDAO = new CaminhaoDAO(); Caminhao[] caminhoes = caminhaoDAO.consultarTodos(); DefaultTableModel modelo = new DefaultTableModel(); modelo.addColumn("Cdigo"); modelo.addColumn("Placa"); modelo.addColumn("Modelo"); if(caminhoes != null) { for(Caminhao caminhao : caminhoes) { modelo.addRow(new Object[] {caminhao.getCodigo(), caminhao.getPlaca(), caminhao.getModelo()}); }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 275 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


153 154 155 } return modelo; }

Na linha 141, chamamos a classe CaminhaDAO que faz a comunicao com o banco de dados. Na linha 142, consultamos todos os caminhes que esto cadastrados no banco de dados. Na linha 143, criamos um DefaultTableModel que um modelo em que ser adicionado as colunas e registros da tabela JTable. Na linha 144 a 145 adicionamos as colunas da tabela. Na linha 149, percorremos todo o vetor de caminhes adicionando suas informaes no modelo da tabela. Na linha 154, retornamos um modelo de tabela com suas colunas e linhas preenchidas. Agora vamos personalizar o cdigo de criao da JTable que mostrara os caminhes cadastrados no banco de dados, clique com o boto direito em cima da tabela e clique em Personalizar cdigo.

Na tela Personalizador de cdigo, alteramos o valor do segundo ComboBox para propriedade personalizada, dessa forma podemos alterar o cdigo que cria o modelo da tabela, e chamamos o mtodo que acabamos de criar recarregarTabela().
Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 276 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Vamos tambm adicionar um evento de click do mouse na tabela, quando o usurio clicar na tabela iremos preencher os campos Cdigo, Placa e Modelo. Para isso clique com o boto direito do mouse em cima da tabela, selecione Eventos Mouse mouseClicked.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 277 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

No cdigo fonte coloque o seguinte cdigo:


CaminhaoTela.java 240 241 242 private void tabelaCaminhoesMouseClicked(java.awt.event.MouseEvent evt) { if(tabelaCaminhoes.getSelectedRow() >= 0) {

Integer codigo = (Integer) tabelaCaminhoes.getValueAt(tabelaCaminhoes.getSelectedRow(), 0); 243 String placa = (String) tabelaCaminhoes.getValueAt(tabelaCaminhoes.getSelectedRow(), 1); 244 String modelo = (String) tabelaCaminhoes.getValueAt(tabelaCaminhoes.getSelectedRow(), 2); 245 246 247 248 249 250 251 } } txtCodigo.setText(codigo.toString()); txtCodigo.setEditable(false); txtPlaca.setText(placa); txtModelo.setText(modelo);

Na linha 241, estamos validando se uma linha foi selecionada. Da linha 242 a 244 pegamos os valores das colunas da tabela.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 278 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Da linha 246 a 249 estamos alterando o valor dos campos Cdigo, Placa e Modelo, note que na linha 247 estamos chamando o mtodo setEditable() do campo Cdigo passando o parmetro false, dessa forma o campos ser desabilitado para edio. Se executarmos nosso programa veremos que os dados foram consultados da base de dados.

Agora precisamos tambm dar funcionalidades para os botes Novo, Salvar, Alterar e Apagar: Primeiro vamos criar um mtodo para limpar os dados dos campos Cdigo, Placa e Modelo e tambm recarregar a tabela de caminhes:
CaminhaoTela.java 157 158 159 160 161 162 163 private void limparTela() { txtCodigo.setText(null); txtCodigo.setEditable(true); txtPlaca.setText(null); txtModelo.setText(null); tabelaCaminhoes.setModel(recarregarTabela()); }

O boto Novo ter a seguinte ao:


CaminhaoTela.java

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 279 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


212 213 214 private void btnNovoActionPerformed(java.awt.event.ActionEvent evt) { limparTela(); }

Na linha 215, temos o evento actionPerformed do boto Novo. Na linha 216, fazemos a chamada para o mtodo limparTela(), que limpa os campos e recarrega a tabela. O boto Salvar ter a seguinte ao:
CaminhaoTela.java 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) { if(txtCodigo.getText() != null && txtCodigo.getText().trim().length() > 0 && txtPlaca.getText() != null && txtPlaca.getText().trim().length() > 0 && txtModelo.getText() != null && txtModelo.getText().trim().length() > 0) { Caminhao caminhao = new Caminhao(); caminhao.setCodigo(Integer.valueOf(txtCodigo.getText())); caminhao.setPlaca(txtPlaca.getText()); caminhao.setModelo(txtModelo.getText()); CaminhaoDAO caminhaoDAO = new CaminhaoDAO(); boolean salvou = caminhaoDAO.salvarCaminhao(caminhao); if(salvou) { limparTela(); JOptionPane.showMessageDialog(this, "Caminho salvo.", "Salvar caminho.", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(this, "Erro ao salvar o caminho.", "Salvar caminho.", JOptionPane.ERROR_MESSAGE); } } else { JOptionPane.showMessageDialog(this, "Todas as informaes precisam ser preenchidas.", "Dados incompletos.", JOptionPane.ERROR_MESSAGE); } }

Na linha 168, temos o evento actionPerformed do boto Salvar.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 280 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na linha 169, fazemos uma validao para verificar se foram digitados todos os dados do caminho, se algum campo no foi preenchido iremos enviar a mensagem (linha 188) avisando o usurio. Na linha 178, chamamos o mtodo que salva o caminho na base de dados. Na linha 179, verificamos se conseguiu salvar com sucesso, caso consiga, ento limpamos os dados da tela, recarregamos a tabela e informamos ao usurio que foi salvo com sucesso. Na linha 184, caso no consiga salvar vamos informar o usurio. O boto Apagar ter a seguinte ao:

Na linha 194, temos o evento actionPerformed do boto Apagar. Na linha 195, fazemos uma validao para verificar se algum registro da tabela foi selecionado, se nenhuma linha da tabela foi selecionada iremos enviar a mensagem (linha 209) avisando o usurio. Na linha 198, chamamos o mtodo que apaga o caminho da base de dados. Na linha 200, verificamos se conseguiu apagar com sucesso, caso consiga, ento recarregamos a tabela e informamos ao usurio que o caminho foi apagado com sucesso. Na linha 205, caso no consiga apagar vamos informar o usurio.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 281 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

O boto Alterar ter o seguinte cdigo:

Na linha 219, temos o evento actionPerformed do boto Alterar. Na linha 220, fazemos uma validao para verificar se algum registro da tabela foi selecionado, se nenhuma linha da tabela foi selecionada iremos enviar a mensagem (linha 237) avisando o usurio. Na linha 226, chamamos o mtodo que altera o caminho da base de dados. Na linha 228, verificamos se conseguiu alterar com sucesso, caso consiga, ento recarregamos a tabela e informamos ao usurio que o caminho foi alterado com sucesso. Na linha 233, caso no consiga alterar vamos informar o usurio. Agora teste novamente seu programa.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 282 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

19. Leitura de arquivos

Existem diversos meios de se manipular arquivos na linguagem de programao Java. A classe java.io.File responsvel por representar arquivos ou diretrios do seu sistema de arquivos. Esta classe pode fornecer informaes teis assim como criar um novo arquivo, tamanho do arquivo, caminho absoluto, espao livre em disco ou, ainda, exclu-lo. A linguagem Java oferece uma classe especfica para a leitura do fluxo de bytes que compem o arquivo, esta classe chama-se java.io.FileInputStream. A FileInputStream recebe em seu construtor uma referencia File, ou uma String que deve representar o caminho completo do arquivo, dessa forma podemos ler as informaes que esto dentro do arquivo. Tanto a invocao do arquivo pela classe File, quanto diretamente pela FileInputStream far com que o arquivo seja buscado no diretrio em que o Java foi invocado (no caso do NetBeans vai ser dentro do diretrio do projeto). Voc tambm pode usar um caminho absoluto, para ler os arquivos que esto em outros diretrios do seu computador (ex: C: \arquivos\arquivo.txt).

Exemplo de leitura de arquivo


Exemplo de um programa que a partir de um caminho, verifica se este caminho referente a um diretrio ou um arquivo.
ExemploFile.java 01 02 03 04 05 06 07 package material.arquivo; import java.io.File; /** * Classe utilizada para demonstrar o uso da classe File. */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 283 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class ExemploFile { public static void main(String[] args) { ExemploFile ef = new ExemploFile(); ef.verificarCaminho("C:\\Arquivos"); ef.verificarCaminho("C:\\Arquivos\\teste.txt"); } public void verificarCaminho(String caminho) { File f = new File(caminho); System.out.println(caminho); if(f.isFile()) { System.out.println("Este caminho eh de um arquivo."); } else if(f.isDirectory()) { System.out.println("Este caminho eh de um diretorio."); } } }

Criamos um objeto f do tipo File a partir de um caminho recebido, este objeto ser utilizado para representar um arquivo ou diretrio. Verificamos se o objeto f um arquivo, atravs do mtodo isFile() da classe File, caso retorne true, ento ir imprimir a mensagem informando que o caminho referente a um arquivo. Caso contrrio, verificamos se o objeto f um diretrio, atravs do mtodo isDirectory() da classe File, caso retorne true, ento ir imprimir a mensagem informando que o caminho referente a um diretrio. Ao executar a classe ExemploFile, teremos a seguinte sada no console: C:\>javac material\arquivo\ExemploFile.java C:\>java material.arquivo.ExemploFile C:\Arquivos Este caminho eh de um diretorio C:\Arquivos\teste.txt Este caminho eh de um arquivo. Neste exemplo, vamos ler um arquivo .txt e imprimir seu texto no console.
ExemploFileInputStream.java 01 02 package material.arquivo;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 284 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * Classe utilizada para ler as informaes de um arquivo e imprimir * no console. */ public class ExemploFileInputStream { public static void main(String[] args) { ExemploFileInputStream exemplo = new ExemploFileInputStream(); exemplo.lerArquivo("C:\\Arquivos\\teste.txt"); } /** * Mtodo utilizado para ler os dados de uma arquivo. * * @param caminho */ public void lerArquivo(String caminho) { FileInputStream fis = null; try { /* Cria um objeto do tipo FileInputStream para ler o arquivo. */ fis = new FileInputStream(caminho); /* Cria uma variavel interia para ler os caracteres do arquivo, lembrando que todo caractere no Java representado por um numero inteiro. */ int c; /* Le o caracter do arquivo e guarda na variavel inteira c, quando o caracter lido for igual a -1, significa que chegou ao final do arquivo. */ while((c = fis.read()) != -1) { System.out.println((char) c); } } catch (FileNotFoundException ex) { System.out.println("Erro ao abrir o arquivo."); } catch (IOException ex) { System.out.println("Erro ao ler o arquivo."); } finally { try { if(fis != null) { /* Fecha o arquivo que est sendo lido. */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 285 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


46 47 48 49 50 51 52 53 fis.close(); } } catch (IOException ex) { System.out.println("Erro ao fechar o arquivo."); } } } }

Criamos um objeto do tipo FileInputStream, seu construtor recebe uma String com um caminho de arquivo, esta classe l os bytes do arquivo. Para percorrer os bytes do arquivo, vamos declarar uma varivel int c que ser utilizada para guardar os caracteres lidos do arquivo, lembre-se que todos os caracteres em Java so representados por um nmero inteiro. Percorremos todo o arquivo e fazer o casting de inteiro para caractere, para imprimir o texto do arquivo, note que se o valor lido atravs do mtodo read() for igual a -1, significa que chegamos ao final do arquivo. Tambm precisamos tratar as excees que podem ser lanadas durante a leitura de um arquivo. Sempre que estiver manipulando um arquivo, lembre-se de fechar o arquivo utilizando o mtodo close(). Ao executar a classe ExemploFileInputStream, teremos a seguinte sada no console: C:\>javac material\arquivo\ExemploFileInputStream.java C:\>java material.arquivo.ExemploFileInputStream t e s t e

Streams de caracteres
Streams de caracteres a forma como trabalhamos com os prprios caracteres lidos do arquivo, e a partir desses caracteres podemos adicionar filtros em cima deles. Exemplos destes leitores so as classes abstratas java.io.Reader e java.io.Writer.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 286 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

java.io.Reader
A classe abstrata java.io.Reader representa um fluxo de entrada de dados tratados como caracteres. Essa classe possui vrias subclasses dedicadas a cada fonte de dados especfica, tais como a classe java.io.FileReader, que representa a leitura de caracteres de um arquivo Neste exemplo, leremos um arquivo e imprimiremos seus caracteres no console:
ExemploReader.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package material.arquivo; import import import import import java.io.FileNotFoundException; java.io.FileReader; java.io.IOException; java.io.Reader; java.util.Scanner;

/** * Classe utilizada para demonstrar a leitura de caracteres. */ public class ExemploReader { public static void main(String[] args) { ExemploReader exemplo = new ExemploReader(); Scanner s = new Scanner(System.in); System.out.print("Digite o caminho do arquivo: "); String caminho = s.nextLine(); exemplo.lerArquivo(caminho); } public void lerArquivo(String caminho) { Reader r = null; try { r = new FileReader(caminho); int c; while((c = r.read()) != -1) { System.out.print((char) c); } } catch (FileNotFoundException ex) { System.out.println(caminho + " nao existe."); } catch (IOException ex) { System.out.println("Erro de leitura de arquivo."); } finally {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 287 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


34 35 36 37 38 39 40 41 42 43 try { if(r != null) { r.close(); } } catch (IOException ex) { System.out.println("Erro ao fechar o arquivo " + caminho); } } } }

Criamos um objeto do tipo FileReader, seu construtor recebe uma String com um caminho de arquivo, est classe l os caracteres do arquivo. Declaramos uma varivel int c, que ser utilizada para guardar os caracteres lidos do arquivo, lembre-se que todos os caracteres em Java so representados por um nmero inteiro. Percorremos todo o arquivo e vamos fazer o casting de inteiro para caractere, para imprimir o texto do arquivo, note que se o valor lido atravs do mtodo read() for igual a -1, significa que chegamos ao final do arquivo. Tratamos as excees que podem ser lanadas durante a leitura de um arquivo. Sempre que estiver manipulando um arquivo, lembre-se de fechar o arquivo utilizando o mtodo close(). Ao executar a classe ExemploReader, teremos a seguinte sada no console: C:\>javac material.arquivo.ExemploReader.java C:\>java material.arquivo.ExemploReader Digite o caminho do arquivo: C:\Arquivos\Cancao do Exilio.txt Minha terra tem palmeiras, Onde canta o Sabia; As aves, que aqui gorjeiam, Nao gorjeiam como la.

java.io.Writer
A classe java.io.Writer uma classe abstrata que representa um fluxo de sada de dados tratados como caracteres. Essa classe possui vrias subclasses dedicadas a cada fonte de dados especfica, tais como a classe java.io.FileWriter.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 288 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Neste exemplo, leremos um arquivo e o copiaremos para outro arquivo:
ExemploWriter.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package material.arquivo; import import import import import import import java.io.FileNotFoundException; java.io.FileReader; java.io.FileWriter; java.io.IOException; java.io.Reader; java.io.Writer; java.util.Scanner;

/** * Classe utilizada para ler um arquivo e copia-lo. */ public class ExemploWriter { public static void main(String[] args) { ExemploWriter exemplo = new ExemploWriter(); Scanner s = new Scanner(System.in); System.out.print("Digite o caminho do arquivo de entrada: "); String entrada = s.nextLine(); System.out.print("Digite o caminho do arquivo de saida: "); String saida = s.nextLine(); exemplo.copiarArquivo(entrada, saida); } public void copiarArquivo(String entrada, String saida) { Reader reader = null; Writer writer = null; try { reader = new FileReader(entrada); writer = new FileWriter(saida); int c; while((c = reader.read()) != -1) { System.out.print((char) c); writer.write(c); } System.out.println("\n"); } catch (FileNotFoundException ex) { System.out.println(entrada + " ou " + saida + " nao existem!"); } catch (IOException ex) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 289 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 System.out.println("Erro de leitura de arquivo!"); } finally { try { if(reader != null) { reader.close(); } } catch (IOException ex) { System.out.println("Erro ao fechar o arquivo " + entrada); } try { if(writer != null) { writer.close(); } } catch (IOException ex) { System.out.println("Erro ao fechar o arquivo " + saida); } } } }

Criamos um objeto do tipo FileReader, para ler o arquivo. Criamos um objeto do tipo FileWriter, para criar um novo arquivo e escrever nele as informaes do arquivo que ser lido. Percorremos os caracteres do arquivo de entrada e gravaremos os caracteres lidos no arquivo de sada. Para liberar os recurso lembre-se de fechar o arquivo de entrada e o arquivo de sada. Ao executar a classe ExemploWriter, teremos a seguinte sada no console: C:\>javac material\arquivo\ExemploWriter.java C:\>java material\arquivo\ExemploWriter Digite o caminho do arquivo de entrada: C:\Arquivos\entrada.txt Digite o caminho do arquivo de saida: C:\Arquivos\saida.txt Exemplo de copia de arquivo.

Streams de bytes

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 290 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Como j mencionado no ttulo deste material, Streams nada mais so do que fluxos de dados sejam eles de entrada ou de sada. Na linguagem Java, graas aos benefcios trazidos ao polimorfismo, possvel se utilizar fluxos de entrada (java.io.InputStream) e de sada (java.io.OutputStream) para toda e qualquer operao deste gnero, seja ela relativa a um arquivo, a uma conexo remota via sockets ou at mesmo a entrada e sada padro de um programa (normalmente o teclado e o console).

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. Exemplos concretos destas classes podem ser vistos na utilizao dos mtodos print() e println() de System.out , pois out uma java.io.PrintStream, que filha (indiretamente) de OutputStream; e na utilizao de System.in, utilizado na construo de um objeto da classe java.util.Scanner, que um InputStream, por isso o utilizamos para entrada de dados. O importante a se falar sobre as Streams, que como ambas trabalham com leitura e escrita de bytes, importante que seja aplicado um filtro sobre esse fluxo de bytes que seja capaz de converter caracteres para bytes e vice e versa, por este motivo utilizamos o Writer e Reader. Quando trabalhamos com classes do pacote java.io , diversos mtodos lanam java.io.IOException, que uma exception do tipo checked, o que nos obriga a trat-la ou declar-la no mtodo. java.io.InputStream A classe InputStream uma classe abstrata que representa um fluxo de entrada de dados. Esse fluxo de dados recebido de maneira extremamente primitiva em bytes. Por este motivo, existem diversas implementaes em Java de subclasses de InputStream que so capazes de tratar de maneira mais especfica diferentes tipos de fluxos de dados, tais como as classes java.io.FileInputStream, javax.sound.sampled.AudioInputStream, entre outros mais especializada para cada tipo de fonte. java.io.OutputStream A classe OutputStream uma classe abstrata que representa um fluxo de sada de dados. Assim como na InputStream, esse fluxo de dados enviado em bytes, por este motivo,

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 291 -

Programao Orientada a Objetos Universidade Metodista de So Paulo existem diversas implementaes em Java de subclasses de InputStream que so capazes de tratar de maneira mais especfica diferentes tipos de fluxos de dados, tais como as classes java.io.FileOutputStream, javax.imageio.stream.ImageOutputStream, entre outros mais especializados para cada tipo de destino.

Serializao de objetos
Na linguagem Java existe uma forma simples de persistir objetos, uma delas gravando o objeto diretamente no sistema de arquivos. Seguindo a mesma idia das j discutidas FileInputStream e FileOutputStream, existem duas classes especficas para a serializao de objetos. So elas: java.io.ObjectOutputStream e java.io.ObjectInputStream. Para que seja possvel a escrita de um objeto em um arquivo, ou seu envio via rede (ou seja, sua converso em um fluxo de bytes) necessrio inicialmente que este objeto implemente uma interface chamada java.io.Serializable. Por este motivo, a classe do objeto que desejamos serializar deve implementar esta interface, alem do que afim de evitar uma warning (aviso) no processo de compilao ser necessria a declarao de um atributo constante, privado e esttico chamado serialVersionUID. Este atributo apenas ser utilizado como um controlador (um ID) no processo de serializao. A declarao do objeto deve ocorrer assim como segue:
Pessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 package material.arquivo; import java.io.Serializable; /** * Classe utilizada para demonstrar o uso da interface Serializable. */ public class Pessoa implements Serializable { private static final long serialVersionUID = 7220145288709489651L; private String nome; public Pessoa(String nome) { this.nome = nome; } public String getNome() { return nome;

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 292 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


19 20 } }

Este nmero da serialVersionUID pode ser adquirido atravs do programa serialver que vem junto com o JDK, localizado na pasta %JAVA_HOME%\bin. C:\>serialver use: serialver [-classpath classpath] [-show] [classname...] C:\>javac material\arquivo\Pessoa.java C:\> serialver material.arquivo.Pessoa material.arquivo.Pessoa: static final long serialVersionUID = 7220145288709489651L; Feito isso, vamos nos aprofundar nas classes de leitura e escrita de objetos em arquivos fsicos: java.io.ObjectOutputStream Esta classe possui um construtor que, por padro, deve receber uma OutputStream qualquer, como por exemplo uma FileOutputStream para serializao do objeto em um arquivo. Exemplo:
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("arquivo.txt"));

Feita esta instanciao, podemos escrever um objeto qualquer no arquivo relacionado no construtor utilizando o mtodo writeObject (Object obj), da seguinte forma:
Object objeto = new Object(); out.writeObject(objeto);

Assim como no caso do mtodo readObject(), da classe ObjectInputStream, e nos lembrando da premissa da herana, podemos utilizar qualquer objeto neste mtodo, da seguinte forma:
Pessoa Manuel = new Pessoa(); out.writeObject(manuel);

Aps a escrita do arquivo, no se esquea de finalizar a comunicao com o arquivo utilizando o mtodo close(). java.io.ObjectInputStream

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 293 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Esta classe possui um construtor que, por padro, deve receber uma InputStream qualquer, como por exemplo uma FileInputStream para converter um arquivo em Objeto. Exemplo:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("arquivo.txt"));

Feita esta instanciao, podemos ler um objeto a partir do arquivo relacionado no construtor utilizando o mtodo readObject(), da seguinte forma:
Object objeto = in.readObject();

Sobre este mtodo, importante ressaltar que por ele retornar um objeto (lembrando que todos os objetos em Java so, direta ou indiretamente, filhos da classe java.lang.Object) possvel j armazenar este retorno no objeto que j sabemos ser compatvel atravs de uma operao de casting, da seguinte forma:
Pessoa manual = (Pessoa) in.readObject();

Aps a leitura do arquivo, no se esquea de finalizar a comunicao com o arquivo utilizando o mtodo close() de InputStream. Exemplo que armazena um objeto em um arquivo e vice-versa.
TestePessoa.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 package material.arquivo; import import import import import import java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.IOException; java.io.ObjectInputStream; java.io.ObjectOutputStream;

/** * Classe utilizada para gravar um objeto em um arquivo e depois * ler o objeto do arquivo. */ public class TestePessoa { public static void main(String[] args) { TestePessoa tp = new TestePessoa(); String caminho = "arquivo.txt"; Pessoa manuel = new Pessoa("Manuel"); tp.gravarObjeto(manuel, caminho);

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 294 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 Pessoa pessoa = tp.lerObjeto(caminho); System.out.println(pessoa.getNome()); } private void gravarObjeto(Pessoa pessoa, String caminho) { try { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(caminho)); oos.writeObject(pessoa); oos.close(); } catch (FileNotFoundException ex) { System.out.println("Erro ao ler o arquivo: " + caminho); } catch (IOException ex) { System.out.println("Erro ao gravar o objeto no arquivo"); } } private Pessoa lerObjeto(String caminho) { Pessoa pessoa = null; try { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(caminho)); pessoa = (Pessoa) ois.readObject(); ois.close(); } catch (ClassNotFoundException ex) { System.out.println("Erro ao converter o arquivo em objeto"); } catch (IOException ex) { System.out.println("Erro ao ler o objeto do arquivo"); } return pessoa; } }

O programa gera o arquivo.txt com o objeto Pessoa no formato que ele entende para depois converter de novo para objeto Pessoa.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 295 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Exerccios
1-) Crie um arquivo de texto com o seguinte texto: Meu nome <<seu nome>>. Feito isso, crie um programa capaz de ler este arquivo e imprimir seu contedo em tela. 2-) Crie um programa capaz de coletar um texto digitado pelo usurio. Pegue este texto e grave em um arquivo de texto. Lembre-se que o mtodo de escrita em arquivo texto comporta apenas caracteres, logo, converta a String digitada pelo usurio para caracteres por meio do mtodo .toCharArray(). 3-) Crie a seguinte classe Java: Carro private double velocidadeMaxima; // Determina a velocidade mxima do Carro. private String combustivel; // Determina o tipo de combustvel que o Carro aceita. private Color cor; // Determina cor do Carro. E os mtodos: public Carro(double _velocidadeMaxima, String _combustivel, Color _cor){} // Construtor padro da classe. public double getVelocidadeMaxima (){} // Retorna a velocidade mxima do Carro. public String getCombustivel (){} Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 296 -

Programao Orientada a Objetos Universidade Metodista de So Paulo // Retorna o tipo de combustvel que o Carro aceita. public Color getCor(){} // Retorna a cor do Carro. Feito isso, crie um programa principal que serialize e armazene em um arquivo de texto um objeto do tipo criado acima. Seu programa deve tratar uma exceo do tipo FileNotFoundException (na instanciao do FileInputStream) criando um arquivo no sistema de arquivos atravs do comando createNewFile() da classe File. 4-) Crie uma aplicao Swing que permita cadastrar Pessoas (nome, cpf, dataNascimento), os dados das pessoas devem ser salvos em um arquivo .txt no formato: nome, cpf, dataNascimento Sua aplicao tambm deve permitir ler todas as pessoas que esto no arquivo e mostrar em uma tabela. OBS: Utilize uma classe Pessoa para trabalhar com as informaes da pessoa que ser cadastrada ou consultada do arquivo. Para trabalhar com datas pesquise a classe DateFormat. 5-) Crie uma agenda de contatos utilizando Swing, esta aplicao deve salvar os contatos em um arquivo .txt. 6-) Realizar uma consulta, dos dados de um automvel pelo nmero do renavam e depois salvar como XML no arquivo automovel.xml. SCRIPT para criao da tabela: CREATE TABLE AUTOMOVEL ( RENAVAM NUMBER, MARCA VARCHAR2(20), MODELO VARCHAR2(20), TIPO VARCHAR2(20), COR VARCHAR2(15), ANO NUMBER, COMBUSTIVEL VARCHAR2 (15) ); Formato do arquivo XML: <automovel> <renavam>2334433</renavam> <marca>Chevrolet</marca> Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 297 -

Programao Orientada a Objetos Universidade Metodista de So Paulo <modelo>Vectra</modelo> <tipo>sedan</tipo> <cor>preto</cor> <ano>2010<ano> <combustvel>gasolina<combustvel> </automovel> Passos: Criar classe Automvel com seus getters e setters; Criar classe de Conexo com mtodos de abertura e fechamento de conexo; Criar classe AutomovelDAO com mtodo de incluso e consulta que deve ser por RENAVAM. Criar classe AutomovelArquivo com mtodo de gravao do XML.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 298 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

20. Recursos da Linguagem Java

Arrays ou Vetores em Java


Segundo a definio mais clssica da informtica, um vetor uma estrutura de dados homogenia, ou seja, todos os elementos de um vetor so do mesmo tipo. A estrutura bsica de um vetor representada por seu nome e um ndice, que deve ser utilizado toda a vez que se deseja acessar um determinado elemento dentro de sua estrutura. importante ressaltar que todo o vetor possui um tamanho fixo, ou seja, no possvel redimensionar um vetor ou adicionar a ele mais elementos do que este pode suportar. Em Java a posio inicial do vetor definida pelo valor zero. Declarao do vetor Para se declarar um vetor, devemos informar ao menos seu nome e o tipo de dado que este ir armazenar. Em Java, este tipo de dado pode ser representado tanto por um tipo primitivo como por uma classe qualquer, lembrando que as regras de herana tambm so vlidas para vetores. Exemplo: int[] vetorDeInteiros; float[] vetorDeFloat; String[] vetorDeStrings; long[] vetorLong; importante ressaltar que um vetor em Java torna-se um objeto em memria, mesmo que ele seja um vetor de tipos primitivos.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 299 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Inicializao de dados do vetor Uma vez que um vetor torna-se um objeto em memria, sua inicializao muito semelhante de um objeto normal. Uma vez que um vetor uma estrutura de tamanho fixo, esta informao necessria a sua inicializao. int[] vetorDeInteiros = new int[4]; float[] vetorDeFloat = new float[5]; String[] vetorDeString = new String[6]; Assim como uma varivel comum, tambm possvel inicializar um vetor que j foi declarado anteriormente, conforme exemplo a seguir:
ExemplosVetores.java 01 02 03 04 05 06 07 08 09 /** * Classe utilizada para demonstrar o uso de vetor. */ public class ExemplosVetores { public static void main(String[] args) { int[] vetor; vetor = new int[4]; } }

Assim como um objeto, um vetor deve ser inicializado antes de ser utilizado. Uma chamada a um ndice de um vetor no inicializado gera uma exceo. Existe outra forma de se inicializar vetores j com valores em cada uma de suas posies, para isto basta utilizar chaves da seguinte maneira:
ExemplosVetores.java 01 02 03 04 05 06 07 08 /** * Classe utilizada para demonstrar o uso de vetor. */ public class ExemplosVetores { public static void main(String[] args) { int vetor[] = {2, 5, 4, 8, 5}; } }

Note que esta forma de inicializao bastante prtica, porem no deixa clara a quantidade de elementos que h no vetor obrigando o assim que voc conte a quantidade de elementos para saber o tamanho do vetor.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 300 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Acesso aos elementos do vetor Consideremos o cdigo do exemplo anterior, a representao do seu vetor se daria da seguinte forma:
ndice= vetor = 0 2 1 5 2 4 3 8 4 5

Logo, para acessar os valores de cada uma das posies deste vetor voc deve utilizar o seu ndice correspondente dentro de colchetes, assim como segue:
ExemplosVetores.java 01 02 03 04 05 06 07 08 09 10 /** * Classe utilizada para demonstrar o uso de vetor. */ public class ExemplosVetores { public static void main(String[] args) { int vetor[] = {2, 5, 4, 8, 5}; System.out.println("Elemento do indice 2 = " + vetor[2]); System.out.println("Elemento do indice 4 = " + vetor[4]); } }

Com isso teramos a seguinte sada em tela: C:\>javac ExemplosVetores.java C:\>java ExemploVetores Elemento do indice 2 = 4 Elemento do indice 4 = 5 Lembre-se que o primeiro ndice do vetor sempre zero, logo, seu ltimo elemento sempre igual ao tamanho do vetor menos um. Um pouco sobre a classe Arrays Dentro do pacote java.util encontramos uma classe chamada Arrays. Esta classe possui uma srie de mtodos estticos que nos ajudam a trabalhar mais facilmente com vetores. Dentre seus principais mtodos podemos evidenciar os seguintes:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 301 -

Programao Orientada a Objetos Universidade Metodista de So Paulo binarySearch o Este mtodo recebe sempre 2 parmetros sendo um deles o vetor e outro o elemento que se deseja buscar dentro dele. Para isto ele utiliza o mtodo da busca binria que ser discutido mais a frente. sort o Realizar a ordenao de um vetor utilizando um algoritmo do tipo Quick Sort. Este tipo de algoritmo tambm ser discutido mais a diante. Por este mtodo receber o vetor por parmetro (que lembrando, vetores so objetos) ele o ordena e no retorna valor algum, pois sua ordenao j foi realizada. asList o Coverte o vetor em uma coleo do tipo lista. Colees sero discutidas mais a frente copyOf o Cria uma cpia de um vetor. Pode-se copiar o vetor completamente ou apenas parte dele.

Trabalhando com constantes


Assim como outras linguagens de programao, em Java tambm possvel se trabalhar com constantes. Para tanto, basta utilizar o modificador de acesso final. Dependendo do escopo e da utilizao desta sua varivel, possvel combina-la com outros modificadores de acesso, por exemplo. Uma vez que a varivel foi declarada como uma constante, obrigatrio a atribuio de um valor inicial para a mesma. Observe no exemplo abaixo que tanto um atributo como uma varivel interna a um mtodo podem ser declarados como constantes.
ExemploConstantes.java 01 02 03 04 05 06 07 08 09 10 11 /** * Classe utilizada para demonstrar o uso de variaveis do tipo contante. */ public class ExemploConstantes { private final long NUMERO_ATRIBUTO_CONSTANTE = 547L; public final double OUTRO_NUMERO_ATRIBUTO_CONSTANTE = 365.22; public static void main(String[] args) { final char VARIAVEL_CONSTANTE = 'A'; } }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 302 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Tendo em vista que tais variveis foram declaradas como constantes, seu valor no pode ser alterado aps a sua declarao. Observe que a tentativa de atribuir um valor a qualquer uma destas variveis ir gerar um erro de compilao.
ExemploConstantes2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 /** * Classe utilizada para demonstrar o uso de variaveis do tipo contante. */ public class ExemploConstantes2 { private final long NUMERO_ATRIBUTO_CONSTANTE = 547L; public final double OUTRO_NUMERO_ATRIBUTO_CONSTANTE = 365.22; public static void main(String[] args) { final char VARIAVEL_CONSTANTE = 'A'; ExemploConstante exemplo = new ExemploConstante(); exemplo.NUMERO_ATRIBUTO_CONSTANTE = 10001010L; exemplo.OUTRO_NUMERO_ATRIBUTO_CONSTANTE - 201015.06; VARIAVEL_CONSTANTE = 'B'; } }

Enums
As Enums surgiram na linguagem Java a partir da verso 5 como uma alternativa ao uso de constantes, e para atender de maneira melhor algumas das situaes especficas que podem ocorrer durante a programao. Justificativas do uso de Enums a constantes A seguir, temos algumas justificativas do porque de se utilizar Enums em Java em relao s constantes: As constantes no oferecem segurana Como normalmente constantes so variveis de um tipo especfico, caso sua constante sirva para ser utilizada em algum mtodo, qualquer classe pode passar um valor de mesmo tipo da sua constante, mas que na verdade no existe.

Por exemplo, veja a seguinte classe:


ExemploUsarEnums.java 01 /**

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 303 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 * Classe utilizada para demonstrar o uso de enumeration (enum). */ public class ExemploUsarEnuns { public final int CONCEITO_RUIM = 1; public final int CONCEITO_BOM = 2; public final int CONCEITO_OTIMO = 3; public void calcularAprovacao(int conceito) { if(conceito == CONCEITO_OTIMO) { System.out.println("Aprovado com louvor!"); } else if(conceito == CONCEITO_BOM) { System.out.println("Aprovado!"); } else if(conceito == CONCEITO_RUIM) { System.out.println("Reprovado!"); } } }

Caso outra classe invoque o mtodo calcularAprovacao na linha 9 e passe o nmero 4 como parmetro ele simplesmente no funcionar. No h um domnio estabelecido Para evitar duplicidades entre os nomes de constantes nas diversas classes de um sistema, o desenvolvedor forado a padronizar um domnio. Perceba no exemplo anterior que todas as constantes iniciam com o prefixo CONCEITO justamente com este fim. Fragilidade de modelo - Como uma constante sempre requer um valor, caso voc crie um novo valor intermedirio aos j existentes, todos os atuais devero ser alterados tambm. Por exemplo, ainda considerando o exemplo acima, imagine que voc precise criar um novo conceito chamado REGULAR. Qual seria seu valor uma vez que ele deveria estar entre os conceitos RUIM e BOM? Provavelmente voc teria de alterar todo o seu cdigo para algo semelhante ao que segue abaixo:
ExemploUsarEnums2.java 01 02 03 04 05 06 07 08 09 10 /** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public class ExemploUsarEnuns2 { public final int CONCEITO_RUIM = 1; public final int CONCEITO_REGULAR = 2; public final int CONCEITO_BOM = 3; public final int CONCEITO_OTIMO = 4; public void calcularAprovacao(int conceito) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 304 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


11 12 13 14 15 16 17 18 19 20 21 if(conceito == CONCEITO_OTIMO) { System.out.println("Aprovado com louvor!"); } else if(conceito == CONCEITO_REGULAR) { System.out.println("Regular!"); } else if(conceito == CONCEITO_BOM) { System.out.println("Aprovado!"); } else if(conceito == CONCEITO_RUIM) { System.out.println("Reprovado!"); } } }

Note que ao invs de apenas criamos este novo valor, somos forados a alterar os valores das variveis BOM e OTIMO. Imagine isso em um contexto com duzentas ou trezentas variveis, por exemplo.

Seus valores impressos so pouco informativos Como constantes tradicionais de tipos primitivos so apenas valores numricos em sua grande maioria, seu valor impresso pode no representar algo consistente. Por exemplo, o que o nmero 2 significa para voc em seu sistema? Um conceito? Uma temperatura? Um modelo de carro? Etc.

Como criar uma Enum A estrutura de uma Enum bem semelhante de uma classe comum. Toda a Enum possui um construtor que pode ou no ser sobrecarregado. Vamos ao primeiro exemplo:
ConceitosEnum.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public enum ConceitosEnum { OTIMO, BOM, REGULAR, RUIM; public void calcularAprovacao(ConceitosEnum conceito) { if(conceito == OTIMO) { System.out.println("Aprovado com louvor!"); } else if(conceito == REGULAR) { System.out.println("Regular!"); } else if(conceito == BOM) {

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 305 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


16 17 18 19 20 21 System.out.println("Aprovado!"); } else if(conceito == RUIM) { System.out.println("Reprovado!"); } } }

Observe que no exemplo acima quatro valores foram criados nas linhas 5 a 8, mas, diferentemente das constantes, eles no possuem um tipo especfico sendo que todos eles so vistos como elementos da enumerao Conceitos. Isto j torna desnecessria a denominao de um prefixo de domnio para os nomes dos conceitos, visto que a prpria enum j cumpre este papel. Ainda sobre o exemplo acima, tambm vale ressaltar que uma enum pode ter mtodos. O mtodo calcularAprovacao na linha 10 recebe como parmetro agora no mais um nmero inteiro qualquer, mas sim uma enum do tipo ConceitosEnum. Desta forma garante-se que ele sempre receber um valor conhecido e que no teremos os mesmos problemas que poderiam ocorrer com uma varivel de um tipo especfico, tal como ocorria com as constantes. Por fim, observe que como os elementos da enum no possuem mais um valor atrelado a si, a criao de um novo conceito, tal como um EXCELENTE ou PSSIMO em nada influenciaria no cdigo j existente dentro da enum. Uma enum, diferentemente de uma classe, j inicializada quando voc inicia sua aplicao Java, no necessitando ser instanciada. Vamos agora a um exemplo de uma enum com mtodo construtor e com atributos:
ConceitosEnumComConstrutor.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 /** * Classe utilizada para demonstrar o uso de enumeration (enum). */ public enum ConceitosEnumComConstrutor { OTIMO("Aprovado com louvor!"), BOM("Regular!"), REGULAR("Aprovado!"), RUIM("Reprovado!"); private String mensagem; private ConceitosEnumComConstrutor(String mensagem) { this.mensagem = mensagem; }

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 306 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


16 17 18 19 public String calcularAprovacao() { return this.mensagem; } }

Perceba que agora as mensagens esto sendo utilizadas no construtor tero seu valor definido no atributo mensagem para cada um dos elementos da enum. Desta forma, outra classe poderia acessar estes dados de maneira muito mais transparente, conforme o segue abaixo:
PrincipalTesteEnum.java 01 02 03 04 05 06 07 08 09 /** * Classe utilizada para testar o enum. */ public class PrincipalTesteEnum { public static void main(String[] args) { System.out.println("Conceito..: " + ConceitosEnumComConstrutor.OTIMO.calcularAprovacao()); } }

Observe na linha 7 como a enum est sendo invocada. No precisa criar uma instancia para us-la. C:\>javac PrincipalTesteEnum.java C:\>java PrincipalTesteEnum Conceito..: Aprovado com louvor!

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 307 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

21. Collection

Uma coleo (collection) um objeto que serve para agrupar muitos elementos em uma nica unidade, estes elementos preciso ser Objetos, pode ter colees homogneas e heterogneas, normalmente utilizamos colees heterogneas de um tipo especifico. O ncleo principal das colees formado pelas interfaces da figura a abaixo, essas interfaces permitem manipular a coleo independente do nvel de detalhe que elas representam.

Temos quatro grandes tipos de colees: Set (conjunto), List (lista), Queue (fila) e Map (mapa), a partir dessas interfaces, temos muitas subclasses concretas que implementam varias formas diferentes de se trabalhar com cada coleo. Todas as interfaces e classes so encontradas dentro do pacote (package) java.util, embora a interface Map no ser filha direta da interface Collection ela tambm considerada uma coleo devido a sua funo. java.util.Collection A interface Collection define diversos mtodos que so implementados pelas classes que representam colees, dentro das colees so adicionados Objetos tambm chamados de elementos. Alguns dos mtodos que devem ser implementados por todas as subclasses de Collection: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 308 -

Programao Orientada a Objetos Universidade Metodista de So Paulo add(Object e) Adiciona um Objeto dentro da coleo. addAll(Collection c) Adiciona uma coleo de Objetos dentro da coleo. contains(Object o) Verifica se um Objeto est dentro da coleo. clear() - Remove todos os Objetos da coleo. isEmpty() - Retorna uma boolean informando se a coleo est vazia ou no. remove(Object o) Remove um Objeto da coleo. size() - Retorna o tamanho da coleo. toArray() - Converte uma coleo em um vetor. A imagem abaixo mostra em azul as principais filhas da classe Collection, com exceo da interface Map, tambm mostra em verde as classes concretas mais utilizadas que implementam as interfaces.

java.util.Set A interface Set uma coleo do tipo conjunto de elementos. As caractersticas principais deste tipo de coleo so: os elementos no possuem uma ordem de insero e no possvel ter dois objetos iguais. java.util.Queue

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 309 -

Programao Orientada a Objetos Universidade Metodista de So Paulo A interface Queue uma coleo do tipo fila. As principais caractersticas deste tipo de coleo so: a ordem que os elementos entram na fila a mesma ordem que os elementos saem da fila (FIFO), podemos tambm criar filas com prioridades. java.util.Map A interface Map uma coleo do tipo mapa. As principais caractersticas deste tipo de coleo so: os objetos so armazenados na forma de chave / valor, no pode haver chaves duplicadas dentro do mapa. Para localizar um objeto dentro do mapa necessrio ter sua chave ou percorra o mapa por completo. java.util.List A interface List uma coleo do tipo lista, em que a ordem dos elementos dado atravs de sua insero dentro da lista.
ExemploLista.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 import java.util.ArrayList; import java.util.List; /** * Classe utilizada para demonstrar o uso da estrutura * de dados Lista. */ public class ExemploLista { public static void main(String[] args) { List nomes = new ArrayList(); nomes.add("Zezinho"); nomes.add("Luizinho"); nomes.add("Joozinho"); for(int cont = 0; cont < nomes.size(); cont++) { String nome = (String) nomes.get(cont); System.out.println(nome); } } }

Neste exemplo ir imprimir Zezinho, Luizinho e Joozinho, pois a ordem que os elementos foram adicionados na lista. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 310 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Outra forma de percorrer os elementos de uma lista atravs da interface java.util.Iterator.
ExemploLista2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Classe utilizada para demonstrar o uso da estrutura * de dados Lista. */ public class ExemploLista2 { public static void main(String[] args) { List nomes = new ArrayList(); nomes.add("Zezinho"); nomes.add("Luizinho"); nomes.add("Joozinho"); for(Iterator it = nomes.iterator(); it.hasNext();) { String nome = (String) it.next(); System.out.println(nome); } } }

Um pouco sobre Generics


Usualmente, no h uso interessante uma lista com vrios tipos de objetos misturados. Por este motivo, podemos utilizar uma nova estrutura criada a partir do Java 5.0 chamada de Generics. A estrutura de Generics serve para restringir as listas a um determinado tipo de objetos (e no qualquer Object), assim como segue o exemplo:
ListaPessoa.java 01 02 03 04 05 import java.util.ArrayList; import java.util.List; /** * Classe utilizada para demonstrar o uso da estrutura

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 311 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 * de dados Lista com Generics. */ public class ListaPessoa { public static void main(String[] args) { List<Pessoa> pessoas = new ArrayList<Pessoa>(); pessoas.add(new Pessoa("Rafael")); pessoas.add(new Pessoa("Cristiano")); /* Observe que o casting no necessrio, pois o compilador j sabe que dentro da lista s tem objetos do tipo Pessoa. */ Pessoa p = pessoas.get(0); /* Podemos utilizar o for-each para percorrer os elementos da lista. */ for(Pessoa pessoa : pessoas) { System.out.println(pessoa.getNome()); } } }

Repare no uso de um parmetro < ... > ao lado do List e ArrayList. Este parmetro indica que nossa lista foi criada para trabalhar exclusivamente com objetos de um tipo especfico, como em nosso caso a classe Pessoa. A utilizao deste recurso nos traz uma segurana maior em tempo de compilao de cdigo, pois temos certeza que apenas ter objetos do tipo Pessoa dentro da lista.

Exerccios
1-) Crie um programa que represente e teste a seguinte estrutura: Uma funcionrio possui matricula, nome, cargo e pode estar trabalhando em diversos projetos, um Projeto possui cdigo, nome, durao e funcionrios que participam deste projeto. 2-) Dado uma classe Livro, com as propriedades nome, autor, isbn, paginas e preo, crie um programa que permita ao usurio entrar com os dados de alguns livros, esses livros devem ser guardados dentro de uma coleo filha da interface java.util.List. Depois crie um mtodo que utiliza o algoritmo de Bubble Sort, para ordenar est lista de acordo com o nome do livro e no final imprima a lista de livros ordenado.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 312 -

Programao Orientada a Objetos Universidade Metodista de So Paulo 3-) Continuando o exerccio 2, crie um algoritmo de Pesquisa Binaria, que possa consultar um livro pelo seu nome, autor ou isbn. Lembre-se de ordenar a lista de livros antes de fazer a pesquisa.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 313 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Apndice A Boas prticas

O Java como qualquer outra linguagem tem algumas boas praticas de desenvolvimento, para padronizar o cdigo fonte. Nos nomes que usamos para representar pacote, classe, mtodo, varivel e etc, devemos ter bom senso para criar nomes que facilitem a identificao do mesmo. Nome de pacote (package) O nome de pacote (package) normalmente representado por uma palavra em minsculo, por exemplo:

Neste exemplo, temos os seguintes pacotes: br metodista (dentro da pasta br) poo (dentro da pasta metodista) aula1 (dentro da pasta poo) aula2 (dentro da pasta poo) Usamos os pacotes para separa os fontes da nossa aplicao, de forma que fique mais fcil encontrar classes de um determinado assunto ou objetivo.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 314 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Nome de classe O nome da classe deve comear com o primeiro caractere de cada palavra em maisculo, por exemplo:

OBS: Dentro de cada arquivo .java s pode existir uma classe public, as demais classes devem ter acesso default. E o nome do arquivo .java deve ser o idntico ao nome da classe public. Nome de mtodo O nome de mtodo segue o seguinte padro: a) se o nome do mtodo tem apenas uma palavra, ento o nome todo em minsculo; b) se o nome do mtodo tem mais de uma palavra, ento o primeiro caractere de cada palavra a partir da segunda palavra deve se maisculo e o restante da palavra em minsculo. Exemplo:

Nome de varivel O nome de varivel segue o seguinte padro: a) se o nome da varivel tem apenas uma palavra, ento o nome todo em minsculo; b) se o nome da varivel tem mais de uma palavra, ento o primeiro caractere de cada palavra a partir da segunda palavra deve ser maisculo e o restante da palavra em minsculo. Exemplo: Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 315 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Indentao Uma outra boa pratica do desenvolvimento em qualquer linguagem de programao a indentao (alinhamento) do cdigo fonte, facilitando a visualizao. Um bom padro de indentao pode ser da seguinte forma, a cada bloco de abre chave { e fecha chave } ou a cada condio que pode executar um cdigo, deve ter seu cdigo interno com um espaamento maior, por exemplo:

Comentrios Outra boa pratica do desenvolvimento de software o comentrio sobre o cdigo escrito, dessa forma fica mais fcil identificar qual o objetivo de uma classe, mtodo, varivel, etc. Comentrio pode ser feito de trs formas em Java: // Comentrio de uma nica linha

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 316 -

Programao Orientada a Objetos Universidade Metodista de So Paulo /* Comentrio com mais de uma linha */ /** * Javadoc * Mais informaes sobre o javadoc no tpico abaixo. */

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 317 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Apndice B Javadoc

Javadoc um utilitrio do pacote de desenvolvimento Java utilizado para a criao de um documento HTML com todos os mtodos e atributos das classes contidas em seu projeto, alm dos comentrios inseridos com as tags especiais: /** * Comentrio do JavaDoc. */ Os comentrios do Javadoc so usados para descrever classes, variveis, objetos, pacotes, interfaces e mtodos. Cada comentrio deve ser colocado imediatamente acima do recurso que ele descreve. Tambm possvel utilizar-se de comandos especiais, que servem como marcao, para que na gerao do documento determinadas informaes j sejam colocadas em campos especficos, tais como o autor do mtodo descrito ou sua verso. Segue abaixo alguns destes comandos: Comentrios gerais @deprecated - adiciona um comentrio de que a classe, mtodo ou varivel deveria no ser usada. O texto deve sugerir uma substituio. @since - descreve a verso do produto quando o elemento foi adicionado especificao da API. @version - descreve a verso do produto. @see - essa marca adiciona um link seo "Veja tambm" da documentao. Comentrios de classes e interfaces

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 318 -

Programao Orientada a Objetos Universidade Metodista de So Paulo @author - autor do elemento. @version - nmero da verso atual. Comentrios de mtodos @param - descreve os parmetros de um mtodo acompanhado por uma descrio. @return - descreve o valor retornado por um mtodo. @throws - indica as excees que um dado mtodo dispara com uma descrio associada. Comentrios de serializao @serial - para documentar a serializao de objetos. Exemplo:
ConexaoBD.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * Classe utilizada para realizar as interaes com o banco de dados. */ public class ConexaoBD { /** * Mtodo construtor. * Voc deve utiliza-lo para conectar a base de dados. * @param usuario usurio do banco de dados * @param senha senha do usurio de acesso * @param ipDoBanco endereo IP do banco de dados * @param nomeDaBase nome da base de dados * @throws SQLException * @throws Exception * @author Cristiano Camilo * @since 1.0 * @version 1.0 */ public ConexaoBD(String usuario, String senha, String ipDoBanco, String nomeDaBase) throws SQLException , Exception { Class.forName("com.mysql.jdbc.Driver");

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 319 -

Programao Orientada a Objetos Universidade Metodista de So Paulo


26 27 28 29 30 31 32 + Connection conn = DriverManager.getConnection("jdbc:mysql://" + ipDoBanco "/" + nomeDaBase, usuario, senha); System.out.println("Conectado ao banco de dados."); } //Outros mtodos }

No NetBeans ou Eclipse, a utilizao de tal notao j automaticamente interpretada pela IDE, e ao se invocar este mtodo de qualquer classe do projeto, nos ser exibido uma verso compacta do javadoc da mesma, assim como segue: conexao.ConexaoBD(String usuario, String senha, String ipDoBanco, String nomeDaBase) Mtodo construtor. Voc deve utiliza-lo para conectar a base de dados. Parameters: usuario usurio do banco de dados senha senha do usurio de acesso ipDoBanco endereo IP do banco de dados nomeDaBase nome da base de dados Throws: SQLException Exception @author Cristiano Camilo @since 1.0 @version 1.0 Gerando a documentao em HTML Depois comentar seu programa usando as tags acima, basta somente deixar o javadoc fazer o seu trabalho, pois o mesmo vai se encarregar de gerar um conjunto de pginas HTML. No diretrio que contm os arquivos-fonte execute o comando: javadoc -d dirDoc nomeDoPacote Onde dirDoc o nome do diretrio onde se deseja colocar os arquivos HTML. Gerando a documentao em HTML com Eclipse

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 320 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Tambm possvel se gerar essa documentao a partir do Eclipse, para isso faa: Clique no se projeto com o boto direito do mouse e selecione a opo Export... Na janela de opes que ser exibida, selecione a opo Javadoc e clique em Next...

A prxima janela a ser exibida pede que mais informaes sejam fornecidas. A primeira delas corresponde ao caminho do arquivo executvel do Javadoc, mais abaixo voc deve marcar a partir de qual pacote do seu projeto o Javadoc ser gerado. possvel deixar a pasta do projeto marcada para que o Java gere documentao de todo o seu projeto. Mais abaixo existe a opo de visibilidade dos membros os quais voc deseja criar seu Javadoc. Deixe marcada a opo public, para que a documentao seja gerada para todos os membros de suas classes que estaro disponveis para as demais classes. O importante aqui notar que ser gerada a documentao sempre do nvel selecionado at os outros

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 321 -

Programao Orientada a Objetos Universidade Metodista de So Paulo nveis menos restritos, ou seja, selecionando private, a documentao gerada ser de todos os termos private, default ou package, protected e public. Por fim temos a opo de Doclet, que corresponde ao padro de fonte que ser utilizado, deixe marcada a opo Standard Doclet, e aponte o destino de gerao de sua documentao na opo Destination.

Feito isso, basta clicar em Finish e sua documentao estar disponvel na pasta solicitada.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 322 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Apndice C Instalando e Congurando o Java

Java Development Kit (JDK) O Java Development Kit o nome dado ao pacote de aplicativos fornecidos pela Oracle para o desenvolvimento de aplicaes Java. Este manual dedica-se a lhe fornecer os passos bsicos para efetuar a instalao deste pacote de aplicativos e como configur-lo adequadamente. Fazendo o download No site da Oracle http://www.oracle.com/technetwork/java/javase/downloads/index.html disponibilizado o JDK para download. Busque pela verso mais atualizada para download, atualmente temos a verso 7.0 update 2. Clicando em download, ser apresentado a verso do Java para o sistema operacional de sua preferencia, lembrando que para fazer o download necessrio aceitar os termos e licena da Oracle. O download do Windows x64, por exemplo, tem cerca de 87MB e aps a sua finalizao execute-o. A primeira tela que aparece sobre a Licena de uso do Java, clique em Aceitar (Accept) para continuar.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 323 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na prxima tela podemos definir onde o Java deve ser instalado, clique em Prximo (Next) para continuar.

Na prxima tela mostra a instalao do Java.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 324 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Clique em Concluir (Finish), para terminar a instalao.

Durante a instalao do Java SDK, tambm comea a instalao do Java SE Runtime Environment (JRE). Escolha onde o JRE deve ser instalado e clique em Prximo (Next) para continuar. Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai - 325 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na prxima tela mostra a instalao do JRE.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 326 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Depois da instalao do JDK e JRE precisamos configurar algumas variveis de ambiente: Nas Propriedades do sistema, clique em Variveis de ambiente na aba Avanado.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 327 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Adicione a varivel do sistema CLASSPATH com o valor apenas de um ponto final. Esta varivel serve para executar os comandos do java de diretrio.

Adicione a varivel do sistema JAVA_HOME com o valor igual ao caminho onde foi instalado o Java.

Agora altere a varivel de sistema Path, no final dela adicione ;%JAVA_HOME%\bin.

Para testar se o Java esta instalado e configurado corretamente, abra um command, pode ser feito atravs do menu Iniciar / Executar, digite cmd e clique em ENTER.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 328 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

No command digite java version, deve ser impresso no console a verso do Java que est instalado.

Depois de instalado o Java podemos tambm instalar um IDE para facilitar o desenvolvimento. Instalao do Netbeans O download do NetBeans pode ser feito atravs do site: http://netbeans.org/downloads / index.html, neste exemplo baixamos a distribuio Java de 216MB, pois nessa instalao demonstro como instalar o NetBeans completo, para desenvolvimento desktop e web. Execute o arquivo de instalao do NetBeans e aparecer a tela abaixo de configurao.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 329 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Na tela de Bem-vindo, selecione os servidores web GlassFish e Apache Tomcat apenas se desejar configura-los para desenvolvimento web.

Marque a opo de aceito da licena do NetBeans e clique em Prximo.

Neste tela precisamos informar onde o NetBeans ser instalado e qual verso do Java vamos utilizar.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 330 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Nesta tela podemos definir onde ser instalado o servidor web Glassfish.

Nesta tela podemos definir onde ser instalado o servidor web Tomcat.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 331 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Depois que as configuraes foram feitas, clique no boto Instalar.

Na prxima tela mostrado o progresso da instalao do NetBeans.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 332 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Depois de instalado o NetBeans podemos fazer o registro on-line ou clicar em Finalizar, para concluir a instalao.

Instalao do Eclipse

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 333 -

Programao Orientada a Objetos Universidade Metodista de So Paulo O download do eclipse pode ser feito atravs do site: http://www.eclipse.org/downloads/, neste exemplo fizemos o download do Eclipse 3.5 distribuio Eclipse IDE for Java EE Developers de 189MB, pois atravs dela podemos programar Java para desktop e web. Depois de feito o download do arquivo eclipse-jee-galileo-SR1-win32.zip, basta apenas extrai-lo em um diretrio do computador. O Eclipse pode ser executado atravs do arquivo eclipse.exe dentro da pasta do eclipse:

Quando o eclipse carrega ele pergunta onde o diretrio que esto os projetos:

Podemos informar um local onde est os projetos e tambm podemos deixar marcado a caixa Use este como um padro e no pergunte novamente (Use this as the default and do not ask again), para que est caixa de dialogo no aparea novamente. A tela do eclipse a seguinte:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 334 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 335 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Apndice D Primeira aplicao no NetBeans

O NetBeans uma IDE de desenvolvimento que fornece suporte aos mais variados segmentos de desenvolvimento Java, bem como algumas outras linguagens de programao como Ruby e C/C++, tambm possui suporte a modelagem UML. Permite o desenvolvimento de aplicaes Java simples console, aplicaes desktop client/server, aplicaes web distribudas e aplicaes de dispositivos portteis. O NetBeans tambm conta com um ambiente de desenvolvimento amigvel, simples e intuitivo.

Iniciando o NetBeans 6.0

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 336 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Tela principal do NetBeans 6.0 A seguir vamos mostrar um passo a passo de como criar uma aplicao console utilizando o NetBeans: Criando um novo Projeto Java Na IDE do NetBeans, clique em File (Arquivo) e depois em New Project (Novo Projeto) ou utilize o atalho Ctrl+Shift+N:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 337 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Na tela de New Project (Novo Projeto), escolha a categoria Java e em seguida escolha o projeto Java Application (Aplicao Java): Feito isso clique em Next (Prximo) para continuarmos a criao do projeto.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 338 -

Programao Orientada a Objetos Universidade Metodista de So Paulo Aparecer a janela de New Java Application (Nova Aplicao Java). Nesta janela, devemos preencher os campos: - Project Name (Nome do Projeto), utilize um nome que tenha relao com o programa que voc ir desenvolver. - Project Location (Localizao do Projeto), este campo indica onde os arquivos do projeto sero salvos, caso voc queria procurar pelos arquivos desenvolvidos no projeto. Ateno, caso voc queira resgatar suas classes mais tarde, este ser o caminho que voc acessar para localizar seus arquivos .java. Dentro do projeto tem uma pasta chamada src e dentro desta pasta fica os arquivos fontes. - Set as Main Project (Definir como Projeto Principal) apenas identificar a IDE que este seu projeto principal de trabalho, caso voc possua mais de um projeto aberto dentro do NetBeans. - Create Main Class (Criar Classe Principal) possvel criar uma classe inicial no projeto. Esta classe ser responsvel por iniciar a chamada a outras classes do projeto. Coloque um nome que julgar melhor, sendo que no nosso caso colocamos o nome HelloWorld, devido a sua funo em nosso projeto. Feito isso clique em Finish (Finalizar) para terminar a criao do projeto Java.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 339 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Criado o projeto Java teremos a seguinte estrutura:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 340 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

1. Estrutura do Projeto Java. 2. rea de edio das classes. 3. Navegao da classe que esta aberta na rea 2, serve para visualizar atributos e mtodos da classe. 4. Sada da execuo das aplicaes console. Testando a aplicao console Hello World Escrevendo o cdigo da aplicao:

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 341 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Executando a aplicao java: Para executarmos a aplicao podemos clicar no cone Run Main Project (Executar projeto principal) ou podemos executar apenas a classe que criamos clicando com o boto direito em cima de HelloWorld.java e clicando no menu Run File (Executar arquivo).

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 342 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Depois que executamos a aplicao Java temos a seguinte sada na aba Output.

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 343 -

Programao Orientada a Objetos Universidade Metodista de So Paulo

Bibliograa
Big Java Cay Horstmann - Bookman [DEVMEDIA] Conceitos bsicos das plataformas Java e J2ME - http://www.devmedia.com.br/ articles/viewcomp.asp?comp=6484&hl Eclipse http://www.eclipse.org Estrutura de Dados e Algoritmos em Java Michal T. Goodrich e Roberto Tamassia Estruturas de dados & algoritmos em Java Robert Lafore [GREEN PROJECT] A brief History of the Project Green - http://kenai.com/projects/duke/ pages/GreenProject Java Como Programar Deitel Prentice Hall JavaDoc - API JDK 1.6 - http://docs.oracle.com/javase/6/docs/api/ [JAVA SE] Tecnologia Java SE - http://www.oracle.com/technetwork/java/javase/tech/ index.html NetBeans - http://www.netbeans.org/ Recurso e algoritmos recursivos - http://www.ime.usp.br/~pf/algoritmos/aulas/recu.html The Java Tutorials: Collections - http://docs.oracle.com/javase/tutorial/collections/index.html Use a Cabea Java Kathy Sierra e Bert Bates OReilly Varargs - http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

Criado por Cristiano Camilo dos Santos de Almeida e Rafael Guimares Sakurai

- 344 -

You might also like