You are on page 1of 69

JAVA

Cludio Mrcio do Nascimento Abreu Pereira 2012

JAVA

Cludio M. N. A. Pereira

Sumrio
CONCEITOS INTRODUTRIOS...........................................................................................................................3 INTRODUO PROGRAMAO ORIENTADA A OBJETOS....................................................................................3 INTRODUO LINGUAGEM JAVA..................................................................................................................... 5 ALGUMAS CARACTERSTICAS DA LINGUAGEM JAVA...........................................................................................5 INDEPENDENCIA DE PLATAFORMA..................................................................................................................... 6 PLATAFORMAS DE DESENVOLVIMENTO JAVA..................................................................................................... 7 PARA COMEAR: O CLSSICO HELLOWORLD!................................................................................................. 8 ESTRUTURA BSICA DA LINGUAGEM............................................................................................................9 TIPOS DE DADOS.............................................................................................................................................. 9 DECLARAES DE VARIVEIS E CONSTANTES.................................................................................................... 9 OPERADORES BSICOS.................................................................................................................................... 10 ESTRUTURAS DE CONTROLE DE FLUXO............................................................................................................ 10 FUNES........................................................................................................................................................ 13 MATRIZES (ARRANJOS).................................................................................................................................... 13 MANIPULAO DE CADEIAS DE CARACTERES (STRINGS)....................................................................................14 CLASSES NUMRICAS...................................................................................................................................... 15 ENTRADA E SADA PADRO (TECLADO E MONITOR).........................................................................................16 ORIENTAO OBJETOS EM JAVA..............................................................................................................18 INTRODUO A CLASSES E OBJETOS EM JAVA.................................................................................................. 18 CONSTRUTORES.............................................................................................................................................. 23 MATRIZES DE OBJETOS................................................................................................................................... 26 MTODOS E ATRIBUTOS DE CLASSE (STATIC)............................................................................................... 28 HERANA....................................................................................................................................................... 29 POLIMORFISMO NA HERANA........................................................................................................................... 35 CLASSES ABSTRATAS...................................................................................................................................... 40 INTERFACES.................................................................................................................................................... 43 PACOTES (PACKAGES)..................................................................................................................................... 46 GENERICS................................................................................................................................................................48 MTODOS GENRICOS..................................................................................................................................... 48 CLASSES GENRICAS....................................................................................................................................... 50 A CLASSE GENRICA ARRAYLIST.................................................................................................................... 51 BANCO DE DADOS.................................................................................................................................................54 JAVA DATABASE CONECTIVITY: JDBC............................................................................................................ 54 CONECTANDO AO BD..................................................................................................................................... 54 EXECUTANDO SENTENAS SQL....................................................................................................................... 57 DATA ACCESS OBJECT: DAO.......................................................................................................................... 59 JAVA ENTERPRISE EDITION.............................................................................................................................62 INTRODUO.................................................................................................................................................. 62 SERVLET CONTAINER...................................................................................................................................... 62 CRIANDO UM PROJETO WEB............................................................................................................................ 63 JAVA SERVER PAGES: JSP............................................................................................................................... 63 SERVLETS....................................................................................................................................................... 66

JAVA

Cludio M. N. A. Pereira

CAPTULO 1

CONCEITOS INTRODUTRIOS
Introduo Programao Orientada a Objetos
___________________________________________________________________________________ A constante busca por conceitos e tcnicas que permitam ao programador lidar cada vez melhor com a complexidade envolvida nos sistemas a serem desenvolvidos leva ao aprimoramento das linguagens e tcnicas de programao. Legibilidade, modularidade, confiabilidade, facilidade de manuteno e reusabilidade de cdigo so pontos que norteiam o surgimento dos novos conceitos em programao. Com esta mesma motivao, surgem os conceitos de Programao Orientada a Objetos (POO). A POO um paradigma de programao (uma forma de programar) que baseia-se na organizao dos programas atravs de entidades chamadas objetos, que encapsulam dados (que caracterizam o objeto) e funes (que definem seu comportamento). O encapsulamento possibilitado pela utilizao de objetos proporciona maior modularidade e maior confiabilidade no reaproveitamento de cdigo. Atravs do conceito de herana (carcterstica marcante da POO) a reutilizao de cdigo otimizada. O polimorfismo que a POO tambm nos permite, seja atravs de herana ou sobrecargas, que se escreva cdigos mais claros e legveis. Programao Orientada a Objetos (P.O.O.): um paradigma de programao (uma forma de prograr) que utiliza entidades/estruturas que encapsulam dados e funes, chamadas objetos. As 3 principais caractersticas da POO so: Encapsulamento Polimorfismo Herana

Encapsulamento: Os dados e as funes so encapsulados em uma entidade chamada objeto. Os dados representam as caractersticas do objeto enquanto as funes representam seu comportamento. Atravs do encapsulamento, as caractersticas dos objetos (dados) s podem ser acessadas atravs das funes. Os dados ficam escondidos (protegidos) do meio externo e s devem ser acessados atravs das funes (que determinam seu comportamento). As funes so a interface entre o objeto e o mundo externo (outros objetos) e podem controlar o fluxo de informaes, fazendo validaes de forma a proteger os dados de situaes indevidas. Objeto 1 Funes Dados Objeto 2 Funes Dados

Figura 3.1. Encapsulamento dos dados: comunicao dos objetos atravs de suas funes Polimorfismo: 3

JAVA

Cludio M. N. A. Pereira

a caracterstica que permite a utilizao de uma mesma referncia assumindo diversas formas (comportamento, contedo). Atravs do polimorfismo possvel escrever cdigos/programas de forma mais simplificada, clara e compacta. Herana: o mecanismo atravs do qual pode-se criar novas definies de objetos (classes) a partir de definies j existentes, sem a necessidade de reescrever o cdigo existente. Entre outras coisas, a herana permite um melhor reaproveitamento do cdigo. Objeto: uma entidade que encapsula que encapsulam dados (que caracterizamm o objeto) e funes (que definem seu comportamento). O objeto uma instncia (algo concreto), que interage no mundo Orientado a Objetos (OO). Na OO no mais existem mais funes ou dados soltos, ou seja, sem estarem relacionados a um determinado objeto. Classe: uma abstrao que caracteriza um conjunto de objetos. Toda a programao na OO escrita dentro de classes. ATENO: Classes NO so um conjunto de objetos. Criao de Objetos: Os objetos so uma instncia de uma classe. ATENO: De certa forma, pode-se entender a classe como sendo um tipo (meio metido a besta, por que alm de campos de dados possui funes associadas mesma), pois define o tipo de objeto. O objeto, por sua vez, pode ser entendido como uma varivel, pois ele possui valores associados aos seus campos de dados. Atributos e Mtodos: Aos campos de dados, definidos atravs de declarao de variveis, d-se o nome de atributos. As funes so denominadas mtodos. Atributos e mtodos so denominados membros de uma classe. Mensagem: a chamada a um mtodo de um objeto. Exemplo: Para ilustrar os conceitos de classe e objetos, veja,os o exemplo a seguir, onde se define uma classe, cria-se um objeto e acessa-se um de seus mtodos. - Definio de uma classe Pessoa com atributos: nome e identidade e mtodos: leDados e imprimeDados. Classe Pessoa nome, identidade leDados 4 imprimeDados

JAVA

Cludio M. N. A. Pereira

