Escolar Documentos
Profissional Documentos
Cultura Documentos
JAVA
Sumri
CONCEITOS INTRODUTRIOS...........................................................................................................................2
INTRODUO.............................................................................................................................................................2
ALGUMAS CARACTERSTICAS DA LINGUAGEM JAVA................................................................................................2
INDEPENDENCIA DE PLATAFORMA............................................................................................................................3
PLATAFORMAS DE DESENVOLVIMENTO JAVA............................................................................................................4
PARA COMEAR: O CLSSICO HELLOWORLD!......................................................................................................5
ESTRUTURA BSICA DA LINGUAGEM.............................................................................................................6
TIPOS DE DADOS.......................................................................................................................................................6
DECLARAES DE VARIVEIS E CONSTANTES.........................................................................................................6
OPERADORES BSICOS.............................................................................................................................................7
ESTRUTURAS DE CONTROLE DE FLUXO....................................................................................................................7
FUNES.................................................................................................................................................................10
ARRAYS (ARRANJOS)...............................................................................................................................................11
MANIPULAO DE CADEIAS DE CARACTERES (STRINGS).......................................................................................13
CLASSES NUMRICAS.............................................................................................................................................14
ENTRADA E SADA PADRO (TECLADO E MONITOR)..............................................................................................15
ORIENTAO OBJETOS EM JAVA................................................................................................................16
CONCEITOS BSICOS...............................................................................................................................................16
MTODOS E ATRIBUTOS DE CLASSE (STATIC).....................................................................................................25
ARRAY DE OBJETOS................................................................................................................................................26
HERANA................................................................................................................................................................27
POLIMORFISMO NA HERANA.................................................................................................................................41
CLASSES ABSTRATAS..............................................................................................................................................46
INTERFACES.............................................................................................................................................................49
PACOTES (PACKAGES)............................................................................................................................................57
GENERICS................................................................................................................................................................59
MTODOS GENRICOS............................................................................................................................................59
CLASSES GENRICAS..............................................................................................................................................61
MANIPULAO DE LISTAS................................................................................................................................64
ARRAYLIST.............................................................................................................................................................64
BANCO DE DADOS.................................................................................................................................................67
JAVA DATABASE CONECTIVITY: JDBC...................................................................................................................67
CONECTANDO AO BD.............................................................................................................................................67
EXECUTANDO SENTENAS SQL..............................................................................................................................70
DATA ACCESS OBJECT: DAO..................................................................................................................................72
JAVA ENTERPRISE EDITION..............................................................................................................................75
INTRODUO...........................................................................................................................................................75
SERVLET CONTAINER..............................................................................................................................................75
CRIANDO UM PROJETO WEB...................................................................................................................................76
JAVA SERVER PAGES: JSP.......................................................................................................................................76
SERVLETS................................................................................................................................................................79
JAVA
CAPTULO 1
CONCEITOS INTRODUTRIOS
Introduo
___________________________________________________________________________________
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 aos 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 e sua aplicao do lado do
servidor Web.
JAVA
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 qualquer mquina. 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++).
Cdigo
Fonte
Java
Bytecode
Java
(a)
Cdigo
Compilador
(PC/Windows)
Executvel
(PC/Windows)
Compilador (Sun/Solaris)
Executvel (Sun/Solaris)
Compilador
(PC/LINUX)
Executvel (PC/LINUX)
Fonte
(b)
Figura 1 - Programas gerados em (a) Java, (b) Compiladores Convencionais (cdigo nativo)
JAVA
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).
JAVA
JAVA
CAPTULO II
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.
Declarao de constantes:
O modificador final utilizado para declarao de constantes, seguindo a seguinte sintaxe:
6
JAVA
Sintaxe:
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
Descrio
maior
Maior ou igual
menor
Menor ou igual
igual
Diferente
e
ou
Negao
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;
JAVA
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:
JAVA
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++;
}
Exemplo:
int i;
do {
JAVA
System.out.println("i=" + i);
i++;
} while ( i<10);
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 arrays 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.
Exemplo:
public class passagemPorValor {
public static int dobra(int num){
return num*2;
}
public static void main(String[] args){
int numero=2112;
10
JAVA
Arrays (arranjos)
___________________________________________________________________________________
Arrays (ou arranjos) so estruturas de dados homogneas, ou seja, que permitem armazenar uma lista
de itens de um mesmo tipo. Em Java, as arrays 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_array[];
ou
tipo[] nome_da_array;
Dimensionamento e alocao:
tipo nome_da_array[] = new tipo [dimenso];
ou
tipo[] nome_da_array = new tipo [dimenso];
Exemplo:
int matInt [] = new int [10];
import java.util.Scanner;
public class forParaArray {
public static void main(String[] args){
int[] numero = new int[5];
int soma=0;
Scanner entrada = new Scanner(System.in);
for(int cont=0 ; cont< numero.length ; cont++){
System.out.print("Entre com o nmero "+(cont+1)+": ");
numero[cont]=entrada.nextInt();
}
//exibindo e somando
for(int cont : numero){
soma += cont;
}
}
11
JAVA
A propriedade length:
A propriedade length retorna o nmero elementos do array (qual o tamanho do array).
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.
Exemplo:
import java.util.Scanner;
public class matrizTeste {
public static void main(String[] args){
int[][] matriz = new int[3][3];
Scanner entrada = new Scanner(System.in);
System.out.println("Matriz M[3][3]\n");
for(int linha=0 ; linha < 3 ; linha++){
for(int coluna = 0; coluna < 3 ; coluna ++){
System.out.printf("Insira o elemento M[%d][%d]: ",linha+1,coluna+1);
matriz[linha][coluna]=entrada.nextInt();
}
}
System.out.println("\nA Matriz ficou: \n");
for(int linha=0 ; linha < 3 ; linha++){
for(int coluna = 0; coluna < 3 ; coluna ++){
System.out.printf("\t %d \t",matriz[linha][coluna]);
}
System.out.println();
}
}
}
12
JAVA
A classe "StringBuffer":
uma classe que manipula strings variveis, e possui mtodos para sua manipulao, tais como:
-
13
JAVA
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.
A classe Integer:
A classe Integer possui vrios mtodos que permitem a manipulao de nmeros inteiros, dentre os
quais pode-se destacar:
-
Exemplo:
String Str;
Str = Integer.toString(456); // Str receber a string 456
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:
-
Exemplo:
String Str;
Str = Double.toString(125.47); // Str receber a string 125.47
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.
14
JAVA
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
JAVA
CAPTULO III
Conceitos bsicos
___________________________________________________________________________________
Objeto:
uma entidade que encapsula dados (que caracterizamm o objeto) e funes (que definem seu
comportamento).
O objeto a instncia concreta, que interage no mundo Orientado a Objetos
(OO).
No mundo OO no mais existem dados ou funes soltos, ou seja, sem estarem relacionados a
um determinado objeto.
Classe:
uma abstrao que caracteriza um conjunto de objetos. Todo o cdigo na POO escrito dentro de
classes.
Criao de Objetos:
Os objetos so criados atravs de uma instncia de uma classe. De certa forma, pode-se entender a
classe como sendo um tipo (que alm de campos de dados possui funes), 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.
Sintaxe de criao de uma classe Java:
16
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
tipo atributo_1;
...
tipo atributo_N;
// Mtodos
tipo metodo_1 () {...}
...
tipo metodo_N () {...}
}
Exemplo:
class MinhaClasse {
int MeuAtributo;
int MeuMetodo() {
...
}
}
17
JAVA
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:
MinhaClasse MeuObjeto = new MinhaClasse();
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:
Obj1.Metodo1();
//-----------------------------------------------------------------
18
JAVA
// Classe TesteClasses
//----------------------------------------------------------------public class TesteClasses {
public static void main(String args[]) {
// Criacao de objeto
Pessoa p = new Pessoa();
// Utilizao do objeto p
p.dados("Jorge", 1234);
p.print();
}
Exerccio: Altere o exemplo anterior de forma que o nome e a identidade sejam lidos via teclado.
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.2a: Construtore sem parmetros
//----------------------------------------------------------------// Programa : TesteConstrutor.java
//----------------------------------------------------------------//----------------------------------------------------------------// 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;
}
19
JAVA
// 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.2b: Construtor com parmetros
//----------------------------------------------------------------// Programa : TesteConstrutor.java
//----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa
//----------------------------------------------------------------class Pessoa {
// Atributos
private String nome;
private long identidade;
// 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;
}
20
JAVA
// Utilizao do objeto p
p.print();
}
Sobrecarga de mtodos:
o mecanismo atravs do qual se pode criar mais de 1 mtodo (incluindo o construtor) com o mesmo
nome. As listas de parmetros, no entanto precisa ser diferente.
Programa Exemplo 3.3a: 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
21
JAVA
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.3b: Sobrecarga de construtor
//----------------------------------------------------------------// Programa : TesteSobrecarga.java
//----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa
//----------------------------------------------------------------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;
}
22
JAVA
Atribuio de objetos:
A atribuio de objetos direta, utilizando-se o operasdor =. Esta operao 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
23
JAVA
public Pessoa() { }
// Metodo para passagem de dados
public void dados (String n, long id) {
nome = n;
identidade = id;
}
JAVA
25
JAVA
Array de Objetos
___________________________________________________________________________________
Para utilizarmos arrays para objetos, precisamos, primeiramente alocar o array com as referncias para
os objetos.
Ex.:
Pessoa pessoa[ ] = new Pessoa[3];
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.4b: Array de objetos
//----------------------------------------------------------------// Programa : ArrayObjetos.java
//-----------------------------------------------------------------
26
JAVA
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.
Programa Exemplo 3.5: Herana
//----------------------------------------------------------------// Programa : TesteHeranca.java
//----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa
//----------------------------------------------------------------class Pessoa {
// Atributos
private String nome;
private long identidade;
}
//----------------------------------------------------------------// Classe Aluno (derivada de Pessoa)
//----------------------------------------------------------------class Aluno extends Pessoa {
27
JAVA
// 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 + "
Media=" + media());
JAVA
}
//----------------------------------------------------------------// 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);
29
JAVA
Media=" + media());
}
//----------------------------------------------------------------// Classe TesteHeranca
//----------------------------------------------------------------class TesteHeranca {
public static void main(String args[]) {
Aluno a = new Aluno("Jorge", 1234, 2009001001);
a.setNotas(9.0, 8.0);
a.print(); // usa metodo da classe base
a.printSituacaoAluno ();
}
}
30
JAVA
Media=" + media());
}
//----------------------------------------------------------------// Classe TesteSobrescritaMetodo
//----------------------------------------------------------------class TesteSobrescritaMetodo {
public static void main(String args[]) {
Aluno a = new Aluno("Jorge", 1234, 2009001001);
a.setNotas(9.0, 8.0);
a.print(); // metodo da classe Aluno
}
}
Observaes:
No esquea que mtodos marcados como final, private ou static no so herdados e por este
motivo no podem ser sobrescritos.
Se voc herdou mtodos abstratos de uma classe abstrata, ento obrigatrio sobrescrev-los
(na prtica voc estaria implementando porque no tem nada para sobrescrever).
31
JAVA
Mas se sua classe tambm for abstrata no precisa, voc pode simplente "passar a vez" para a
ltima classe concreta da rvore.
S no esquea que em algum momento voc ser obrigado a sobrescrever os mtodos abstract.
Outro ponto importante que os mtodos sobrescritos no podem declarar um modificador
de acesso mais restritivo do que o que foi sobrescrito. Por exemplo:
Declaramos o mtodo como protected mas depois tentamos deix-lo default. Isto no compila porque
default mais restritivo que protected. Como expliquei antes, em tempo de execuo, a JVM chama a
verso do mtodo sobrescrito, e o modificador de acesso ficou mais restrito. Se ele estivesse em um
pacote diferente no poderia ser chamado.
Vamos ver agora umas regras importantes:
A lista de argumentos deve se manter a mesma! Se ela mudar o mtodo no ser mais sobrescrito e sim
sobrecarregado. Lembre-se que sobrescrever no nada mais que usar o mesmo nome do mtodo
herdado. O modificador de acesso do novo mtodo no pode ser mais restritivo (menos pode).
Mtodos s podem ser sobrescritos se forem herdados. Ou seja, mtodos final, private ou static no
podem. E classes fora do pacote s podem sobrescrever mtodos public ou protected (mtodos
protected so herdados). O tipo de retorno deve ser o mesmo ou um subtipo do mtodo original. Isto
chama-se retornos covariantes ou covariant returns. Este um assunto a parte, mas apenas lembre-se
que o tipo de retorno pode ser o mesmo ou um subtipo. No tem problema em retornar um subtipo
porque com certeza ele "cabe" no supertipo.
Para finalizar a parte de sobrescrita vou fazer s mais duas observaes importantes: Podemos chamar a
verso da superclasse do mtodo usando a palavra chave super:
32
JAVA
E outra, mesmo no tento falado sobre excees vou insistir em colocar aqui que poder cobrada em
prova:
Um mtodo foi sobrescrito, mas est sendo chamado atravs de uma referncia polimrfica (da
superclasse) para apontar para o objeto do subtipo. Como vimos o compilador vai pensar que voc est
chamando a verso da superclasse. Mas a JVM em tempo de execuo vai chamar a verso da
subclasse. A verso da superclasse declarou uma exceo, mas a do subtipo no. O cdigo no compila
devido a exceo declarada. Mesmo que a verso usada em tempo de execuo seja a do subtipo.
Sobrecarregando mtodos da classe-base:
Metodos sobrecarregados tem uma diferena bsica dos mtodos sobrescritos: Sua lista de argumentos
DEVE ser alterada. Por este motivo, os mtodos sobrecarregados permitem que se utilize o mesmo
nome do mtodo numa mesma classe ou subclasse e isto pode ser usado para dar mais opes a quem
for chamar o mtodo. Por exemplo, podemos ter um mtodo que receba uma varivel int e outro que
receba double, e a pessoa que for chamar no precisar se preocupar com fazer nenhuma converso.
33
JAVA
Diferente dos mtodos sobrescritos, os sobrecarregados podem mudar o tipo de retorno e o modificador
de acesso sem restries. Eles tambm podem lanar excees verificadas novas ou mais abrangentes.
Os mtodos sobrecarregados podem ser declarados na mesma classe ou na subclasse. Saber diferenciar
mtodos sobrecarregados dos sobrescritos importante para no cair em pegadinhas como:
O cdigo acima pode parecer violar uma das regras de sobrescrita (modificador mais restritivo) porm
ele est sobrecarregando pois houve mudana na lista de argumentos. Uma questo importante em
mtodos sorbrecarregados : Qual mtodo ser chamado? Isso vai depender exclusivamente dos
argumentos passados. Por exemplo, no caso anterior se voc chamar:
Vai retornar Animal comendo.... Mas e se usarmos argumentos de objetos ao invs de tipos
primitivos?
34
JAVA
Qual verso ser executada? Voc poderia pensar que seria a verso de Dog, porque estamos passando
uma referncia ao objeto Dog. Mas no , a sada seria Animal pois mesmo sabendo que em tempo de
execuo o objeto utilizado ser um Dog e no um Animal, quando o mtodo sobrecarregado isto no
decidido em tempo de execuo.
Ento lembre-se: Quando o mtodo sobrecarregado, apenas o tipo da referncia importa para saber
qual mtodo ser chamado.
Resumindo, o mtodo sobrescrito a ser chamado definido em tempo de execuo e o sobrecarregado
no tempo de compilao.
Ento para fechar o tpico vou dar mais uma dica: Fique atento aos mtodos que parecem ser
sobrescritos, mas esto sendo sobrecarregados:
A classe Dog tem dois mtodos: A verso teste sem argumentos que herdou de Animal e a verso
sobrecarregada. Um cdigo que faz referncia a Animal pode chamar somente teste sem argumentos,
mas uma referncia a Dog pode chamar qualquer um.
Dever de casa
Dado:
Quais instrues, inseridas na linha comentada, iro compilar? (Marque todas corretas)
A. Flower getType() { return this; }
B. String getType() { return "this"; }
C. Plant getType() { return this; }
D. Tulip getType() { return new Tulip(); }
35
JAVA
@Override
public String toString() {
return "Pessoa [nome = " + this.nome + "]";
}
Quando aplicamos a anotao @Override em um mtodo, estamos deixando explcito no cdigo fonte
que esse mtodo uma reescrita. Obviamente, essa anotao s pode ser aplicada em mtodos
reescritos. Caso contrrio, se for aplicado em um mtodo que no pode ser reescrito, um erro de
compilao gerado.
A anotao @Override opcional. Da surge uma grande dvida. Por que utiliz-la? H 5 mil anos, um
sbio chins j dizia que programador bom programador preguioso. Seguindo o ensinamento desse
sbio, s deveramos utilizar essa anotao caso exista pelo menos um motivo muito forte para tal.
O primeiro argumento para utilizarmos a anotao @Override a legibilidade do cdigo, pois os
mtodos reescritos so facilmente identificados na leitura do cdigo fonte.
O segundo argumento a verificao realizada pelo compilador nos mtodos anotados com Override.
Por exemplo, considere o seguinte cdigo.
public class Pessoa {
private String nome;
H algo de errado com a classe Pessoa? No h nenhum erro de compilao! Contudo, provavelmente,
o programador que escreveu esse cdigo gostaria de reescrever o mtodo toString() da classe Object.
Mas, um erro de digitao ocorreu e a reescrita no foi realizada (onde est o erro de digitao?).
Como o compilador no indica nenhum problema no cdigo fonte, esse erro pode demorar para ser
percebido e gerar grandes transtornos. Se a anotao @Override tivesse sido aplicada, o compilador
iria verificar se o mtodo respeita as regras de reescrita e logo perceberia o erro de digitao.
public class Pessoa {
private String nome;
@Override
public String tostring() { // erro de compilacao
return "Pessoa [nome = " + this.nome + "]";
}
}
Imediatamente, o programador seria avisado pelo compilador. Assim, o erro poderia ser corrigido
rapidamente sem que outros problemas fossem gerados na aplicao. Voc j descobriu qual o erro
de digitao?
Resposta: Como o Java Case Sensitive (diferencia caracteres Maisculos de minsculos), o cdigo
informado implementa um mtodo diferente do contido na Classe Object, simplesmente pelo nome do
36
JAVA
mtodo est escrito todo em caixa baixa (tostring()), para ocorrer o fenmeno da reescrita (ou
sobrescrita), o mtodo dever ter o mesmo nome da classe Object, "toString()".
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method tostring() of type Pessoa must override or implement a supertype method
at Pessoa.tostring(Pessoa.java:10)
at Programa.main(Programa.java:10)
Se voc usar esse mtodo na classe Filha (classe-derivada) ver o nome do pai, correto?
Claro, pois a classe filha herda os mtodos tambm da classe pai tambm.
Mas esse mtodo retorna o nome da pessoa da classe. No faz sentido ver o nome do pai, quando
invocamos esse mtodo na classe filha.
Para isso, vamos criar um mtodo prprio da classe "Filha", que retorne o nome dela, e no o do pai.
Ficar assim:
public void nome(){
System.out.println("O nome da filha '" + this.nomeFilha + "'.");
}
Pai.java
37
JAVA
public Pai(){
this.nomePai="Neil";
}
public void nome(){
System.out.println("O nome do pai '" + nomePai + "'.");
}
}
Filha.java
Pronto. Com o @Override, o Java vai mostrar o nome da filha, caso o objeto seja do tipo Filha.
E vai mostrar o nome do pai caso o objeto seja apenas do tipo Pai.
Typecast
Quando lidamos com linguagens de programao fortemente tipadas como Java, nos confrontamos
muitas vezes com a necessidade de variar de um tipo de dado para outro. Em Java, ns podemos fazer
uso do que chamamos de induo de tipo ou typecast. O typecast dita ao compilador como tal dado
deve ser interpretado e manipulado.
Essa induo de tipo ou typecast pode ser implcita ou explcita.
O typecast implcito feito automaticamente pelo compilador quando um tipo de dado pode ser
facilmente manipulado no lugar de outro tipo de dado. O typecast explcito feito diretamente no
algortmo para indicar ao compilador qual a forma de interpretao de um dado quando ele entende que
h ambiguidade ou formatos incompatveis.
O typecast explcito dado sempre dentro de parnteses que sempre vem antes do dado a ser induzido.
Ex.: (int) var1, (float) var2, (Object) var3, ...
Typecast de Dados Primitivos
O typecast de dados primitivos dado basicamente em questo de seu consumo de memria. Se
tentamos designar um tipo de dado que consome menos memria para um que consome mais memria,
o typecast realizado implicitamente. No exemplo abaixo, atribuimos um dado inteiro (varInt) a uma
varivel do tipo float (varFloat).
public class ExemploTypecast1 {
public static void main(String[] args) {
float varFloat;
int varInt;
varInt = 200;
varFloat = varInt;
System.out.println(varFloat);
}
38
JAVA
O contrrio no se aplica. Tentar atribuir um tipo de dado maior para um tipo de dado menor ir resultar
em um erro de tipos incompatveis (type mismatch).
Para demonstrar isso, usaremos dois tipos de dados inteiros. Porm, iremos atribuir um inteiro longo
(que consome mais memria) a um dado inteiro que consome menos. Nesse caso, somos obrigados a
usar typecast explcito.
public class ExemploTypecast2 {
public static void main(String[] args) {
long varLong;
int varInt;
varLong = 200;
varInt = (int) varLong;
System.out.println(varInt);
}
}
Agora, vamos instanciar uma varivel da classe genrica Object com a classe TV.
public class ExemploTypecast3 {
public static void main(String[] args) {
Object obj = new TV(29, 1, 0, false);
System.out.println("A varivel obj " + obj.getClass());
}
}
Como podemos perceber, o resultado de getClass da varivel obj no sua classe original (Object), mas
sua instncia: class tiexpert.TV. Agora, no ser possvel criar uma cpia desse objeto para
uma varivel do mesmo tipo de sua instncia. Neste caso, devemos fazer o typecast explcito da classe.
public class ExemploTypecast4 {
public static void main(String[] args) {
Object obj = new TV(29, 1, 0, false);
TV tv = (TV) obj;
TV tv2 = new TV(29, 1, 0, false);
System.out.println("A varivel tv cpia de obj" +
"\nobj: " + obj.toString() +
39
JAVA
Instanceof
No exemplo anterior, se tentssemos atribuir obj diretamente a tv ocorreria um erro de tipos
incompatveis (type mismatch). Quando lidamos com classes, podemos testar qual seu tipo de
instancia usando o operador instanceof. Instanceof indica se um objeto (j instanciado) pertence a
uma classe.
O uso de instanceof : objeto instanceof nomeDaClasse.
Para melhorar o exemplo anterior, usaremos instanceof antes de atribuirmos obj a tv.
public class ExemploTypecast {
public static void main(String[] args) {
Object obj = new TV(29, 1, 0, false);
TV tv = null;
if (obj instanceof TV) {
tv = (TV) obj;
}
TV tv2 = new TV(29, 1, 0, false);
System.out.println("A varivel tv cpia de obj" +
"\nobj: " + obj.toString() +
"\ntv: " + tv.toString());
System.out.println("TV2 outro objeto: " + tv2.toString());
}
}
Polimorfismo na herana
___________________________________________________________________________________
Polimorfismo a utilizao de uma mesma referncia (mesmo nome) podendo assumir vrios
significados (ou formas).
40
JAVA
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);
}
41
JAVA
// 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 + "
}
Media=" + media());
}
//----------------------------------------------------------------// 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;
}
42
JAVA
Pessoa p;
Aluno a = new Aluno("Jorge", 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;
}
43
JAVA
// 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;
}
Media=" + media());
}
//----------------------------------------------------------------// 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;
}
44
JAVA
Classes Abstratas
___________________________________________________________________________________
So classes atravs das quais NO se pode criar objetos. So feitas apenas para criao de classes
derivadas das mesmas.
45
JAVA
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 abstrata (evidentemente, 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:
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)
//-----------------------------------------------------------------
46
JAVA
Media=" + media());
47
JAVA
p.print();
}
//----------------------------------------------------------------// Classe TesteClasseAbstrata
//----------------------------------------------------------------class TesteClasseAbstrata {
public static void main(String args[]) {
Aluno a = new Aluno("Jorge", 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);
}
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
48
JAVA
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:
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 {
49
JAVA
}
//----------------------------------------------------------------// 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;
}
// Mtodo para calcular e retornar a mdia
public double media() {
return (a1+a2)/2;
}
Media=" + media());
50
JAVA
p.print();
}
//----------------------------------------------------------------// Classe TesteInterface
//----------------------------------------------------------------class TesteInterface {
public static void main(String args[]) {
Aluno a = new Aluno("Jorge", 1234, 2009001001);
a.setNotas(9.0, 8.0);
Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000);
51
JAVA
O uso de Interfaces em Java por muitas vezes feito de forma errada, ou mesmo nem utilizado. Este
exemplo tem como principal objetivo demonstrar os usos prticos de Interfaces em Java.
Antes de tudo importante entender qual o conceito principal de Interface: Esta tem objetivo criar um
contrato onde a Classe que a implementa deve obrigatoriamente obedecer. Na listagem 1 vemos
como criar uma simples Interface em Java.
Perceba que os mtodos na interface no tm corpo, apenas assinatura. Agora temos um contrato que
deve ser seguido caso algum a implemente. Veja na listagem 2, uma classe que implementa a nossa
Interface acima.
Listagem 2: Implementando a Interface
public class MinhaClasse implements MinhaPrimeiraInterface {
@Override
public void metodo1() {
// TODO Auto-generated method stub
}
52
JAVA
@Override
public int metodo2() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String metodo3(String parametro1) {
// TODO Auto-generated method stub
return null;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
Ao usar a palavra reservada implements na MinhaClasse, voc ver que a IDE (Eclipse, Netbeans e
etc) obriga voc a implementar os mtodos descritos na Interface.
Usos Prticos da Interface
Tendo conhecimento do uso bsico de uma Interface, podemos entender qual a verdadeira
funcionalidade dela em um caso real.
Seguindo o Padro
A Interface muito utilizada em grandes projetos para obrigar o programador a seguir o padro do
projeto, por esta tratar-se de um contrato onde o mesmo obrigado a implementar seus mtodos, ele
dever sempre seguir o padro de implementao da Interface.
Vamos supor o seguinte caso: Temos uma Interface BasicoDAO que dir aos programadores do nosso
projeto o que suas classes DAO devem ter (para efeito de conhecimento, o DAO onde ficar nosso
CRUD), qualquer mtodo diferente do que tem na nossa Interface DAO ser ignorado e no utilizado.
Listagem 3: Nossa Interface DAO
import java.util.List;
public interface BasicoDAO {
public
public
public
public
public
Agora um dos programadores que est trabalhando no mdulo de RH quer criar um DAO para realizar
o CRUD de Funcionrios, ele implementa a Interface acima e ainda adiciona mtodos a parte (que
sero ignorados mais a frente).
53
JAVA
Temos agora todos os itens da receita, vamos agora utiliz-lo em nossa aplicao. Suponha que um
novo programador (que no criou a classe FuncionarioDAO), precise inserir um novo funcionrio.
Este novo programador no tem idia de como foi implementada a classe FuncionarioDAO, ele nem
mesmo tem acesso a esta classe, porm ele sabe de algo muito mais importante: A Definio da
Interface. Sendo assim ele ir usar todo o poder do polimorfismo e criar um novo objeto
FuncionarioDAO do tipo BasicoDAO. Veja a listagem 5.
Listagem 5: Usando o polimorfismo
public class MeuApp {
/**
* @param args
*/
public static void main(String[] args) {
BasicoDAO funcionarioDAO = new FuncionarioDAO();
}
funcionarioDAO.salvar(Funcionario001);
54
JAVA
Perceba que criamos o objeto FuncionarioDAO do tipo BasicoDAO, sendo assim s conseguimos
chamar os mtodos da Interface BasicoDAO. Mas o mais importante que o novo programador que
utilizar a classe FuncionarioDAO, poder chamar os mtodos descritos na Interface.
Mas o que obriga que o programador que criou a classe FuncionarioDAO implemente BasicoDAO?
Na verdade nada, ele pode criar FuncionarioDAO sem implementar a interface, porm o novo
programador que utilizar essa classe no conseguir realizar o polimorfismo acima e ver que a classe
est errada, foi criada de forma errada, fora do padro. H ainda outra forma de sabermos se a classe
que foi criada implementou a interface BasicoDAO, veja na listagem 6.
Listagem 6: Uso do instanceof
public class MeuApp {
/**
* @param args
*/
public static void main(String[] args) {
FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
if (funcionarioDAO instanceof BasicoDAO)
funcionarioDAO.salvar(Funcionario001);
else
System.err.println("A Classe FuncionarioDAO no implementa
BasicoDAO, nenhum procedimento foi
realizado");
}
Agora conseguimos ver os mtodos implementados a parte pelo programador (fora da implementao
da interface), porm testamos antes se a classe uma instancia (instanceof) de BasicoDAO.
Interface de Marcao
Existe ainda um conceito que chamamos de: Interface de Marcao. So interfaces que servem apenas
para marcar classes, de forma que ao realizar os instanceof podemos testar um conjunto de classe.
Vamos a outro exemplo prtico: Temos uma Interface Funcionario sem nenhum mtodo ou atributo,
isso porque ser apenas uma interface de marcao. Veja na listagem 7.
Listagem 7: Interface de Marcao Funcionario
public interface Funcionario {
}
Agora criamos 3 Beans, que correspondem a 3 tipos distintos de funcionrios: Gerente, Coordenador e
Operador. Todos implementando Funcionario.
Listagem 8: Criao de Gerente, Coordenador e Operador
public class Gerente implements Funcionario {
private int id;
private String nome;
}
public class Coordenador implements Funcionario {
private int id;
private String nome;
55
JAVA
}
public class Operador implements Funcionario {
private int id;
private String nome;
}
Agora em nossa aplicao temos um mtodo que realiza um procedimento de calculo de salrio
diferente para cada tipo de funcionrio. Poderiamos no utilizar o poder da Interface e fazer a
implementao abaixo.
Listagem 9: Uso indevido da Interface de Marcao
public class MeuApp {
public void calcularSalarioParaGerente(Gerente gerente){
}
public void calcularSalarioParaCoordenador(Coordenador coordenador){
}
public void calcularSalarioParaOperador(Operador operador){
}
Em vez de ficar criando um mtodo para cada tipo de funcionrio, juntamos tudo em apenas 1
utilizando a interface de marcao.
Concluso
Quando bem utilizada, a interface acaba tornando-se uma poderosa ferramenta nas mos de um
programador ou Analista, e torna-se indispensvel o seu uso no dia-a-dia. As boas prticas de
programao regem que o uso da Interface indispensvel para um bom projeto de software.
Pacotes (Packages)
___________________________________________________________________________________
Pacotes so unidades de compilao independentes, que podem possuir um nome para referncia por
parte de outras unidades de compilao.
56
JAVA
Sintaxe:
package <nome do pacote>;
<definio das classes do pacote>
....
Programa Exemplo 3.12: Pacotes (criao)
//-------------------------------------------------------------------// 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);
}
}
OBS:
-
As classes, mtodos e atributos do pacote que precisam ser acessados a partir de outros
pacotes devem ser publicas.
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.
57
JAVA
CAPTULO IV
GENERICS
Genrics um novo recurso lanado no J2SE5.0 que fornece uma forma de generalizar mtodos e
classes, permitindo que os mesmos possam trabalhar com parmetros genricos.
.......
Mtodos Genricos
___________________________________________________________________________________
58
JAVA
.......
.......
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);
......
......
Programa Exemplo 4.2: Mtodos genrico com parmetro genrico no tipo de retorno e
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 o 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;
}
*/
59
JAVA
......
......
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) {
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;
}
60
JAVA
Classes Genricas
___________________________________________________________________________________
......
......
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;
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>();
61
JAVA
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());
}
}
......
......
Programa Exemplo 4.5: Curingas
import java.util.ArrayList;
public class Curinga {
// Usando E
/*
public static <E extends Number> double soma(ArrayList<E> list) {
double s = 0;
for (E : list) s+=e.doubleValue(); // doubleValue funciona para classes
// numricas, mas no p qq tipo E
return s;
}
*/
// Usando o coringa ?
public static double soma(ArrayList<? extends Number> list) {
double s = 0;
for (Number e : list) s+=e.doubleValue();
return s;
}
62
JAVA
63
JAVA
CAPTULO V
MANIPULAO DE LISTAS
A API Collections fornece uma srie de estruturas de dados complexas para manipulao de colees
de dados (listas), que implementam uma srie de facilidades, quando comparadas a manipulao direta
de arrays.
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,
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)
O ArrayList pode armazenar objetos, independentemente de sua classe, por exemplo uma String um
objeto da classe Pessoa, etc.
Ex:
List lista = new ArrayList();
lista.add(Maria);
lista.add(new Pessoa(Claudio, 1234));
Entretanto, isso pode gerar alguma confuso (ou necessidade controle adicional) na hora de acessar
(retornar) os objetos da lista.
No Java 5 possvel utilizar um recurso de Generics (que permite com que se escreva Mtodos e
Classes genricos, ou seja, que possam receber qualquer tipo de elemento ou parmetro) para restringir
o tipo de elemento da lista. Isso feito utilizando-se os sinais < e >.
Assim, poderamos escrever:
64
JAVA
65
JAVA
import java.util.List;
import java.util.ArrayList;
//----------------------------------------------------------------// classe TesteList
//----------------------------------------------------------------public class TesteList {
public static void main(String args[]) {
List<Pessoa> pessoas = new ArrayList<Pessoa>();
pessoas.add(new
pessoas.add(new
pessoas.add(new
pessoas.add(new
Pessoa("Ana", 111));
Pessoa("Jorge", 222));
Pessoa("Jos", 333));
Pessoa("Gabriel", 444));
66
JAVA
CAPTULO VI
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)
BD
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";
67
JAVA
Criando a Conexo:
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.
68
JAVA
ii)
Copie o arquivo do driver (mysql-connector) para o seu workspace (basta copiar e colar no
diretrio do workspace.
iii)
Adicione ao classpath:
Clique de direita: Build Path -> Add to Build Path
iv)
v)
69
JAVA
ii)
70
JAVA
stmt.setString(1, "Claudio");
stmt.setLong(2, 111);
// Executa sentena
stmt.execute();
// Fecha sentena
stmt.close();
System.out.println("Gravado!");
// Fecha conexo
con.close();
iii)
Deletando do BD:
Ex:
// Criando a String da sentena
String sql = "delete from pessoas where id=?";
// Criando o objeto PreparedStatement
PreparedStatement stmt = con.prepareStatement(sql);
// Preenchendo os valores (onde esto as interrogaes)
stmt.setLong(1, 1);
// Executando sentena
stmt.execute();
Atualizando o BD:
Ex:
// Criando a String da sentena
String sql = "update pessoas set nome=?, identidade=? where id=?";
// 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();
71
JAVA
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.
// Criando a String da sentena
String sql = "select * from contatos";
// 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.
Sugesto para entrada de dados:
// Cria o Scanner
Scanner teclado = new Scanner(System.in);
System.out.print("Nome: ");
// L uma linha
String nome = teclado.nextLine();
System.out.print("Identidade: ");
// L um long
long identidade = teclado.nextLong();
JAVA
ii)
import
import
import
import
import
import
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.SQLException;
java.util.ArrayList;
java.util.List;
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>();
73
JAVA
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)
74
JAVA
CAPTULO VII
Servlet Container
___________________________________________________________________________________
Um servlet container um servidor que suporta apenas uma parte do Java EE (e no o Java EE
completo). Um servlet container suporta:
JSP
Servlets
JSTL
JSF
JAVA
76
JAVA
%>
</html>
77
JAVA
</web-app>
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:
-
78
JAVA
i) Escreva um JSP
tela_adiciona.jsp):
com
um
form
para
submeter
uma
requisio
(salve
como
<html>
<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):
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.
79
JAVA
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:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
}
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)
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
80
JAVA
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)
iii)
Reinicie o Tomcat
iv)
Acesse: http://localhost:8080/jspteste/oi
(dentro
de
81
src)
JAVA
iii)
um
form
para
submeter
uma
requisio
(salve
como
<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
82