Atributos { Mtodos {

- Criao de um objeto p, da classe Pessoa: Pessoa p; Obs.: Note que seria similar declarao de uma varivel p do tipo Pessoa. - Acessando mtodos do objeto p (mensagem para p): p.leDados( ) p.imprimeDados( )

Introduo Linguagem Java


___________________________________________________________________________________ A linguagem Java foi concebida pele Sun Microsystems, objetivando-se aplicaes voltadas para produtos eletrnicos de grande consumo, tais como televises, videocassetes, e outros eletrodomsticos. No entanto, a escolha deste ramo de aplicao no surtiu o efeito esperado. Algum tempo depois, com a popularizao da Internet e da World Wide Web (WWW), surgia uma nova e interessante aplicao para a linguagem - as Applets - pequenos programas Java executados do lado do cliente, proporcionando animao e interatividade aos at ento estticos documentos HTML. Devido diversos fatores, como o consumo computacional (no popular: applets so pesadas para carregar/executar), segurana, alm do surgimento de outras linguagens (script) mais leves, as applets passaram a ser pouco utilizadas. Por outro lado, a utilizao de Java cresceu vertiginosamente do lado do servidor e hoje a principal e mais robusta plataforma para servidores Web. Paralelamente, com os avanos na computao mvel (Palmtops e Celulares), a linguagem se reencontrou no que diz respeito programao de dispositivos eletrnicos de alto consumo sua motivao inicial. Neste documento abordaremos a linguagem Java de uma forma geral, conceitos de orientao a objeto e sua aplicao em desenvolvimento de sistemas para Web.

Algumas Caractersticas da Linguagem Java


___________________________________________________________________________________ Java uma linguagem de programao desenvolvida a partir do C++ e implementa o paradigma de Programao Orientada para Objetos. uma linguagem interpretada, o que a torna independente de plataforma, ou seja, um mesmo programa pode ser executado em qualquer mquina que possua seu interpretador. Dentre as principais caractersticas de linguagem Java, podem ser citadas:

JAVA

Cludio M. N. A. Pereira

- uma linguagem que herdou muitas de suas caractersticas do C++, que uma linguagem extremamente poderosa, difundida e implementa o paradigma de Programao Orientada para Objetos (POO). - Como o C++ prope-se a manter compatibilidade com o C, que no implementa POO, este um ambiente hbrido, tornando necessrios cuidados na POO. No caso do Java, nenhuma compatibilidade foi requerida, o que fez da mesma uma linguagem puramente orientada para objetos, implicando em maiores facilidades para POO. - Apresenta melhoramentos gerais em relao ao C++, como por exemplo, no gerenciamento de memria, comumente problemtico no C++. Existem mecanismos de coleta de lixo (garbage collection) que cuidam da desalocao dinmica de memria, retirando esta tarefa do programador. - independente de plataforma, o que permite que o mesmo programa possa ser executado em qualquer mquina que possua seu interpretador.

Independencia de Plataforma
___________________________________________________________________________________ O fato de ser interpretada torna a linguagem Java independente de plataforma, o que viabiliza a execuo de um programa escrito em Java em diversas plataformas computacionais. Os compiladores Java no convertem o programa fonte em instrues de mquina especficas de um processador (chamada cdigo nativo), e sim em um conjunto intermedirio de instrues chamado bytecode, que independe de uma plataforma especfica. Para executar este bytecode, a linguagem Java necessita de um programa interpretador, chamado Java Virtual Machine (JVM), que capaz de interpret-lo, permitindo sua execuo em qualquer mquina. Existem compiladores e interpretadores Java para vrias plataformas e sistemas operacionais, como PC rodando Windows, UNIX, OS/2; Workstations rodando Unix, Macintoshes rodando MacOS, supercomputadores etc. Um programa compilado em linguagem Java pode ser executado (atravs do interpretador) em qualquer uma destas mquinas. A Figura 1 exemplifica a portabilidade e independncia de plataforma do Java, comparados com programas gerados por linguagens convencionais onde cdigo nativo de mquina gerado (ex.: Pascal, C, C++). Compilador Java (PC/Windows) Cdigo Fonte Java Compilador Java (Sun/Solaris) Compilador Java (PC/LINUX) Bytecode Java Interpretador Java (PC/Windows) Interpretador Java (Sun/Solaris) Interpretador Java (PC/LINUX)

(a)

Compilador (PC/Windows) Cdigo Fonte Compilador (Sun/Solaris) Compilador (PC/LINUX) 6

Executvel (PC/Windows) Executvel (Sun/Solaris) Executvel (PC/LINUX)

JAVA

Cludio M. N. A. Pereira

(b) Figura 1 - Programas gerados em (a) Java, (b) Compiladores Convencionais (cdigo nativo)

Plataformas de Desenvolvimento Java


___________________________________________________________________________________ A linguagem Java distribuda em 3 plataformas bsicas: Java Standard Edition (Java SE) destinada ao desenvolvimento de aplicaes Java em geral Java Enterprise Edition (Java EE) destinada ao desenvolvimento de aplicaes Java para Web (lado do servidor) Java Micro Edition (Java ME) desetinada ao desenvolvimento de aplicaes Mobile (ou de poucos recursos).

Estas plataformas de desenvolvimento, no so amarradas a um ambiente integrado (IDE) especfico (para edio, compilao, execuo, depurao etc). Sua utilizao pode ser feita atravs de linha de comando do sistema operacional ou atravs de IDEs distribuidas no mercado, sendo algumas delas gratuitas (Eclipse, Netbeans, entre outras). Desenvolvimento sem uso de IDEs O procedimento bsico para desenvolvimento de um programa Java sem utilizao de IDE pode ser: - Edio do programa fonte: Abra um editor de textos e escreva o cdigo fonte Java e salve o texto como nome.java (onde nome pode ser qualquer nome dado ao seu programa). - Compilao do programa fonte: Na linha de comando do sistema operacional, execute o compilador java (javac.exe) que estar no diretrio bin, dentro da diretrio principal do Java, como exemplo abaixo. c:\> c:\<diretrio do java>\bin\javac nome.java Com este comando, sero gerados arquivos com extenso .class, com o nome de cada classe programada no fonte (nome.java). Este arquivo bytecode que pode ser executado em qualquer plataforma. - Execuo (aplicao fora de um navegador): Se o programa for uma aplicao fora da Internet, execute o interpretador java (java.exe) conforme exemplo a seguir. c:\> c:\ <diretrio do java>\bin\java nome_classe OBS: A interface com o usurio para programao, compilao e execuo utilizando-se alguma IDE pode variar de uma para outra, entretanto, aspectos bsicos como criao de projetos e insero das classes nos projetos costumam ser mantidos. Exemplos de IDEs bastante utilizados no mercado so o Eclipse e o NetBeans.

JAVA

Cludio M. N. A. Pereira

Para comear: o clssico HelloWorld!


___________________________________________________________________________________ Como todos os meus alunos j sabem, uma maldio pode cair sobre aqueles que tentarem aprender uma nova linguagem sem iniciar por um Hello World!. Portanto, vamos ele. Primeiramente, em qualquer editor de textos, digite o seguinte programa: Programa Exemplo 1.1:
//----------------------------------------------------------------// Programa HelloWorld: // Obs: Primeiro programa //----------------------------------------------------------------class HelloWorld { public static void main (String args[]) { System.out.println ("Hello World!"); } }

A respeito do primeiro programa, pode-se fazer as seguintes consideraes: 1) Assim como as linguagens C e o C++ a linguagem Java "case sensitive" (diferencia letras maisculas e minsculas); 2) A maneira de se definir uma classe em Java muito parecida com C++: class nome { ... } 3) Os comentrios em Java, como no C e no C++ so feitos com /* e */ para incio e trmino de comentrio, ou // para comentar a linha inteira. 4) Toda aplicao Java (fora de um navegador) deve conter um mtodo main que deve ser public e static. 5) O mtodo main recebe strings como argumentos String args[] que permite que o mesmo receba parmetros. 6) A instruo System.out.println (Hello World!); executa o mtodo println do objeto out do pacote System, que exibe um string (no caso Hello World!) na tela.

JAVA

Cludio M. N. A. Pereira

CAPTULO II

ESTRUTURA BSICA DA LINGUAGEM


Neste captulo so apresentados de forma bastante suscinta aspectos bsicos da estrutura da linguagem Java, no tendo a pretenso de cobrir todos os detalhes. Uma boa parte deste captulo pode ser dispensvel para quem est familiarizado com a linguagem C, pois a estrutura bsica da linguagem Java muito semelhante da linguagem C.

Tipos de Dados
___________________________________________________________________________________ Tabela 2.1 - Tipos da Linguagem Java Tipo byte short int long float double char boolean Descrio Inteiro de 8 bits Inteiro de 16 bits Inteiro de 32 bits Inteiro de 64 bits Real de preciso simples Real de preciso dupla Caracter simples Lgico ( veradeiro ou falso)

OBS: Ponteiros (*), struct e unions (do C e C++) NO so suportados pela linguagem Java.

Declaraes de Variveis e Constantes


___________________________________________________________________________________ Declarao de variveis: Sintaxe: tipo nome_da_varivel_1, ..., nome_da_varivel_N; Exemplo:
int num, a, b; float x, y;

Declarao de constantes: O modificador final utilizado para declarao de constantes, seguindo a seguinte sintaxe: Sintaxe: 9

JAVA

Cludio M. N. A. Pereira

final tipo nome_constante = valor; Exemplo:


final double PI = 3.14159;

Operadores Bsicos
___________________________________________________________________________________ Tabela 2.2 - Operadores Aritmticos Operador + (binrio) - (binrio) * / % + (unrio) - (unrio) ++ -Descrio Soma Subtrao Multiplicao Diviso Resto da diviso inteira Indica valor positivo Indica valor negativo Incremento (pr e ps-fixado) *ver exemplos Decremento (pr e ps-fixado) *ver exemplos

Tabela 2.3 - Operadores Relacionais e Lgicos Operador > >= < <= == != && || ! Descrio maior Maior ou igual menor Menor ou igual igual Diferente e ou Negao

Tabela 2.5 - Operadores de atribuio (alguns) Operador += -= *= /= Descrio a += b equivale a: a = a + b; a -= b equivale a: a = a - b; a *= b equivale a: a = a * b; a /= b equivale a: a = a / b;

Estruturas de Controle de Fluxo


___________________________________________________________________________________

10

JAVA

Cludio M. N. A. Pereira

A seguir so mostradas as sintaxes e exemplos simples dos comandos bsicos utilizados para controle de fluxo. O comando condicional if - else: Sintaxe:
if (condio) { instruo_1; ... } else { instruo_L; ... }

Exemplo:
if (a < b) { c=a; } else { c=b; }

Observaes: i) Se hover apenas uma instruo, as chaves podem ser omitidas. ii) A parte do else opcional O comando de mltipla escolha switch-case: Sintaxe:
switch(varivel) { case valor_1: instruo 1; break; ... case valor_n: instruo n; break; default: instrucao m; // Obs.: O caso default opcional }

Exemplo:
switch (a) { case 1: System.out.println("Pequeno"); break; case 2: System.out.println("Medio"); break; case 3: System.out.println("Grande"); break; default: System.out.println("Nenhuma das respostas anteriores"); }

Observaes: i) O comando break proporciona a sada do bloco switch. Se no fosse utilizado, as sentenas dos cases seguintes seriam executadas. Para verificar isto, teste o exemplo abaixo com e sem o comando break. 11

JAVA

Cludio M. N. A. Pereira

ii) A palavra default uma opo executada caso nenhum dos cases o seja. Sua utilizao opcional. O comando de repetio for: Sintaxe:
for(expressao_1; expressao_2; expressao_3) { instruo_1; ... instruo_N; }

Exemplo:
for (i=0; i<10; i++) System.out.println(i= + i);

Observaes: Se hover apenas uma instruo, as chaves podem ser abolidas. O comando de repetio while: Sintaxe:
while (condio) { instruo_1; ... instruo_N; }

Exemplo:
int i = 0; while (i<10) { System.out.println("i=" + i); i++; }

O comando de repetio do - while: Sintaxe:


do { instruo; } while (expresso lgica);

Exemplo:
int i; do { System.out.println("i=" + i); i++; } while ( i<10);

12

JAVA

Cludio M. N. A. Pereira

Observaes: Se hover apenas uma instruo, as chaves podem ser abolidas.

Funes
___________________________________________________________________________________ A declarao e implementao de funes (mtodos) feita como em C e C++, utilizando-se a seguinte sintaxe: Sintaxe:
tipo nome_da_funcao(parmetros) { comando_1; ... comando_N; }

Observaes: i) Como no C/C++ a distino entre o conceito de procedimentos e funes feita simplesmente atravs do tipo de retorno, onde tipo void caracteriza que a funo no retorna valor, sendo um puro procedimento. ii) O valor de retorno passado atravs do comando return (como no C/C++) que provoca a sada imediata da funo. Exemplo:
float Quadrado(float x) { return x*x; }

iii) Como no C++, parmetros de tipos basicos so passados por valor, enquanto matrizes so passadas por referncia. iv) Deve-se salientar que, como veremos mais frente, devido ao fato de Java ser uma linguagem puramente orientada a objetos, as funes estaro sempre dentro de uma classe.

Matrizes (arranjos)
___________________________________________________________________________________ Matrizes (ou arranjos) so estruturas de dados homogneas, ou seja, que permitem armazenar uma lista de itens de um mesmo tipo. Em Java, as matrizes devem ser alocadas dinamicamente, atravs do operador new, como na linguagem C++. No entanto, a desalocao fica por conta da linguagem, que oferece um servio de coleta de lixo (garbage collection) facilitando a programao.

Sintaxe:
tipo nome_da_matriz[]; ou

13

JAVA

Cludio M. N. A. Pereira

tipo[] nome_da_matriz;

Dimensionamento e alocao:
tipo nome_da_matriz[] = new tipo [dimenso]; ou tipo[] nome_da_matriz = new tipo [dimenso];

Exemplo:
int matInt [] = new int [10];

Matrizes com mais de uma dimenso: Sintaxe:


tipo nome_da_matriz[][] = new tipo [dimenso1][dimenso2];

Exemplo: O trecho abaixo declara e aloca uma matriz 10 por 10 de double.


double Notas[][] = new double[10][10];

A propriedade length: A propriedade length retorna o nmero elementos da matriz (qual o tamanho da matriz). Exemplo:
... Tamanho = System.in.read(); int m[] = new int [Tamanho]; System.out.println(A dimensao de m e: +m.length;

OBS:A linguagem Java possui recursos mais avanados para manipulao de listas. Estes sero abordados mais tarde.

Manipulao de cadeias de caracteres (strings)


___________________________________________________________________________________ Em Java, seqncias de caracteres (strings) so manipulados atravs de objetos definidos na linguagem. A classe String: A classe String permite a manipulao de strings constantes. Exemplo de alguns de seus mtodos so apresentados abaixo. length() que retorna o comprimento da string; charAt(pos) que retorna o caracter em dada posio; substring(inicio, fim) que retorna um trecho da string entre inicio e fim; indexOf(String ou char) que retorna a posio do String ou char indicado; toUpperCase() que retorna uma cpia da string, com todos os caracteres maisculos; 14

JAVA

Cludio M. N. A. Pereira

entre outros (vide documentao da linguagem). Programa Exemplo 2.1: Classe String
//----------------------------------------------------------------------------// Programa TesteString: // // Obs: Exemplifica a utilizao de metodos da classe String //----------------------------------------------------------------------------class TesteString { public static void main(String args[]) { String str = "Sou tricolor do coracao. Sou do time tantas vezes campeao."; System.out.println("Toda a string: " + str); System.out.println("Tamanho da string: " + str.length()); System.out.println("Char na posicao 7: " + str.charAt(7)); System.out.println("String: " + str.substring(25,57)); System.out.println("Posicao do primeiro d: " + str.indexOf('d')); System.out.println("Posicao da palavra tricolor: "+str.indexOf("tricolor")); System.out.println("Todas maiusculas: "+str.toUpperCase()); System.out.println("Todas minusculas: "+str.toLowerCase()); } }

Comparao de Strings: A comparao dos contedos de duas strings podem ser feitas atravs do mtodo equals ...
if (s1.equals(s2)) { System.out.println("Iguais"); }else { System.out.println("Diferentes"); }

... A classe "StringBuffer": uma classe que manipula strings variveis, e possui mtodos para sua manipulao, tais como: append() acrescenta string ou caracter no final; insert(pos) insere string ou caracter em dada posicao; replace(inco, fim , String) troca contedo entre incio e fim por um dado String; delete(inicio, fim) deleta caracteres de un StringBuffer; length() que retorna o comprimento da string; charAt(pos) que retorna o caracter em dada posio; reverse() inverte a ordem dos caracteres;

entre outros (vide documentao da API da linguagem).

Classes Numricas
___________________________________________________________________________________ Na linguagem Java existem classes que permitem manipulao de objetos com caractersticas numricas, tais como Double, Integer, entre outros, permitindo converses entre tipos, converses para strings etc. 15

JAVA

Cludio M. N. A. Pereira

A classe Integer: A classe Integer possui vrios mtodos que permitem a manipulao de nmeros inteiros, dentre os quais pode-se destacar: toString(int i) que converte o nmero i para String;

Exemplo:
String Str; Str = Integer.toString(456); // Str receber a string 456

parseInt(String Str) que converte uma string para o inteiro equivalente;

Exemplo:
String Str = 1234; int num = Integer.parseInt(Str); // num receber o nmero 1234

A classe Double: A classe Double possui vrios mtodos que permitem a manipulao de nmeros reais de dupla preciso, dentre os quais pode-se destacar: toString(double i) que converte o nmero i para String;

Exemplo:
String Str; Str = Double.toString(125.47); // Str receber a string 125.47

parseDouble(String Str) que converte uma string para o inteiro equivalente;

Exemplo:
String Str = 12.34; double num = Double.parseDouble(Str); // num receber o nmero 12.34

Observao: Como as classes Integer e Double, existem outras similares para manipulao de outros tipos de dados, por exemplo: Float, Long e Short.

Entrada e Sada Padro (teclado e monitor)


___________________________________________________________________________________ Impresso em tela: Como j foi visto, a impresso de mensagens em tela pode ser feita atravs da classe System.out. Os mtodos print e println esto disponveis. Atravs desses mtodos, pode-se concatenar a impresso de constantes e variveis, atravs do operador +. Exemplo: 16

JAVA

Cludio M. N. A. Pereira

int i = 10;
System.out.println("O valor de i e = " + i);

Leitura de teclado: A leitura de teclado pode ser feita de algumas formas diferentes. Um forma simples e prtica de faz-lo utilizando a classe Scanner, que por sua vez associado ao objeto de entrada padro System.in. O objeto scanner possui mtodos especficos para cada tipo de dado a ser lido. Exemplo:
Scanner teclado = new Scanner(System.in); String nome = teclado.nextLine(); // L uma string

int id = teclado.nextInt(); // L um int

Programa Exemplo 2.2: Entradas e sadas


//----------------------------------------------------------------// Programa : Teclado.java //----------------------------------------------------------------import java.util.Scanner; public class Teclado { public static void main(String a[]) { Scanner teclado = new Scanner(System.in); System.out.print("Nome: "); String nome = teclado.nextLine(); System.out.print("Id: "); int id = teclado.nextInt(); System.out.println("Nome = " + nome); System.out.println("Id = " + id); } }

Observao: Algumas classes da linguagem Java so encontradas em pacotes (como se fossem bibliotecas), que precisam ser importadas (atravs do comando import), como a classe Scanner.

17

JAVA

Cludio M. N. A. Pereira

CAPTULO III

ORIENTAO OBJETOS EM JAVA


Este captulo inicia com a implementao dos conceitos bsicos de POO utilizando-se linguagem Java. Na sequncia, novos conceitos vo sendo introduzidos, juntamente com a ilustrao dos mesmos atravs de exemplos programados em Java.

Introduo a Classes e Objetos em Java


___________________________________________________________________________________ Definio da classe em JAVA: A criao de uma classe em Java feita atravs da palavra reservada class, seguida do nome que se deseja dar classe. Sintaxe:
class nome_da_classe { // Atributos especificador tipo atributo_1; ... especificador tipo atributo_N; // Mtodos especificador tipo metodo_1 () {...} ... especificador tipo metodo_N () {...} }

Exemplo:
class Pessoa { private String nome; private long identidade; public void leDados() {...} public void imprimeDados() {...} }

} atributos } mtodos

Especificadores de acesso ao membros de uma classe: Os membros de uma classe podem ser declarados como: - private, que o torna acessvel apenas dentro da classe que o contm. 18

JAVA

Cludio M. N. A. Pereira

- protected, que o torna acessvel dentro da classe que o contm e nas suas classes derivadas (falaremos de classes derivadas mais frente no assunto Herana). - public, que o torna acessvel em qualquer parte do sistema. OBS: Se nada for dito, os membros so acessveis dentro do prprio pacote (fonte). Encapsulamento: obtido atravs da utilizao de atributos private de forma que os mesmos sejam acessados apenas atravs de mtodos (public) da classe, proporcionando maior segurana no acesso aos dados (os mtodos podem, por exemplo, fazer validaes, verificar excees etc). Sintaxe de criao de um objeto em Java: A criao de um objeto feita atravs da associao de um nome (nome do objeto) classe a que o mesmo deve poertencer. como se fossemos criar uma varivel do tipo da classe. No entanto sua alocao deve ser dinmica, atravs do operador new. Sintaxe: Nome_da_classe nome_do_objeto; // cria a referncia para o objeto Nome_do_objeto = new Nome_da_classe (); // aloca objeto ou Nome_da_classe nome_do_objeto = new Nome_da_classe (); // cria referncia e aloca objeto Exemplo: Pessoa p; // p uma referncia paraum objeto da classe Pessoa p = new Pessoa( ); // alocao do objeto ou Pessoa p = new Pessoa( ); OBS: Os parnteses aps o nome da classe sero explicados quando falarmos de construtor. Acesso aos mtodos de uma classe: O acesso a um mtodo da classe (tambm denominado mensagem para o objeto) feito da seguinte forma: Sintaxe: nome_do_objeto.metodo(); Exemplo:
p.leDados();

Programa Exemplo 3.1: Classes e objetos 19

JAVA

Cludio M. N. A. Pereira

//----------------------------------------------------------------// Programa : TesteClasses.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------public class Pessoa { // Atributos private String nome; private long identidade; // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteClasses //----------------------------------------------------------------public class TesteClasses { public static void main(String args[]) { // Criacao de objeto Pessoa p = new Pessoa(); // Utilizao do objeto p p.dados("Cludio", 1234); p.print(); } }

Exerccio: Altere o exemplo anterior de forma que o nome e a identidade sejam lidos via teclado. Atribuio entre objetos: A atribuio entre objetos, utilizando-se o operasdor = provoca uma cpia da referncia para o objeto (NO REPLICA SEU CONTEDO). ATENO: A alterao dos atributos de um objeto que recebeu outro implica na alterao dos atributos do objeto copiado. Exemplo:
Obj1 = Obj2; Obj1.X = 10; // Implica em Obj2.X = 10

20

JAVA

Cludio M. N. A. Pereira

Programa Exemplo 3.2: Atribuio de objetos


//----------------------------------------------------------------// Programa : TesteCopiaComparacao.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade; // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteCopiaComparacao //----------------------------------------------------------------class TesteAtribuicaoComparacao { public static void main(String args[]) { Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa(); Pessoa p3; p1.dados("Cludio", 1234); p2.dados("Cludio", 1234); // Copia referncia de p3 para p1 p3 = p1; System.out.println("Atributos de p3:"); p3.print(); System.out.println(); if (p1==p3) System.out.println("p1 == p3"); else System.out.println("p1 != p3"); if (p1==p2) System.out.println("p1 == p2"); else System.out.println("p1 != p2"); System.out.println(); // Alterando atributos de p3, altera-se tambm os de p1 p3.dados("Joao", 9876); System.out.println("Atributos de p1:"); p1.print();

21

JAVA

Cludio M. N. A. Pereira

} }

Sobrecarga de mtodos: o mecanismo atravs do qual se pode criar mais de 1 mtodo com o mesmo nome. As listas de parmetros, no entanto precisam ser diferentes. Programa Exemplo 3.3: Sobrecarga de mtodo
//----------------------------------------------------------------// Programa : TesteSobrecarga.java //----------------------------------------------------------------import Java.util.Scanner; //----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade; // Metodo para passagem de dados (sobrecarregado) public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para leitura de dados via teclado (sobrecarregado) public void dados () { Scanner t = new Scanner(System.in); System.out.println("Nome: "); nome = t.nextLine(); System.out.println("Identidade: "); identidade = t.nextLong(); } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteSobrecarga //----------------------------------------------------------------class TesteSobrecarga { public static void main(String args[]) { // Criacao de objeto com construtor sem parmetros Pessoa p = new Pessoa(); p.dados("Cludio", 1234); // chama: dados(String n, long id) p.print();

22

JAVA

Cludio M. N. A. Pereira

p.dados(); // chama: dados() p.print(); } }

O objeto this: A palavra reservada this se refere ao prprio objeto. Este recurso costuma ser utilizado para distinguir variveis com nomes iguais aos atributos. Exemplo:
class Pessoa { private String nome; private long identidade; public void dados (String nome, long identidade) { this.nome = nome; // o atributo nome recebe o parmetro nome this.identidade = identidade; // idem para identidade } ... }

Os modificadores public, abstract e final na declarao da classe: - public declara que a classe pode ser utilizada fora do pacote (package) onde se encontra. - abstract declara que a classe foi escrita apenas para derivar subclasses e no pode ser instanciada. - final daclara que a classe no pode possuir classes derivadas. Um dos principais motivos para se escrever classes final segurana. A ausncia de modificadores faz com que as classes possam ser utilizadas no pacote onde esto escritas.

Construtores
___________________________________________________________________________________ Construtores so mtodos especiais executados automaticamente quando um objeto criado. Os construtores devem possuir o mesmo nome da classe e no tem tipo de retorno. OBS: Se houver um construtor definido na classe, o mesmo ser obrigatoriamente executado. Caso no haja, um construtor default (que no recebe parmetros e no faz nada) utilizado (de forma transparente para o programador). Programa Exemplo 3.4: Construtor sem parmetros
//----------------------------------------------------------------// Programa : TesteConstrutor.java //-----------------------------------------------------------------

23

JAVA

Cludio M. N. A. Pereira

//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade; // Construtor public Pessoa() { System.out.println("Objeto criado"); } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteConstrutor //----------------------------------------------------------------class TesteConstrutor { public static void main(String args[]) { // Criacao de objeto o construtor executado automaticamente Pessoa p = new Pessoa(); // Utilizao do objeto p p.dados(); p.print(); }

} OBS: Como outros mtodos, o construtor pode receber parmetros. Neste caso, os mesmos precisam ser passados no momento que o objeto instanciado (criado). Programa Exemplo 3.5: Construtor com parmetros
//----------------------------------------------------------------// Programa : TesteConstrutor.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade;

24

JAVA

Cludio M. N. A. Pereira

// Construtor public Pessoa(String n, long i) { dados(n, i); } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteConstrutor //----------------------------------------------------------------class TesteConstrutor { public static void main(String args[]) { // Criacao de objeto passando parmetros para o construtor Pessoa p = new Pessoa("Cludio", 1234); // Utilizao do objeto p p.print(); }

} Sobrecarga de construtor: Como os mtodos comuns, o construtor tambm pode ser sobrecarregado, ou seja uma classe pode ter quantos construtores forem necessrios. Observe o que aconteceria no Programa Exemplo 3.2b, se tentssemos criar um objeto sem passar os parmetros do construtor. Tente isto: Pessoa p = new Pessoa(); No compila, pois o construtor definido precisa de parmetros, ou seja no existe um construtor com lista de parmetros vazia. Se necessitssemos criar objetos, ora passando os parmetros, ora sem passar parmetros, poderamos criar um outro construtor, com a lista de pametros vazia, mantendo o anterior. Programa Exemplo 3.6: Sobrecarga de construtor
//----------------------------------------------------------------// Programa : TesteSobrecarga.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //-----------------------------------------------------------------

25

JAVA

Cludio M. N. A. Pereira

class Pessoa { // Atributos private String nome; private long identidade; // Construtor 1 public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 // no faz nada, mas permite a criao de objetos sem passagem de parmetros public Pessoa() { } // Poderia haver outros construtores // ... // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteSobrecarga //----------------------------------------------------------------class TesteSobrecarga { public static void main(String args[]) { // Criacao de objeto com construtor sem parmetros Pessoa p = new Pessoa(); p.dados("Cludio", 1234); p.print(); Pessoa p1 = new Pessoa(Claudio, 123); P1.print(); } }

Matrizes de Objetos
___________________________________________________________________________________ Para utilizarmos matrizes para objetos, precisamos, primeiramente alocar a matriz com as referncias para os objetos. Ex.: Pessoa pessoa[] = new Pessoa[3]; 26

JAVA

Cludio M. N. A. Pereira

Ainda no podemos utilizar os objetos, pois os mesmos ainda no esto alocados (instanciados). Precisamos ento aloc-los. Ex.: for (int i=0; i<3; i++) { pessoa[i] = new Pessoa(); }

Programa Exemplo 3.7: Matrizes de objetos


//----------------------------------------------------------------// Programa : MatrizObjetos.java //-----------------------------------------------------------------

public class MatrizObjetos { public static void main(String[] args) { // Cria uma matriz com as referncias para os objetos Pessoa pessoa[] = new Pessoa[3]; // Cada objeto precisa ser alocado. for (int i=0; i<3; i++) { pessoa[i] = new Pessoa(); } // Agora a matriz de objetos pode ser utilizada pessoa[0].dados("Cludio", 123); pessoa[1].dados("Jose", 321); pessoa[2].dados("Ana", 567); for (int i=0; i<3; i++) { pessoa[i].print(); } } }

A estrutura de controle For-Each (ou Enhanced For): Permite acessar cada elemento de uma matriz ou lista, do primeiro ao ltimo. Sintaxe: ... for (Pessoa p : pessoa) { p.print(); } ... OBS: L-se: Para toda Pessoa p na matriz ou lista pessoa, execute p.print.

27

JAVA

Cludio M. N. A. Pereira

Exerccio: Faa um programa para manipulao de uma lista de contatos telefnicos, com as seguintes caractersticas: a) Apresente um menu para o usurio de forma que ele possa realizar operaes abaixo repetidas vezes, at que deseje sair: - Inserir: armazenar um novo contato na lista, com os dados lidos via teclado; - Excluir: o usurio pode escolher entrar com a identidade ou com o nome para excluir o objeto da lista; - Editar: o usurio pode escolher entrar com a identidade ou com o nome para alterar dados do contato; - Consultar: o usurio pode escolher entrar com a identidade ou com o nome para ver os dados do contato na tela; - Listar todos: imprime todos os contatos armazenados. b) Crie uma classe Contato com nome, identidade e telefone e os mtodos que julgar necessrio. c) Crie uma classe ListaDePessoas que ter como atributo principal uma MATRIZ de objetos da classe pessoa e os mtodos para sua manipulao. d) Cuide dos encapsulamentos e explore a utilizao de construtores e sobrecarga de mtodos.

Mtodos e Atributos de Classe (static)


___________________________________________________________________________________ Mtodos e atributos de classe so independentes da existncia de objetos, podendo, portanto ser acessador diretamente a partir da prpria classe. So identificados pela declarao utilizando-se o especificador static (esttico). Se objetos forem criados, todos os objetos da classe compartilhem tais membros. OBS: Os atributos estticos so inicializados com valor zero ou nulo Um mtodo esttico s pode acessar atributos estticas. Programa Exemplo 3.8: Mtodos e atributos de classe
//----------------------------------------------------------------// Programa : TesteStatic.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe qualquer //----------------------------------------------------------------class CLS { private static int x; public static void incrementa( ) {x++; } public static void print() {System.out.println(x); } } //----------------------------------------------------------------// TesteStatic //----------------------------------------------------------------class TesteStatic { public static void main (String args[]) { // Chamada do mtodo atravs da classe CLS.incrementa(); CLS.print(); // Chamada do mtodo atravs de um objeto

28

JAVA

Cludio M. N. A. Pereira

CLS x1 = new CLS(); CLS x2 = new CLS(); x1.print(); x2.print(); // Usando incrementa atravs de x1, x2 tambm modificado x1.incrementa(); x1.print(); x2.print(); } }

Exerccio: Altere a classe Pessoa (qualquer uma dos exemplos anteriores) criando um mtodo e o que mais for necessrio para se saber quantos objetos da mesma j foram criados. Ex.: .... ... main(...) { Pessoa p1 = new ..... p1.ContaObjetos(); // diria que tem 1 objeto criado

Pessoa p2 = new ..... p2.ContaObjetos(); // diria que tem 2 objeto criado }

Herana
___________________________________________________________________________________ Herana o mecanismo atravs do qual se pode criar novas classes (classes derivadas) a partir de classes existentes (classes-base) herdando suas caractersticas. Dentre as grandes implicaes da herana, podemos destacar: a reutilizao de cdigo e o polimorfismo. Sintaxe: class nome_da_classe_derivada extends nome_da_classe_base { ... } Exemplo:
// Criao da classe Aluno que derivada da classe Pessoa (classe-base) class Aluno extends Pessoa { ... }

OBS: Em Java, no h herana mltipla, ou seja a classe derivada s pode ter uma classe-base. O exemplo a seguir ilustra o processo de herana. 29

JAVA

Cludio M. N. A. Pereira

Programa Exemplo 3.5: Herana


//----------------------------------------------------------------// Programa : TesteHeranca.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade; // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir notas public void printSituacaoAluno () { System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe TesteHeranca //----------------------------------------------------------------class TesteHeranca { public static void main(String args[]) { Media=" + media());

30

JAVA

Cludio M. N. A. Pereira

Aluno a = new Aluno(); a.dados(Claudio, 123); a.setNotas(9.0, 8.0); a.print(); // usa metodo da classe base a.printSituacaoAluno (); } }

Atributos protected na classe-base: Os atributos declarados como protected so visveis na classe derivada. No processo de herana, todos os membros declarados como protected e public so visveis (podem ser acessados) dentro classe derivada (o que for private NO pode fica visvel). Construtor da classe derivada: Quando um objeto criado, o construtor da classe base executado. Em seguida executado o construtor da prpria classe.
//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------import java.util.Scanner; public class Pessoa { protected String nome; protected long identidade; public Pessoa() { System.out.println("Construtor da classe Pessoa executado."); } public void dados (String nome, long identidade) { this.nome = nome; this.identidade = identidade; } public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------public class Aluno extends Pessoa {

31

JAVA

Cludio M. N. A. Pereira

private long matricula; private double a1, a2; public Aluno() { System.out.println("Construtor da classe Aluno executado."); } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir notas public void printSituacaoAluno () { System.out.println("Nome: " + nome); System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe TesteHeranca //----------------------------------------------------------------public class Teste { public static void main(String[] args) { Aluno a = new Aluno(); } }

Media=" + media());

O construtor da classe derivada pode acessar o construtor da classe base utilizando super, que refere-se superclasse (classe-base), de forma a passar seus atributos; Programa Exemplo 3.5c: Herana (construtor na classe derivada)
//----------------------------------------------------------------// Programa : TesteHeranca.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem visveis na classe derivada) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) {

32

JAVA

Cludio M. N. A. Pereira

dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir notas public void printSituacaoAluno () { System.out.println("Nome: " + nome);

// s pode pq nome protected Media=" + media());

System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } }

//----------------------------------------------------------------// Classe TesteHeranca //----------------------------------------------------------------class TesteHeranca { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0);

33

JAVA

Cludio M. N. A. Pereira

a.print(); // usa metodo da classe base a.printSituacaoAluno (); } }

Sobrescrevendo mtodos da classe-base: A classe Aluno poderia ter um mtodo print() idntico ao de sua classe-base. Neste caso, a chamada ao mtodo print() atravs de um objeto da classe Aluno invocaria o mtodo print() da classe aluno (e no mais o de sua classe-base). Programa Exemplo 3.6: Sobreescrita de mtodos da classe-base
//----------------------------------------------------------------// Programa : TesteHerancaSobrescritaMetodo.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2;

34

JAVA

Cludio M. N. A. Pereira

// Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { super.print(); // chama print da classe-base System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe TesteSobrescritaMetodo //----------------------------------------------------------------class TesteSobrescritaMetodo { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); a.print(); // metodo da classe Aluno } }

Media=" + media());

Exerccio: Escreva uma classe Funcionario, derivada da classe Pessoa acrescentando os atributos: - registro, - salarioBase, - cargo, - faltas. e os mtodos: - construtor: que receba nome, identidade, registro, salrioBase e cargo; - dados: para receber nome, identidade, registro, salrioBase e cargo; - dados: que leia do teclado nome, identidade, registro, salrioBase e cargo; - print: que imprima nome, identidade, registro, salrio e cargo. - setFaltas: para lanar as faltas do funcionarios - salarioLiquido: calcula e imprime (salarioBase - faltas*salarioBase/30) * 0.8

Polimorfismo na herana
___________________________________________________________________________________ 35

JAVA

Cludio M. N. A. Pereira

Polimorfismo a utilizao de uma mesma referncia (mesmo nome) podendo assumir vrios significados (ou formas). Quando criamos a classe Aluno como sendo uma extenso da classe Pessoa (atravs do processo de herana), podemos dizer que Aluno UMa Pessoa. Considere o objeto p da classe pessoa: Pessoa p; Note p uma referncia para uma Pessoa e por isso pode conter uma Pessoa. Bom, mas como Aluno UMa Pessoa, ento, p tambm pode conter um Aluno. Assim sendo, pode-se instanciar atravs de p, um objeto da classe Aluno: p = new Aluno(); E se houvessem outras classes derivadas de Pessoa, como por exemplo Funcionario, poderiamos fazer: p = new Funcionario(); Ou seja p pode assumir vrios significados (formas). Isso polimorfismo! O exemplo a seguir ilustra o polimorfismo atravs de herana. Programa Exemplo 3.7: Polimorfismo atravs de herana
//----------------------------------------------------------------// Programa : TestePolimorfismoHerana.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } }

36

JAVA

Cludio M. N. A. Pereira

//----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { super.print(); // chama print da classe-base System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //----------------------------------------------------------------// Classe TesteSobrescritaMetodo

Media=" + media());

37

JAVA

Cludio M. N. A. Pereira

//----------------------------------------------------------------class TestePolimorfismoHerana { public static void main(String args[]) { Pessoa p; Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); // p recebe um Aluno p = a; p.print(); // metodo da classe Aluno System.out.println(); // p recebe um Funcionario p = new Funcionario("Ana", "Gerente", 12345, 3000); p.print(); // metodo da classe Funcionario } }

Este tipo de polimorfismo muito utilizado para passagem de objetos como argumentos de mtodos, conforme ilustrado no exemplo a seguir, onde o mtodo imprimir da classe Relatrio possui
como parmetro uma Pessoa. Entretanto, na sua chamada (no main), ora recebe um Aluno ora recebe um Funcionrio.

Programa Exemplo 3.8: Polimorfismo atravs de herana (passagem de objetos por parmetros)
//----------------------------------------------------------------// Programa : TestePolimorfismoHeranaParametros.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); }

38

JAVA

Cludio M. N. A. Pereira

} //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { super.print(); // chama print da classe-base System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //-----------------------------------------------------------------

Media=" + media());

39

JAVA

Cludio M. N. A. Pereira

// Classe Relatorio //----------------------------------------------------------------class Relatorio { public void imprimir(Pessoa p) { p.print(); } } //----------------------------------------------------------------// Classe TestePolimorfismoHeranaParametros //----------------------------------------------------------------class TestePolimorfismoHeranaParametros { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000); Relatorio relatorio = new Relatorio(); System.out.println(); System.out.println("Relatorio de aluno:"); relatorio.imprimir(a); System.out.println(); System.out.println("Relatorio de funcionario:"); relatorio.imprimir(f); } }

Classes Abstratas
___________________________________________________________________________________ So classes atravs das quais NO se pode criar objetos. So feitas apenas para criao de classes derivadas das mesmas. Observando nosso exemplo anterior, podemos observar que no so utilizados objetos da classe Pessoa. Alm disso, nosso programa se utiliza de polimorfismo atravs de herana. Neste caso, a classe Pessoa uma forte candidata a ser uma classe abrtrata (evidentement, no contexto deste programa). Para que uma classe seja abstrata basta que se inclua o especificador abstract antes da palavra class, como se segue: Sintaxe: abstract class nome_da_classe { ... } Mtodos abstratos:

40

JAVA

Cludio M. N. A. Pereira

So mtodos onde apenas as assinaturas (prottipos) so definidos na classe-base, sendo obrigatria a implementao destes por parte de suas subclasses (classes derivadas). Com isso, possvel garantir que tal mtodo estar sempre disponvel nas subclasses. No exemplo anterior, observe-se que o mtodo imprimir da classe Relatrio chama o mtodo print. Assim sendo, para que qualquer objeto de uma subclasse de Pessoa possa ser passado para o mtodo imprimir, necessrio que o mesmo implemente o mtodo print. Sendo assim, o mesmo um forte candidato mtodo abstrato, pois assim, garantiramos que objetos de qualquer subclasse de Pessoa pudesse ser passado para o mtodo. Programa Exemplo 3.9: Classe Abstrata
//----------------------------------------------------------------// Programa : TesteClasseAbstrata.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------abstract class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo abstrato para impressao de dados public abstract void print (); } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { nome = n; identidade = id; matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; }

41

JAVA

Cludio M. N. A. Pereira

// Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //----------------------------------------------------------------// Classe Relatorio //----------------------------------------------------------------class Relatorio { public void imprimir(Pessoa p) { p.print(); } } //----------------------------------------------------------------// Classe TesteClasseAbstrata //----------------------------------------------------------------class TesteClasseAbstrata { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0);

Media=" + media());

42

JAVA

Cludio M. N. A. Pereira

Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000); Relatorio relatorio = new Relatorio(); System.out.println(); System.out.println("Relatorio de aluno:"); relatorio.imprimir(a); System.out.println(); System.out.println("Relatorio de funcionario:"); relatorio.imprimir(f); } }

Interfaces
___________________________________________________________________________________ uma forma de se definir comportamentos em comum a objetos de diferentes classes. Bom... Isso pode ser feito atravs de herana! De fato, pode sim! Entretanto, h situaes onde a herana no natural. Considere, por exemplo, se nosso negcio envolvesse, alm de Alunos e Funcionrios, uma classe Departamento, que necessitasse tambm ser impressa por um gerador de relatrios (ex. classe Relatorio). Se Departamento fosse derivada de Pessoa, o problema seria resolvido. Mas Departamento NO Pessoa! Para resolver este tipo de conflito, pode-se criar uma Interface, que defina o comportamento de objetos imprimveis (ou printable para ficar mais imponente). Vamos ento criar a interface Printable para resolver este problema. Criao de uma interface: Sintaxe: interface nome_da_interface { tipo metodo1(...); tipo metodo2(...); } A interface define um contrato que assinado pelas classes que forem utiliz-la. Estas (as classes) devem implementar os mtodos da interface. A interface contm apenas as assinaturas dos mtodos. Os mesmos devem possuir sua implementao nas classes que implementam a interface. Implementado mtodos de uma interface: Isso feito atravs da palavra reservada implements. Uma classe pode implementar vrias interfaces. Sintaxe: class nome_da_classe implements nome_da_interface { ... } Polimorfismo atravs da interface: 43

JAVA

Cludio M. N. A. Pereira

Agora que temos uma interface, o mtodo imprimir, da classe relatrio pode receber como parmetro, ao invs de uma Pessoa, um Printable. Programa Exemplo 3.11: Interface
//----------------------------------------------------------------// Programa : TesteInterface.java //----------------------------------------------------------------//----------------------------------------------------------------// Interface Printable //----------------------------------------------------------------interface Printable { // Metodo para impressao de dados public void print (); } //----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------abstract class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa implements Printable { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { nome = n; identidade = id; matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; }

44

JAVA

Cludio M. N. A. Pereira

// Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa implements Printable { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //----------------------------------------------------------------// Classe Departamento //----------------------------------------------------------------class Departamento implements Printable { // Atributos private String nome; private String chefe; private int numFuncionarios; // Construtor public Departamento (String n, String c, int f) { nome = n; chefe = c; numFuncionarios = f; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Chefe: " + chefe); System.out.println("Nmero de Funcionrios: " + numFuncionarios);

Media=" + media());

45

JAVA

Cludio M. N. A. Pereira

} } //----------------------------------------------------------------// Classe Relatorio //----------------------------------------------------------------class Relatorio { public void imprimir(Printable p) { p.print(); } } //----------------------------------------------------------------// Classe TesteInterface //----------------------------------------------------------------class TesteInterface { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000); Departamento d = new Departamento("Recursos Humanos", "Jose", 12); Relatorio relatorio = new Relatorio(); System.out.println(); System.out.println("Relatorio de aluno:"); relatorio.imprimir(a); System.out.println(); System.out.println("Relatorio de funcionario:"); relatorio.imprimir(f); System.out.println(); System.out.println("Relatorio de departamento:"); relatorio.imprimir(d); } }

Pacotes (Packages)
___________________________________________________________________________________ Pacotes so unidades de compilao independentes, que podem possuir um nome para referncia por parte de outras unidades de compilao. Sintaxe: package <nome do pacote>; <definio das classes do pacote> .... Programa Exemplo 3.12: Pacotes (criao) 46

JAVA

Cludio M. N. A. Pereira

//-------------------------------------------------------------------// Definio do pacote MeuPacote e suas classes (no caso apenas XPTO) //-------------------------------------------------------------------package meuPacote; public class Xpto { private int x; public void setX(int x) { this.x = x; // this.x refere-se ao atributo x do prprio objeto } public void Print() { System.out.println("x=" + x); } }

Programa Exemplo 3.13: Pacotes (utilizao)


//-------------------------------------------------------------------// Utilizao da clsse XPTO de MeuPacote //-------------------------------------------------------------------import meuPacote.Xpto; class TesteMeuPacote { public static void main(String a[]) { Xpto obj = new Xpto(); obj.setX(10); obj.Print(); } }

OBS: As classes, mtodos e atributos do pacote que precisam ser acessados a partir de outros pacotes devem ser pblicas As classes do pacote devem estar num diretrio contendo o nome do prprio pacote, que deve estar referenciado no CLASSPATH do sistema operacional, ou deve ser criado a partir do diretrio atual.

47

JAVA

Cludio M. N. A. Pereira

CAPTULO IV

GENERICS
Genrics um recurso lanado no J2SE 5.0 que fornece uma forma de generalizar mtodos e classes, permitindo que os mesmos possam trabalhar com parmetros genricos.

Mtodos Genricos
___________________________________________________________________________________ Mtodos genricos permitem especificar, em uma nica declarao de mtodo, um conjunto de mtodos relacionados. Programa Exemplo 4.1: Mtodos genricos (retirado de Deitel e Deitel, Java Como Programar)
//---------------------------------------------------------// GENERICS // // Exemplo 1 //---------------------------------------------------------public class GenericMethodTest { public static <E> void printArray (E inputArray[]) { for (E element : inputArray) System.out.print(" " + element); System.out.println(); } public static void main(String[] args) { Integer iArray[] = {1, 2, 3}; Double dArray[] = {1.1, 2.2, 3.3}; String sArray[] = {"aaa", "bbb", "ccc"}; printArray(iArray); printArray(dArray); printArray(sArray); } }

OBS: O parmetro genrico de tipo E (poderia ser utilizado outro nome como identificador), declarado antes do mtodo entre < > pode representar qualquer tipo. Onde este parmetro for utilizado dentro do mtodo, o tipo ser moldado em tempo de execuo.

48

JAVA

Cludio M. N. A. Pereira

Programa Exemplo 4.2: Restringindo o parmetro de tipo genrico para se efetuar a comparao entre objetos de tipos genricos. (retirado de Deitel e Deitel, Java Como Programar)
//---------------------------------------------------------// GENERICS // // Exemplo 2 - Comparando genricos //---------------------------------------------------------public class MaxTest { // // // // // // // // // O mtodo maior_v01 no funciona pois o operador ">" no est definido para QUALQUER tipo T public static <T> T maior_v01(T x, T y, T z) { T m = x; if(y > m) m = y; if(z > m) m = z; return m; }

// necessrio que se restrinja o tipo T a tipos que possam // ser COMPARVEIS // // // // Para se comparar objetos, pode-se utilizar o mtodo compareTo da interface genrica Comparable<T>, como a seguir Neste caso, restringimos o tipo T a tipos que implementem tal interface

public static < T extends Comparable<T> > T maior(T x, T y, T z) { T m = x; if(y.compareTo(m)>0) m = y; if(z.compareTo(m)>0) m = z; return m; } public static void main(String[] args) { int m = maior(12, 30, 10); System.out.println("Maior = " + m); String s = maior("ccc", "aaa", "bbb"); System.out.println("Maior = " + s); } }

Programa Exemplo 4.3: Sobrecarga de mtodos genrico. (retirado de Deitel e Deitel, Java Como Programar)
//---------------------------------------------------------// GENERICS // // Exemplo 3 - Sobrecarga de mtodos genricos //---------------------------------------------------------public class SobrecargaGenerics { public static < T extends Comparable<T> > T maior(T x, T y, T z) {

49

JAVA

Cludio M. N. A. Pereira

T m = x; if(y.compareTo(m)>0) m = y; if(z.compareTo(m)>0) m = z; return m; } // Sobrecarga com outro mtodo genrico com nmero // diferente de parmetros public static < T extends Comparable<T> > T maior(T x, T y) { T m = x; if(y.compareTo(m)>0) m = y; return m; } // Sobrecarga com outro mtodo NO-genrico com mesmo // nmero de parmetros public static int maior(int x, int y) { int m = x; if(y>m) m = y; return m; } public static void main(String[] args) { int m = maior(12, 30, 10); System.out.println("Maior = " + m); String s = maior("ccc", "aaa", "bbb"); System.out.println("Maior = " + s); } }

OBS: Se houver mtodo especfico que atenda uma chamada, o mesmo tem prioridade sobre o genrico.

Classes Genricas
___________________________________________________________________________________ Classes genricas permitem especificar, em uma nica declarao de classe, um conjunto de classes relacionadas. Programa Exemplo 4.4: Classes genricas.
//---------------------------------------------------------// GENERICS // // Exemplo 4 - Classes genricas //---------------------------------------------------------class Pilha <E> { private final int maxElementos = 10; private int topo; private E[] elemento; public Pilha() { topo = -1;

50

JAVA

Cludio M. N. A. Pereira

elemento = (E[]) new Object[maxElementos]; } public void empilhar(E valor) { if(topo == maxElementos-1) System.out.println("Pilha cheia!"); else elemento[++topo] = valor; } public E desempilhar() { if(topo == -1) { System.out.println("Pilha vazia!"); return null; } else return elemento[topo--]; } } //---------------------------------------------------------public class GenericClass { public static void main(String[] args) { // Pilha de Integer Pilha<Integer> pI = new Pilha<Integer>(); pI.empilhar(10); pI.empilhar(20); System.out.println("Pilha de Integer"); System.out.println("Desempilhado = " + pI.desempilhar()); System.out.println("Desempilhado = " + pI.desempilhar()); System.out.println(); // Pilha de String Pilha<String> pS = new Pilha<String>(); System.out.println("Pilha de String"); pS.empilhar("aaaa"); pS.empilhar("bbbb"); System.out.println("Desempilhado = " + pS.desempilhar()); System.out.println("Desempilhado = " + pS.desempilhar()); System.out.println(); // Pilha mista Pilha p = new Pilha(); p.empilhar(30); p.empilhar("cccc"); System.out.println("Pilha mista"); System.out.println("Desempilhado = " + p.desempilhar()); System.out.println("Desempilhado = " + p.desempilhar()); } }

A Classe Genrica ArrayList


___________________________________________________________________________________ Uma lista uma coleo de dados ordenada que permite dados duplicados. Existe uma interface chamada List implementada por vrias classes, como ArrayList, LinkedList e Vector, sendo ArrayList, 51

JAVA

Cludio M. N. A. Pereira

uma das mais utilizadas. A classe ArrayList utiliza um array como estrutura de dados para armazenamento. Entretando, o mesmo fica encapsulado e vrios mtodos para manipulao so implementados. Alguns mtodos de ArrayList: add(elemento) adiciona um elemento no fim da lista; add(i, elemento) adiciona um elemento na posio i; contains(objeto) retorna true se a lista contm o objeto; get(i) retorna o elemento na posio i; set(elemento, i) atribui elemento ao elemento de ndice i; size() retorna o nmero de elementos da lista; remove(i) remove elemento de ndice i; remove(objeto_x) remove a primeira ocorrncia de objeto_x; (ver outros mtodos na documentao da API, em java.sun.com) Por ser uma classe genrica, a ArrayList pode armazenar objetos, independentemente de sua classe, por exemplo uma String, um objeto da classe Pessoa, etc. Ex: ArrayList lista = new ArrayList(); lista.add(Maria); lista.add(new Pessoa(Claudio, 1234)); ou, se for o caso, o tipo a ser utilizado pode ser indicado entre < >, ou seja: ArrayList<Pessoa> lista = new ArrayList<Pessoa>(); Agora, lista s pode conter objetos da classe Pessoa. Percorrendo a lista com o Enhanced For (foreach): Ex: for (Pessoa p: lista) { p.print(); } Programa Exemplo 4.1: Array List
//----------------------------------------------------------------// Programa : TesteList.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------public class Pessoa { // Atributos protected (para serem herdados) private String nome;

52

JAVA

Cludio M. N. A. Pereira

private long identidade; // Getters e Setters public String getNome() {return nome; } public long getIdentidade() {return identidade; } public void setNome(String n) {nome = n; } public void setIdentidade(long id) {identidade = id; } // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } }

//----------------------------------------------------------------// classe TesteList //----------------------------------------------------------------import java.util.ArrayList; public class TesteList { public static void main(String args[]) { ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); pessoas.add(new pessoas.add(new pessoas.add(new pessoas.add(new Pessoa("Ana", 111)); Pessoa("Cludio", 222)); Pessoa("Jos", 333)); Pessoa("Gabriel", 444));

for (Pessoa p : pessoas) { p.print(); } } }

53

JAVA

Cludio M. N. A. Pereira

CAPTULO V

Banco de Dados
Java Database Conectivity: JDBC
___________________________________________________________________________________ O Java Database Connectivity (JDBC) uma interface para bancos de dados SQL, que comunica-se com o driver do BD, como na Figura 3. A vantagem de se utilizar JDBC ao invs de acessar diretamente o driver o fato de desacoplar a aplicao do BD. Assim, se o BD for trocado, basta que se substitua o driver. A aplicao permanece inalterada.

Aplicao Cliente

JDBC (java.sql)

Driver (do Fabricante)

BD

Figura V.1 Conexo com BD via JDBC

Conectando ao BD
___________________________________________________________________________________ URL de BD: A origem dos dados deve ser informada em forma de URL da forma: Exemplo: "jdbc:mysql://localhost/nome_BD"; Criando a Conexo: 54

JAVA

Cludio M. N. A. Pereira

A conexo feita atravs de um objeto da classe Connection. Exemplo: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/teste", user, pass); Carregando o driver: O driver do BD precisa ser carregado e isso feito da seguinte forma: Class.forName("com.mysql.jdbc.Driver"); Fbrica de Conexes: A Fbrica de Conexes (ou ConnectionFactory) um padro de projeto (desing pattern) bastante utilizado quando necessita-se construir objetos complexos. Assim, essa tarefa fica independente e no precisa ser executada pelo construtor. Ex: public class ConnectionFactory { public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost/teste","root",""); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } } } ... em algum lugar de seu programa: Connection con = ConnectionFactory.getConnection(); OBS: Nota-se no cdigo acima o tratamento de excees com os comandos throws e try-catch. Em Javas, este procedimento obrigatrio em vrias situaes onde alguma exceo pode ser reconhecida. No caso da conexo com BD, uma SQLException deve ser tratada, enquanto ao tentar carregar o driver, deve-se tratar ClassNotFoundException. Entretanto no entraremos em detalhes sobre tratamento de excees nesta seo.

55

JAVA

Cludio M. N. A. Pereira

Programa Exemplo 5.1: Conectando ao BD i) Crie um banco chamado teste no MySQL:


mysql> create database teste;

ii)

Copie o arquivo do driver (mysql-connector) para o seu workspace (basta copiar e colar no diretrio do workspace. Adicione ao classpath:
Clique de direita: Build Path -> Add to Build Path

iii)

iv)

Crie a classe ConnectionFactory:

//----------------------------------------------------------------// Classe ConnectionFactory //----------------------------------------------------------------import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionFactory { public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("Conectando ao banco"); return DriverManager.getConnection("jdbc:mysql://localhost/teste", "root",""); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } } }

v)

Crie a classe TestaConexao:

//----------------------------------------------------------------// Classe TestaConexao //----------------------------------------------------------------import java.sql.Connection; import java.sql.SQLException; public class TestaConexao { public static void main(String[] args) throws SQLException { Connection connection = ConnectionFactory.getConnection(); connection.close(); } }

56

JAVA

Cludio M. N. A. Pereira

Executando sentenas SQL


___________________________________________________________________________________ Uma vez conectado ao BD, pode-se, ento falar SQL com ele. Isso feito atravs da execuo de sentenas SQL. Para tal, utilaremos a classe PreparedStatement e seus mtodos execute() e executeQuery(). Inserindo no BD: Ex: // Criando a String da sentena String sql = "insert into pessoas (nome,identidade) values (?,?)"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Preenchendo os valores (onde esto as interrogaes) stmt.setString(1, "Ana"); stmt.setLong(2, 444); // Executando sentena stmt.execute(); Programa Exemplo 5.2: Adicionando no BD i) No MySQL server, crie uma tabela chamada pessoas:
mysql> use teste; mysql> create table pessoas ( nome varchar(255), identidade bigint);

ii)

Crie a classe TesteAdiciona:

//----------------------------------------------------------------// Classe TesteAdiciona //----------------------------------------------------------------public class TesteAdiciona { public static void main(String[] args) throws SQLException { // Conectando Connection con = ConnectionFactory.getConnection(); // Cria sentena preparada SQL String sql = "insert into pessoas (nome,identidade) values (?,?)"; PreparedStatement stmt = con.prepareStatement(sql); // Preenche os valores stmt.setString(1, "Claudio"); stmt.setLong(2, 111);

57

JAVA

Cludio M. N. A. Pereira

// Executa sentena stmt.execute(); // Fecha sentena stmt.close(); System.out.println("Gravado!"); // Fecha conexo con.close(); } }

iii)

Verifique no MYSQL server se o registro foi criado.


mysql> select * from pessoas;

Deletando do BD: Ex: // Criando a String da sentena String sql = "delete from pessoas where identidade=?"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Preenchendo os valores (onde esto as interrogaes) stmt.setLong(1, 111); // Executando sentena stmt.execute(); Atualizando o BD: Ex: // Criando a String da sentena String sql = "update pessoas set nome=?, identidade=? where identidade=?"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Preenchendo os valores (onde esto as interrogaes) stmt.setString(1, "Ana"); stmt.setLong(2, 444); // Executando sentena stmt.execute(); Pesquisando no BD: A pesquisa do BD feita atravs do mtodo executeQuery(), que retorna um objeto da classe ResultSet, de onde poderemos extrair o contedo consultado. 58

JAVA

Cludio M. N. A. Pereira

// Criando a String da sentena String sql = "select * from pessoas"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Executa o select ResultSet rs = stmt.executeQuery(); // Varre o ResultSet while (rs.next()) { System.out.println(rs.getString("nome") + " " + rs.getLong("identidade")); } stmt.close(); con.close(); Exerccio 5.1: Implemente um programa onde se possa: inserir, deletar, atualizar e pesquisar Pessoas em um BD. Leia os dados necessrios via teclado.

Data Access Object: DAO


___________________________________________________________________________________ Conforme percebido no exerccio enterior, no mundo OO, costumeiramente desejamos gravar objetos (mais precisamente, seus atributos) em BD. Na realidade, isto ocorre por que queremos que o mesmo mantenha seu status (ou persista), mesmo aps o computador ser desligado. A persistncia dos objetos, portanto, depende das conexoes e excues de sentenas SQL. Entretanto, ter SQL dentro (misturado) na lgica de seu negcio OO pode tornar o cdigo pouco legvel e de difcil manuteno/alterao. , portanto, desejvel separar seu mundo OO do SQL. Que tal se pudssemos fazer coisas do tipo: Pessoa p = new Pessoa(Claudio, 123); ... bd.adiciona(p); e o objeto p fosse gravado no BD. Neste caso, o objeto bd seria um objeto cuja funo simplesmente o acesso a dados. Um objeto com esta funcionalidade o que chamamos de DataAcces Objec (DAO). Para o cdigo acima funcionar, precisariamos encapsular toda a funcionalidade de acesso ao BD que necessitssemos dentro de uma classe, como no exemplo a seguir. Programa Exemplo 5.3: Criando e utilizando um DAO para o objeto pessoa i) ii) Crie todos os getters e setters na classe pessoa. Crie a classe PessoaDAO:

import java.sql.Connection;

59

JAVA

Cludio M. N. A. Pereira

import import import import import

java.sql.PreparedStatement; java.sql.ResultSet; java.sql.SQLException; java.util.ArrayList; java.util.List;

public class PessoaDAO { private Connection connection; // Coneco public PessoaDAO() throws SQLException { this.connection = ConnectionFactory.getConnection(); } // Adiciona public void adiciona(Pessoa pessoa) throws SQLException { String sql = "insert into pessoas (nome,identidade) values (?,?)"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1,pessoa.getNome()); stmt.setLong(2,pessoa.getIdentidade()); stmt.execute(); stmt.close(); } // Listando os dados do BD public List<Pessoa> getLista() throws SQLException { PreparedStatement stmt = connection.prepareStatement("select * from pessoas"); ResultSet rs = stmt.executeQuery(); List<Pessoa> pessoas = new ArrayList<Pessoa>(); while (rs.next()) { Pessoa pessoa = new Pessoa(); pessoa.setNome(rs.getString("nome")); pessoa.setIdentidade(rs.getLong("identidade")); pessoas.add(pessoa); } rs.close(); stmt.close(); return pessoas; } }

iii)

Crie a classe TestaListagem:

import java.sql.SQLException; import java.util.List; public class TestaListagem {

60

JAVA

Cludio M. N. A. Pereira

public static void main(String[] args) throws SQLException { PessoaDAO dao = new PessoaDAO(); Pessoa p = new Pessoa(Joo, 345); dao.adiciona(p); List<Pessoa> pessoas = dao.getLista(); for (Pessoa pessoa : pessoas) { System.out.println("Nome: " + pessoa.getNome()); System.out.println("Identidade: " + pessoa.getIdentidade()); System.out.println(); } } }

61

JAVA

Cludio M. N. A. Pereira

CAPTULO VI

Java Enterprise Edition


Introduo
___________________________________________________________________________________ Java EE (Java Entreprise Edition) uma srie de especificaes que norteiam o desenvolvimento de software para executar determinado servio. Dentre as principais APIs compreendidas no Java EE podemos citar: JavaServer Pages (JSP), Java Servlets, Java Server Faces (JSF) Enterprise Javabeans Components (EJB) Java Persistence Api (objetos distribudos, clusters, acesso remoto a objetos etc) Java API for XML Web Services (JAX-WS), Java API for XML Binding (JAX-B)

entre muitas outras. Dentre as implementaes compatveis com a especificao Java EE podemos citar: RedHat/Jboss, JBoss Application Server, gratuito, Java EE 5; Sun, GlassFish, gratuito, Java EE 5. Apache, Apache Geronimo, gratuito, Java EE 5; Oracle/BEA, WebLogic Application Server, Java EE 5; IBM, IBM Websphere Application Server, Java EE 5; Sun, Sun Java System Application Server (baseado no GlassFish), pago, Java EE 5;

Servlet Container
___________________________________________________________________________________ Um servlet container um servidor suporta apenas uma parte do Java EE (e no o Java EE completo). Um servlet container suporta: JSP Servlets JSTL JSF

O servlet container que usaremos aqui o Apache Tomcat (http://tomcat.apache.org). 62

JAVA

Cludio M. N. A. Pereira

Configurando o Tomcat no Eclipse: Para configurar o Tomcat no Eclipse, execute os passos a seguir: Baixe o Tomcat em http://tomcat.apache.org Instale-o (no Windows deve-se executal o instalador. No Linux, descompactar os arquivos) Abra a aba View Servers (perspectiva Java): ctrl + 3 digite servers clique em Show View Na aba Servers insira o Tomcat: clique direito -> New -> Server selecione o Tomcat desejado clique Next indique o diretrio (pasta) de instalao do Tomcat clique em Finish Inicie o Tomcat clique em Start

Criando um Projeto Web


___________________________________________________________________________________ Para criar um projeto Web, execute os passos a seguir: New -> Project Escolha Dynamic Web Project e clique Next D nome ao projeto e clique Finish Clique no Tomcat (na aba Servers) e adicione o projeto: - clique direito no Tomcat -> Add and remove projects Selecione o projeto e adicione

Aps este procedimento, as seguinets pastas estaro disponveis: src para conter o cdigo fonte Java (.java) build - onde os programas so compilados (.class) WebContent contm o contedo Web (pginas, imagens, css etc) WebContent/WEB-INF - pasta oculta contendo configuraes e recursos do projeto WebContent/WEB-INF/lib contendo as bibliotecas (.jar) WebContent/WEB-INF/classes contendo cpia dos arquivos compilados

Java Server Pages: JSP


___________________________________________________________________________________ Java Server Pages (JSP) so pginas html com cdigo Java embutido. O cdigo Java escrito entre os smbolos <% e %>. O cdigo Java na pgina JSP chamado scriptlet.

Programa Exemplo 6.1: O primeiro JSP: hello.jsp 63

JAVA

Cludio M. N. A. Pereira

Edite o programa JSP a seguir e salve-o como hello.jsp em WebContent


<html> <%-- comentrio em jsp aqui: nossa primeira pgina jsp --%> <% String mensagem = "Hello WWW"; %> Imprimindo com out.println:<br> <% out.println(mensagem); %><br> Imprimindo com =:<br> <%= mensagem %><br> <% System.out.println("Tudo foi executado!"); %> </html>

Para executar o jsp, basta cham-lo em um browser da seguinte forma: http://localhost:8080/nomeDoProjeto/hello.jsp Um pouquinho do arquivo web.xml): O arquivo web.xml define diversas configuraes referentes ao projeto. Dentre elas, os arquivos de entrada da pgina, que so especificados entre as tags <welcome-file> e </welcome-file>, como exemplo a seguir. Programa Exemplo 6.2: Colocando o hello.jsp como pgina de entrada do projeto
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>jspteste</display-name> <welcome-file-list> <welcome-file>hello.jsp</welcome-file> </welcome-file-list> </web-app>

64

JAVA

Cludio M. N. A. Pereira

Desta forma, para executar o jsp, basta digitar o nome do projeto da seguinte forma:

http://localhost:8080/nomeDoProjeto Programa Exemplo 6.3: Acessando o BD com scriptles em um JSP.


i) Crie um projeto Web: File->New->Project->Web->Dynamic Web Project

ii) Inserir Tomcat - Na aba Servers: Clique direito->New->Server (localizar Tomcat). iii) Associar projeto ao servidor: - Clique direito -> Add remove -> (clique no do projeto) iv) Criar pacote dao em src v) Copiar arquivos para src: Pessoa.java, PessoaDAO.java e Connectionfactory.java vi) Copiar conector JDBC para WEB-INF/lib vii) Criar o JSP (em WebContent): <%@ page import="java.util.*, dao.*" %> <html> <ul> <% PessoaDAO dao = new PessoaDAO(); List<Pessoa> pessoas = dao.getLista(); for (Pessoa pessoa : pessoas ) { %> <li><%=pessoa.getNome()%>, <%=pessoa.getIdentidade()%></li> <% } %> </ul> </html>

Programa Exemplo 6.4: Adicionando um registro no BD com scriptles em um JSP.


No projeto anterior: i) Escreva um JSP tela_adiciona.jsp): <html> com um form para submeter uma requisio (salve como

65

JAVA

Cludio M. N. A. Pereira

<body> Adiciona: <form action="adiciona.jsp"> Nome: <input name="nome"/><br/> Identidade: <input name="identidade"/><br/> <input type="submit" value="Adicionar"/> </form> </body> </html> OBS: Esse JSP envia uma requisio (request) para adiciona.jsp

ii) Escreva um JSP com um form para receber e tratar a requisio (salve como
adiciona.jsp): <%@ page import="java.util.*, dao.*" %> <html> <% PessoaDAO dao = new PessoaDAO(); Pessoa p = new Pessoa(); p.setNome(request.getParameter("nome")); p.setIdentidade(Long.parseLong(request.getParameter("identidade"))); dao.adiciona(p); %> Registro adicionado. </html> OBS: Atravs do objeto request, que contm informaes sobre a requisio feita por um cliente, e que est disponvel em pginas JSP, pode-se acessar os parmetros enviados para a pgina. iii) Acesse tela_adiciona.jsp no browser, ou: - Clique direito - Run as -> Run on server

Servlets
___________________________________________________________________________________ Um servlet um pequeno servidor que recebe chamadas (request) de diversos clientes, processa e envia uma resposta (response) que pode ser um html ou uma imagem. Aqui neste curso abordaremos servlets que utilizam protocolo HTTP. Seu comportamento est definido na classe HttpServlet, do pacote javax.servlet. Portanto, a definio de uma servlet http deve ser feita derivando-se da classe HttpServlet. Atravs do mtodo service, a servlet recebe a requisio (request) e pode preencher a resposta (response) que ser enviada ao cliente. O mtodo service possui a seguinte assinatura: 66

JAVA

Cludio M. N. A. Pereira

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... }

Mapeando uma servlet no Web.xml: no arquivo Web.xml que se mapeia uma URL para um servlet. Isso feito como se segue:
<servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>servlet.Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/oi</url-pattern> </servlet-mapping>

OBS: A tag <servlet> identifica o servlet, enquanto a tag <servlet-mapping> mapeia uma URL para o mesmo. Desta forma, ao se acessar:
http://localhost:8080/jspteste/oi

a servlet acionada. Programa Exemplo 6.5: Servlet Hello.


Dentro do seu projeto Web (pode ser o mesmo utilizado nos exemplos anteriores): i) Crie a classe Hello.java no pacote servlet (dentro de src) e estenda a classe HttpServlet, conforme exemplo abaixo: //----------------------------------------------------------------------// Classe Hello //----------------------------------------------------------------------package servlet; import java.io.IOException; import java.io.PrintWriter; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter();

67

JAVA

Cludio M. N. A. Pereira

out.println("<html>"); out.println("Hello Servlet!"); out.println("</html>"); } } OBS: 1) O objeto out, da classe PrinterWriter recebe uma instncia do writer de response, que permite escrever em response. A partir da, pode-se escreve o cdigo html. 2) Lembre-se! Os imports podem ser facilitados utilizando-se ctrl+shift+o! 3) Escreva apenas service e use CTRL+espao para ajuda na escrita do mtodo service. ii) Abra o Web.xml e mapeie a servlet <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>servlet.Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/oi</url-pattern> </servlet-mapping> iii) Reinicie o Tomcat

iv) Acesse: http://localhost:8080/jspteste/oi

Programa Exemplo 6.6: Adicionando Pessoas no BD.


Dentro do seu projeto Web (pode ser o mesmo utilizado nos exemplos anteriores): i) Crie a classe AdicionaServlet.java no pacote servlet estenda a classe HttpServlet, conforme exemplo abaixo: (dentro de src) e

//----------------------------------------------------------------------// Classe AdicionaServlet //----------------------------------------------------------------------package servlet; // Use CTRL+SHIFT+o para obter os imports! // ... public class AdicionaServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Pessoa p = new Pessoa(); p.setNome(request.getParameter("nome"));

68

JAVA

Cludio M. N. A. Pereira

p.setIdentidade( Long.parseLong(request.getParameter("identidade"))); try { PessoaDAO dao = new PessoaDAO(); dao.adiciona(p); } catch (SQLException e) {} PrintWriter writer = response.getWriter(); writer.println("<html>"); writer.println("Contato adicionado."); writer.println("</html>"); } } OBS: Da mesma forma que no JSP do exemplo 6.4, o objeto request passado para a servlet contm os parmetros enviados, que podem ser acessados atravs do mtodo getParameter. ii) Mapeie a classe AdicionaServlet no Web.xml. <servlet> <servlet-name>adicionaServlet</servlet-name> <servlet-class>servlet.AdicionaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>adicionaServlet</servlet-name> <url-pattern>/adiciona</url-pattern> </servlet-mapping> iii) Escreva um JSP com tela_adiciona_2.jsp): <html> <body> Adiciona: <form action="adiciona"> Nome: <input name="nome"/><br/> Identidade: <input name="identidade"/><br/> <input type="submit" value="Adicionar"/> </form> </body> </html> OBS: Esse JSP envia uma requisio (request) para adiciona (que a URL mapeada para a AdicionaServlet. iv) Acesse tela_adiciona.jsp no browser, ou: Clique direito Run as -> Run on server um form para submeter uma requisio (salve como

69