Professional Documents
Culture Documents
Linguagem Java
Linguagem realmente orientada por objetos
Menos que Eiffel Mais que C++ ou Object Pascal (Delphi)
Sintaxe baseada em C. Tipos de dados bsicos similares a C. Remoo de vrias caractersticas perigosas de C++ (pointers). Gerenciamento de memria automtico. Grande biblioteca que inclui Web, Interfaces Grficas (GUI) e Redes.
Filosofia de Programao
Programas Java
Compilador
Bytecodes
Sistema Operacional
Mquina Real
Denilson / Anderson /Ana Paula 4
Filosofia de Programao
Programas Java so compostos por classes, armazenadas em arquivos texto com extenso .java. Estes programas podem ser editados por um editor de texto convencional e so armazenados em disco como um arquivo convencional. Atravs do processo de compilao, um cdigo objeto gerado a partir do cdigo fonte. Este cdigo objeto, denominado bytecode, armazenado em disco como um ou mais arquivos de extenso .class. Uma vez gerado o cdigo objeto Java (bytecodes), o mesmo interpretado por uma mquina virtual, que traduz cada instruo do bytecode para uma instruo que o computador nativo possa entender.
Denilson / Anderson /Ana Paula 5
Filosofia de Programao
Resumindo:
Compilador: atua no cdigo fonte e gera cdigo intermedirio (bytecodes) Bytecodes: Independente de arquitetura Mquina virtual Java
Carrega os bytecodes na memria (Class Loader) Verifica os bytecodes (Bytecode Verifier) Interpreta bytecodes diretamente para a arquitetura da mquina real
Ambientes de Desenvolvimento
Linha de Comando:
JDK: Java Developers Kit
Ambientes Integrados:
Eclipse Sun NetBeans Borland JBuilder Microsoft Visual J++
Livros de Java
Core Java. Volume 1 - Fundamentos
Cay Horstmann & Gary Cornell
Java in a Nutshell
David Flanagan
Thinking in Java
Bruce Eckel Disponvel em www.bruceeckel.com
Plataforma Java
Formada por trs partes:
Mquina virtual Java (JVM) Linguagem Java Biblioteca de classes Java (API)
JDK
JDK (Java Development Kit) constitui o ambiente bsico para desenvolvimento de software em Java. Ele composto de:
um conjunto de ferramentas de desenvolvimento; APIs que compem o ncleo de funcionalidades da linguagem; APIs que compem a extenso padronizada ao ncleo; ambiente runtime (a Mquina Virtual Java, ou JVM).
10
Ferramentas de Desenvolvimento
Principais ferramentas de desenvolvimento incorporadas ao kit de desenvolvimento:
javac - compilador; java - interpretador de aplicaes; appletviewer - interpretador de applets; javadoc - gerador de documentao para programas; jar - manipulador de arquivos comprimidos no formato Java Archive, juntamente com extcheck, o verificador de arquivos nesse formato; jdb - depurador de programas; javap - disassembler de classes Java; javah - gerador de arquivos header para integrao a cdigo nativo em C.
Denilson / Anderson /Ana Paula 11
PATH e CLASSPATH
A varivel de ambiente PATH deve incluir o diretrio contendo as ferramentas de desenvolvimento
Em ambiente Windows, defina a varivel PATH da seguinte forma: SET PATH=c:\jdk1.4\bin;%PATH%
A varivel de ambiente CLASSPATH deve incluir os diretrios contendo a estrutura de pacotes Java
SET CLASSPATH=c:\MeuPacoteJava;c:\prog\java; Em algumas verses do JDK, o diretrio corrente, ou seja, o diretrio . precisa estar em CLASSPATH. SET CLASSPATH=.;%CLASSPATH%
Denilson / Anderson /Ana Paula 12
Linha de Comando
O programa fonte um arquivo texto e pode ser digitado em qualquer editor de texto
NotePad (Bloco de Notas), TextPad ou outro qualquer.
Programas em Java
Um arquivo fonte constitudo por um conjunto de classes
Normalmente um arquivo contm apenas uma classe.
14
Programas em Java
class Classe1 { ... } class Classe2 { ... } public class Classe3 { ... }
15
Primeiro Programa
public class PrimeiroPrograma { public static void main(String[] args) { System.out.println (Alo, mundo!); } } O nome do arquivo deve ser PrimeiroPrograma.java. Java sensvel a letras maisculas e minsculas. A classe compilada armazenada em um arquivo .class.
Denilson / Anderson /Ana Paula 16
Mtodo main
O mtodo main() o ponto de incio de execuo de uma aplicao Java (exceto para applets).
A primeira classe a ser chamada em uma aplicao possui o mtodo main para iniciar a aplicao. As demais classes podem implementar o mtodo main para testes da prpria classe.
Assinatura do mtodo main: public static void main(String[] args) ou static public void main(String args[])
O nome do parmetro (args) poderia ser diferente, mas os demais termos da assinatura devem obedecer ao formato especificado.
Denilson / Anderson /Ana Paula 17
Mtodo main
Parmetro
O mtodo main recebe como argumento um parmetro do tipo arranjo de objetos String. Cada elemento desse arranjo corresponde a um argumento passado para o interpretador Java na linha de comando que o invocou. Ex.: java Teste aaaa 22 zzz
O mtodo main(String args[]) da classe Teste vai receber, nessa execuo, um arranjo de trs elementos na varivel args com os seguintes contedos:
args[0] - objeto String com contedo aaaa; args[1] - objeto String com contedo 22; args[2] - objeto String com contedo zzz.
18
Mtodo main
Valor de Sada
O mtodo main do tipo void. Ele no tem valor de retorno. Se for necessrio retornar um valor deve-se usar o mtodo System.exit(int).
A invocao desse mtodo provoca o fim imediato da execuo do interpretador Java. Tipicamente, o argumento de exit() obedece conveno de que 0 indica execuo com sucesso, enquanto um valor diferente de 0 indica a ocorrncia de algum problema.
19
20
Classe
Primeira letra maiscula, demais minsculas. Nomes compostos iniciando com letras maisculas. Ex.: MinhaClasse.
Mtodos e Atributos
Primeira letra minscula, demais minsculas. Nomes compostos iniciando com letras maisculas. Ex1: meuMetodo. Ex2: meuAtributo.
Constantes
Letras maisculas. Ex.: PI
21 Denilson / Anderson /Ana Paula
Comentrios em Java
Java possui trs tipos de comentrios:
Comentrio at o final da linha usando //
// isso um exemplo de comentrio at o final da linha.
Comentrio para documentao usando javadoc. O comentrio comea com /** e termina com */
/** Comentrio para a ferramenta javadoc @version 1.0 @author Denilson Alves Pereira */
Denilson / Anderson /Ana Paula 22
Tipos de Dados
H oito tipos primitivos (pr-definidos):
Nmeros Inteiros
int 4 bytes
mais usado
byte 1 byte
com sinal: -128 a +127
double 8 bytes
duas vezes a preciso do tipo float mais usado
Denilson / Anderson /Ana Paula 23
Tipos de Dados
Caractere
char 2 bytes
caracteres Unicode
permite at 65536 caracteres (atualmente usados cerca de 35000). primeiros 255 caracteres idnticos ao cdigo ASCII/ANSI. representados por \u0000 a \uFFFF.
caracteres especiais:
\b (backspace) \t (tab) \n (linefeed) \r (carriage return) \\ (barra invertida) \ (aspas duplas) \ (apstrofe)
Lgico
boolean 1 bit (valores verdadeiro (true) e falso (false))
Variveis
Java uma linguagem fortemente tipada
toda varivel precisa ter um tipo.
Uma varivel declarada colocando-se o tipo seguido pelo nome da varivel. Exemplos:
int umaVariavelInteira; double variavelReal = 14.7; //varivel declarada e inicializada boolean achou, b; // declarao de duas variveis do mesmo // tipo
Variveis podem ser declaradas em qualquer lugar, desde que antes de seu uso.
Variveis podem ser declaradas na primeira expresso de um loop for.
Denilson / Anderson /Ana Paula 25
Variveis
Escopo de variveis:
Um bloco ou instruo composta qualquer nmero de instrues simples Java que so delimitadas por um par de chaves { ... }. Variveis so sempre locais a um bloco.
No existe o conceito de variveis globais a um programa.
Exemplo:
public static void main (String[] args) { int n; // n local ao mtodo main ... { int k; ... // k local a este bloco } ... // k no vale aqui Denilson / Anderson /Ana Paula }
26
Atribuio
Atribuio de valores a variveis feita pelo operador =.
Exemplo:
char c; c = S; // declarao // atribuio
28
29
Constantes
Uma constante definida usando-se as palavraschave static final. Exemplo:
public class ExemploConstante { public static final double PI = 3.14; public static void main (String[] args) { System.out.println(O valor de Pi + PI); } } A conveno de Java sempre usar letras maisculas para constantes.
31
Operadores Aritmticos
Operadores Aritmticos:
adio subtrao multiplicao diviso (inteira, se os operandos forem inteiros e ponto flutuante, caso contrrio) % mdulo (resto de diviso inteira) No existe operador de exponenciao. Para isso, use o mtodo pow da classe Math de java.lang.
double y = Math.pow(x,a); // y = xa
+ * /
Operadores Aritmticos
public class TesteAritmetico { public static void main (Strings args[]) { short x = 6; int y = 4; double a = 12.6; double b = 3.0; System.out.println (x + x + , y + y ); System.out.println (x + y = + (x + y) ); System.out.println (x - y = + (x - y) ); System.out.println (x / y = + (x / y) ); System.out.println (x % y = + ( x % y ) ); System.out.println (a + a + , b + b ); System.out.println ( a / b = + ( a / b ) ); System.out.println ( 11.0 / 3 = + (11.0 / 3 ) ); System.out.println ( 11 / 3 = + (11 / 3 ) ); } }
Denilson / Anderson /Ana Paula
33
// faz a = 12 e m = 6 // faz b = 10 e n = 6
Denilson / Anderson /Ana Paula 34
Exemplo:
int z = 4; int w = 6; z += w; // faz z = 10
35
Operadores Lgicos:
&& Operao lgica AND (E) || Operao lgica OR (OU) ! Operao lgica NOT (Negao)
Denilson / Anderson /Ana Paula 36
Exemplo:
int x = 6; int y = 13; int z = x & y; z = x << 1;
Comandos Condicionais
Comando if ... else
if if if if (condio) comando; (condio) { bloco de comandos } (condio) comando1; else comando2; (condio) { bloco1 } else { bloco2 }
Exemplo 1:
if (nota >= 70) System.out.println(Aprovado); else System.out.println(Reprovado);
38
Comandos Condicionais
Exemplo 2:
if (x > 5) { if (y > 5) System.out.println(x e y maiores do que 5); } else // sem o bloco, este else pertenceria ao segundo if System.out.println(x menor ou igual a 5);
Operador ternrio ?
condio ? e1 : e2
avalia e1 se condio for verdadeira ou e2 caso contrrio.
Exemplo:
System.out.println (nota >= 70 ? Aprovado : Reprovado);
39
Comandos Condicionais
Comando switch
switch (opo) { case valor1: comandos1; break; case valor2: comandos2; break; ... default: comandosn; break; } opo deve ser do tipo char, byte, short ou int. A execuo comea no case que coincide com o valor da seleo realizada, e continua at o break seguinte ou o final do switch. A clusula default opcional e ser executada se nenhum valor coincidir na seleo.
Denilson / Anderson /Ana Paula 40
Comandos de Repetio
Comando while
while (condio) { bloco } repete execuo do bloco enquanto condio for verdadeira.
Se condio inicial falsa, o bloco no executado nenhuma vez.
Exemplo:
int cont = 1; while (cont <= 10) { System.out.println (contador = + cont); cont++; }
41
Comandos de Repetio
Comando do ... while
do { bloco } while (condio) repete execuo do bloco enquanto condio for verdadeira.
O bloco executado pelo menos uma vez.
Exemplo:
int cont = 1; do { System.out.println (contador = + cont); cont++; } while (cont <= 10);
42
Comandos de Repetio
Comando for
for (comando; expresso1; expresso2) { bloco }
equivalente a:
{ comando; while (expresso1) { bloco; expresso2; } }
O comando inicializa um contador (que pode ser declarado aqui), a expresso1 fornece a condio de teste antes de cada passagem pelo lao e a expresso2 determina a alterao do contador.
Qualquer expresso vlida nos segmentos do for, mas aconselhvel usar apenas o necessrio para inicializar, testar e atualizar o contador.
Denilson / Anderson /Ana Paula
43
Comandos de Repetio
Exemplo1:
for (int cont = 1; cont <= 10; cont++) System.out.println (contador = + cont); // cont vlida somente dentro do bloco do for
Exemplo2:
int i; int j = 2; for (i = 15; i > j; i -= 2) { System.out.println (contador = + i); j++; } // i vlida depois do bloco do for
Denilson / Anderson /Ana Paula 44
Comando break
break no rotulado:
Usado para sair de um lao simples. Exemplo:
while (i <= 100) { saldo = saldo + deposito + juros; if (saldo > meta) break; i++; } // programa sai do lao while se i > 100 ou se saldo > meta. // Obviamente, o mesmo efeito poderia ser obtido sem o uso // do break.
45
Comando break
break rotulado:
Usado para sair de laos aninhados. Um rtulo (label) precisa preceder o lao mais externo do qual se deseja sair. Um rtulo seguido de dois pontos (:). Exemplo:
int n; ler_dados: // rtulo identificador do lao while ( ... ) { ... for ( ... ) { n = Console.readInt( ... ); // um mtodo para leitura de inteiros if (n < 0) // uma condio que normalmente no deveria ocorrer break ler_dados; // sai do lao ler_dados (while externo) ... } } Denilson / Anderson /Ana Paula
46
Manipulao de Strings
Strings so seqncias de caracteres. Java no tem um tipo string nativo. Java fornece duas classes para manipulao de strings:
String
operaes somente de leitura mais eficiente que StringBuffer (para leitura) possui uma sintaxe mista entre objetos e tipos primitivos
StringBuffer
operaes de leitura e escrita
Manipulao de Strings
Exemplos:
String s = ; // string vazia String saudacao = Ola;
Ao concatenar uma string com um valor que no string, este ltimo convertido para uma string.
Exemplos:
String censura = 18 + anos; int m = 20; System.out.prinln(O valor de m e + m);
Denilson / Anderson /Ana Paula 48
Exemplo (continuao):
int comp = j.compareTo(Java); // comp = 0
51
Classe Math
Pacote: java.lang.Math Define constantes e funes matemticas.
Constantes:
static double E // base de logaritmos neperianos (e = 2.718...) static double PI // pi (pi = 3.14...)
Algumas funes:
static double abs(double x) // valor absoluto static double log(double x) // ln(x) (logaritmo neperiano de x) static double exp(double x) // ex (e elevado a x) static double sin(double x) // seno de x static double cos(double x) // cosseno de x static double sqrt(double x) // raiz quadrada de x static double pow(double x, double y) // xy (x elevado a y)
Denilson / Anderson /Ana Paula 53
Arranjos
Arranjos so objetos criados dinamicamente. O tamanho de um arranjo definido na criao e no pode ser alterado. se isso for necessrio, deve-se usar o objeto Vector. O ndices de um arranjo variam de 0 at tamanho-1. A criao de um arranjo feita pelo operador new.
Exemplo de criao:
int[] valor = new int[100];
define um arranjo que pode conter 100 elementos do tipo int. os elementos so indexados de 0 a 99.
Exemplo de preenchimento:
for (int i = 0; i < 100; i++) valor[i] = i;
Denilson / Anderson /Ana Paula 54
Arranjos
Arranjos podem ser criados e inicializados usando { e }.
int[] numerosPrimos = {2, 3, 5, 7, 11, 13} // sem o operador // new new int[] {2, 3, 5, 7, 11, 13} // array annimo
usado para passar um parmetro para um mtodo sem criar uma varivel
Acessar um ndice fora dos limites gera exceo IndexOutofBoundsException durante a execuo.
Denilson / Anderson /Ana Paula 55
Arranjos
Cpia de arranjos:
Uma varivel do tipo arranjo um apontador para uma estrutura contendo os elementos do arranjo. Copiar uma varivel do tipo arranjo para outra significa apontar as duas variveis para a mesma estrutura. Exemplo:
int[] numerosPrimos = {2, 3, 5, 7, 11, 13}; int[] numerosQuaisquer = numerosPrimos; numerosQuaisquer[5] = 14;
numerosPrimos numerosQuaisquer
2 3 5 7 11 14
Denilson / Anderson /Ana Paula 56
Arranjos
Cpia de arranjos:
Para realmente copiar valores de um arranjo para outro, pode-se usar o mtodo arraycopy da classe System.
static void arraycopy(Object fonte, int posicaofonte, Object destino, int posicaodestino, int tamanho) Exemplo:
int[] numerosPrimos = {2, 3, 5, 7, 11, 13}; int[] numerosQuaisquer = {4, 10, 12, 14, 20}; System.arraycopy(numerosPrimos,2,numerosQuaisquer,3,2);
numerosPrimos
2 3 5 7 11 13
numerosQuaisquer
4 10 12 5 7
57
Arranjos
Arranjos Multidimensionais:
Declarao:
double[][] matriz; // arranjo bi-dimensional double[][] matriz2 = new double[5][4]; // arranjo bi-dimensional 5x4 int[][] vendas = {{1999, 2000}, {100000, 120000}}; // inicializao String[][][] triStr; // arranjo tri-dimensional
Prenchimento:
matriz[1][2] = 12; triStr[3][3][2] = Teste;
Mtodos
Mtodo uma funo ou procedimento (mdulo). Implementa uma operao realizada por uma classe. Definio de um mtodo:
tipo_de_retorno nome_do_mtodo (lista_de_parmetros) { comandos; }
lista_de_parmetros contm zero ou mais parmetros separados por vrgulas. Cada parmetro possui um tipo e um identificador. { e } indicam o incio e o fim do mtodo (corpo do mtodo).
Denilson / Anderson /Ana Paula 59
Mtodos
Variveis declaradas dentro de um mtodo so locais ao mtodo.
O espao de memria alocado a elas liberado automaticamente ao trmino do mtodo.
Mtodos
A chamada a um mtodo dada pelo nome da classe ou do objeto seguido pelo operador . (ponto) e pelo nome do mtodo.
Exemplos:
Math.sqrt(12); System.out.println(Ola);
61
Mtodos
Java permite que vrios mtodos com o mesmo nome sejam definidos (sobrecarga de mtodos).
As listas de parmetros desses mtodos devem ser diferentes. Quando o mtodo chamado, o compilador Java seleciona o mtodo pelo nmero, tipo e ordem dos parmetros.
62
Mtodos
Exemplo de passagem de parmetro:
public class Passagem1 { public static void divida(float y) { y /= 2.0; System.out.println(y: + y); } public static void main (String args[]) { float x = 1.0f; System.out.println(primeiro x: + x); divida(x); System.out.println(segundo x: + x); } }
resultado:
primeiro x: 1.0 y: 0.5 segundo x: 1.0
63
Mtodos
Exemplo de passagem de parmetro:
public class Passagem2 { public static void altera(int w[]) { w[2] = 4; } public static void main (String args[]) { int y[] = {1,2,3}; altera(y); for (int i = 0; i < y.length; i++) System.out.print(y[i]+ ); } }
resultado:
124
Denilson / Anderson /Ana Paula 64
Pacotes
Pacote um recurso para agrupar fsica e logicamente classes e interfaces relacionadas. Um pacote consiste de um ou mais arquivos. Um arquivo pode ter no mximo uma classe pblica. Os tipos pblicos definidos no pacote podem ser usados fora do pacote da seguinte maneira: prefixados pelo nome do pacote. importados diretamente via clusula import. Pacote uma coletnea de arquivos de classes individuais. O nome de um pacote corresponde a um nome de diretrio. Como pacote um diretrio, pode haver hierarquia de pacotes. Denilson / Anderson /Ana Paula 65
Pacotes
Um arquivo pertencente a um pacote inicia-se com a instruo package. Se um arquivo importa (usa) classes de um pacote, em seguida, vem a instruo import. O pacote java.lang importado automaticamente. Exemplo:
package cursojava; // define um pacote de nome cursojava import java.util.Arrays; // importa classe Arrays do pacote java.util import java.io.*; // importa todas as classes do pacote java.io public class Ordena { // define uma classe pertencente ao // pacote cursojava ... }
Denilson / Anderson /Ana Paula 66
Pacotes
Clusula import
A importao pode ser individual ou coletiva(*). Importaes suprfluas so descartadas. O escopo de uma importao a unidade de compilao.
CLASSPATH uma varivel de ambiente que informa ao carregador de classes onde procur-las.
Exemplo: set CLASSPATH=c:\projeto\fonte;
Denilson / Anderson /Ana Paula 67
Pacotes
Para procurar por uma classe, o carregador de classes:
pega o nome completo da classe incluindo o pacote que a contm.
Exemplo: java.lang.Math
Prefixa o resultado acima com cada um dos elementos de CLASSPATH. Usa os caminhos obtidos para ter acesso ao arquivo de bytecode da classe desejada.
Denilson / Anderson /Ana Paula 68
Pacotes
Pacotes da API Java:
java.applet
criao de applets, interao de applets com o browser.
java.awt
criao e manipulao de interfaces grficas de usurio.
java.awt.event
tratamento de eventos dos componentes da interface.
java.io
entrada e sada de dados.
java.lang
importado automaticamente por todos os programas, contm classes e interfaces bsicas.
69
Pacotes
Pacotes da API Java:
java.net
comunicao via Internet.
java.rmi
criao de programas distribudos.
java.sql
interao com bancos de dados.
java.text
manipulao de textos, nmeros, datas e mensagens.
java.util
manipulao de datas, hora, gerao de nmeros aleatrios etc.
javax.swing
componentes de interface grfica independentes de plataforma.
Denilson / Anderson /Ana Paula 70
72
Procedimental
POO 73
Objeto
Um objeto representa uma entidade fsica ou uma entidade conceitual ou uma entidade de software. (definio informal) Um objeto um conceito, abstrao, ou algo com fronteiras bem definidas e significado para uma aplicao. Um Objeto algo que possui:
Estado
armazena informao sobre o objeto.
Comportamento
define as mensagens aceitas pelo objeto.
Identidade
identifica unicamente o objeto.
Denilson / Anderson /Ana Paula 74
Classe
Uma classe a descrio de um grupo de objetos com propriedades similares (atributos), comportamento comum (operaes), relacionamentos comuns com outros objetos e semnticas idnticas.
Um objeto uma instncia de uma classe.
Exemplo:
Classe Pedido Atributos Nmero Data Vendedor Operaes Adiciona item Cancela Confirma venda
75
Classes e Objetos
Uma classe uma definio abstrata de um objeto.
Define a estrutura e o comportamento de qualquer objeto da classe. Serve como um padro para criao de objetos.
76
78
Representao de Classes
Um classe possui atributos e operaes (mtodos). Em UML, uma classe representada utilizando-se um retngulo dividido em trs sees:
A primeira seo contm o nome da classe. A segunda seo mostra a estrutura (atributos). A terceira seo mostra o comportamento (operaes).
Exemplo:
Pedido
nmero data vendedor adicionaItem Cancela confirmaVenda
Operaes (Mtodos)
79
Atributos
Os atributos definem o conjunto de propriedades de uma classe. Nome de atributos so substantivos simples ou frases substantivas. Cada atributo deve ter uma definio clara e concisa. Cada objeto tem um valor para cada atributo definido na sua classe. Para definir atributos, liste as propriedades de uma classe que sejam relevantes para o domnio em questo. Deve-se procurar um compromisso entre objetividade (procurar atender a determinado projeto, com o mnimo custo) e generalidade (permitir a reutilizao da classe em outros projetos). Denilson / Anderson /Ana Paula 80
Atributos
Um atributo definido por:
nome: um identificador para o atributo. tipo: o tipo do atributo (inteiro, real, caractere etc.) valor_default: opcionalmente, pode-se especificar um valor inicial para o atributo. visibilidade: opcionalmente, pode-se especificar o quo acessvel um atributo de um objeto a partir de outros objetos. Valores possveis so:
privativo - nenhuma visibilidade externa; pblico - visibilidade externa total; protegido - visibilidade externa limitada.
81
Operaes
Uma classe incorpora um conjunto de responsabilidades que definem o comportamento dos objetos na classe. As responsabilidades de uma classe so executadas por suas operaes. Uma operao um servio que pode ser requisitado por um objeto para obter um dado comportamento. Operaes tambm so chamadas de mtodos (Java) ou funes-membro (C++).
82
Evite excesso de argumentos de entrada e sada, o que geralmente indica a necessidade de partir as operaes em outras mais simples. Evite chaves de entrada, que geralmente indicam funes no-primitivas.
84
Definio de Operaes
Uma operao (mtodo) definida por:
nome: um identificador para o mtodo. tipo: quando o mtodo tem um valor de retorno, o tipo desse valor. lista de argumentos: quando o mtodo recebe parmetros para sua execuo, o tipo e um identificador para cada parmetro. visibilidade: como para atributos, define o quo visvel um mtodo a partir de objetos de outras classes.
85
Encapsulamento
Uma classe pode ser visualizada como consistindo de duas partes: interface e implementao.
A interface pode ser vista e usada por outros objetos (clientes). A implementao escondida dos clientes.
Esconder os detalhes da implementao de um objeto chamado encapsulamento. Encapsulamento oferece dois tipos de proteo. Protege:
O estado interno de um objeto de ser corrompido por seus clientes. O cdigo cliente de mudanas na implementao dos objetos.
Denilson / Anderson /Ana Paula 86
Benefcios do Encapsulamento
O cdigo cliente pode usar a interface para uma operao. O cdigo cliente no pode tirar vantagem da implementao de uma operao. A implementao pode mudar, por exemplo para: Corrigir um erro (bug).
Aumentar a performance. Refletir uma mudana no plano de ao.
O cdigo cliente no ser afetado pelas mudanas na implementao, assim reduzindo o efeito ondulao no qual uma correo em uma operao fora correes correspondentes numa operao cliente, o qual por sua vez, causa mudanas em um cliente do cliente... A manuteno mais fcil e menos custosa.
Denilson / Anderson /Ana Paula 87
Visibilidade e Encapsulamento
O controle de acesso (visibilidade) usado para garantir o encapsulamento.
A visibilidade especificada para atributos e operaes.
Para um mtodo, basta conhecer sua especificao. No h necessidade de saber detalhes de sua implementao.
Denilson / Anderson /Ana Paula 88
Sobrecarga (Overloading)
Atravs do mecanismo de sobrecarga, dois ou mais mtodos de uma classe podem ter o mesmo nome, desde que suas assinaturas sejam diferentes. Tal situao no gera conflito pois o compilador capaz de detectar qual mtodo deve ser escolhido a partir da anlise dos argumentos do mtodo. Exemplo 1: mtodos da classe java.lang.Math
esses mtodos tm implementaes alternativas para tipos de argumentos distintos. Exemplos: static double max (double a, double b) static float max (float a, float b) static int max (int a, int b)
Denilson / Anderson /Ana Paula 90
Sobrecarga (Overloading)
Exemplo 2:
public class Console { public static String readLine() { // comandos para leitura de uma string da entrada padro } public static String readLine(String prompt) { System.out.println(prompt+ ); return readLine(); } public static void main(String[] args) { String s = Console.readLine(Entre com o valor de s:); System.out.print(Entre com o valor de r:); String r = Console.readLine(); // ... } }
Denilson / Anderson /Ana Paula 91
Criao de Objetos
Conceito:
No paradigma de orientao por objetos, tudo pode ser potencialmente representado como um objeto. Um objeto no muito diferente de uma varivel normal. Quando se cria um objeto, esse objeto adquire um espao em memria para armazenar seu estado (os valores de seu conjunto de atributos, definidos pela classe) e um conjunto de operaes que podem ser aplicadas ao objeto (o conjunto de mtodos definidos pela classe). Um programa orientado por objetos composto por um conjunto de objetos que interagem atravs de "trocas de mensagens". Na prtica, essa troca de mensagem traduz-se na aplicao de mtodos a objetos.
Denilson / Anderson /Ana Paula 92
Criao de Objetos
A criao de um objeto feita pelo operador new.
new NomeDaClasse();
Essa expresso uma invocao do construtor, um mtodo especial que toda a classe oferece que indica o que deve ser feito na inicializao de um objeto. A aplicao do operador new ao construtor da classe retorna uma referncia para o objeto. Para que o objeto possa ser efetivamente manipulado, essa referncia deve ser armazenada por quem determinou a criao do objeto:
Manipulao de Objetos
A declarao de uma varivel cujo tipo uma classe no cria um objeto. Cria-se uma referncia para um objeto da classe, a qual inicialmente no faz referncia a nenhum objeto vlido. Exemplo:
String nome; nome
94
Manipulao de Objetos
Ao se criar um objeto, usando o operador new, obtm-se uma referncia vlida, que armazenada na varivel do tipo da classe. Exemplo (continuao):
nome = new String(Curso de Java); nome
Curso de Java
Outras informaes
Objeto
a varivel nome armazena uma referncia para o objeto cujo contedo Curso de Java.
95
Manipulao de Objetos
A varivel nome do exemplo anterior mantm apenas a referncia para o objeto e no o objeto em si. O operador = (atribuio) no cria outro objeto. Ele simplesmente atribui a referncia para o objeto. Exemplo (continuao):
String outroNome = nome; nome outroNome
Curso de Java
Outras informaes
96
Manipulao de Objetos
Para efetuar uma cpia de um objeto, criando um novo objeto com o mesmo contedo de um objeto j existente, necessrio usar o mtodo clone() da classe Object, da qual todos os objetos descendem. Exemplo (continuao):
String outraString = nome.clone(); nome outroNome outraString
Curso de Java
Outras informaes
Curso de Java
Outras informaes
Denilson / Anderson /Ana Paula 97
Manipulao de Objetos
O operador == para objetos compara apenas se os dois objetos tm a mesma referncia (apontam para o mesmo local).
Exemplo (continuao):
nome == outroNome // resulta true nome == outraString // resulta false outroNome == outraString // resulta false
Exemplo OO
public class PrimeiroProgramaOO { private int x; public void atribuiValor(int valor) { x = valor; } public int obtemValor() { return x; } public static void main (String[] args) { PrimeiroProgramaOO p = new PrimeiroProgramaOO(); p.atribuiValor(15); System.out.println(p.obtemValor()); } }
Denilson / Anderson /Ana Paula 99
Mtodos Construtores
Construtor um mtodo especial chamado quando um novo objeto criado pelo operador new(). Mtodos construtores possuem as seguintes caractersticas:
normalmente so mtodos pblicos; possuem o mesmo nome da classe; no possuem valor de retorno; podem ter parmetros; pode haver sobrecarga (overloading) de construtores; um construtor default sem parmetros gerado se nenhum construtor fornecido pelo implementador da classe. O construtor default inicializa todas os atributos da classe,
no inicializados explicitamente, com seus valores padro (nmeros com zero, objetos com nulo e booleanos com falso).
Denilson / Anderson /Ana Paula 100
Exemplo
public class Caixa { private double comprimento, largura, altura; public Caixa() { comprimento = 10; largura = 10; altura = 10; } public Caixa(double comp, double larg, double alt) { comprimento = comp; largura = larg; altura = alt; } public void setComprimento(double comp) { comprimento = comp; } public void setLargura(double larg) { largura = larg; } public double getLargura() { return largura; } public double volume() { return (comprimento * largura * altura); } public static void main(String[] args) { Caixa c1 = new Caixa(); System.out.println("Volume da caixa 1 = " + c1.volume()); // volume = 1000 Caixa c2 = new Caixa(10,5,3); System.out.println("Volume da caixa 2 = " + c2.volume()); // volume = 150 c2.setComprimento(8); c2.setLargura(c2.getLargura()-3); System.out.println("Novo volume da caixa 2 = " + c2.volume()); // volume = 48 } }
101
this
Suponha o seguinte cdigo:
Caixa c1 = new Caixa(); Caixa c2 = new Caixa(10,5,3); double v1 = c1.volume(); // v1 = 1000 double v2 = c2.volume(); // v2 = 150 Como que o mtodo volume sabe de qual objeto ele deve obter o tamanho?
this uma referncia implcita passada para os mtodos para referenciar o objeto corrente.
usada quando um mtodo precisa se referir ao objeto que o chamou; pode ser usada dentro de qualquer mtodo para se referir ao objeto corrente; pode ser usada sempre que uma referncia ao objeto for permitida.
Denilson / Anderson /Ana Paula 102
this
this usada principalmente em dois contextos:
diferenciar atributos de objetos de parmetros ou variveis locais de mesmo nome.
public class Caixa { private double comprimento, largura, altura; public Caixa(double comprimento, double largura, double altura) { this.comprimento = comprimento; this.largura = largura; this.altura = altura; } }
103
public String toString() { return nome + " " + salario + " " + anoContratacao() } }
Denilson / Anderson /Ana Paula 104
105
Finalizadores
Java no possui mtodos destrutores
A coleta de lixo automtica.
106
Finalizadores
Mtodo finalize()
usado quando o objeto precisar realizar alguma ao antes de ser destrudo. antes de liberar o objeto, o mtodo finalize() ser chamado.
protected void finalize() { // corpo do mtodo }
como a coleta de lixo no-determinstica no se tem certeza quando o mtodo finalize() ser executado.
107
Finalizadores
O programador no tem como atuar explicitamente na coleta de lixo. No entanto, o programador pode:
remover explicitamente a referncia a um objeto para sinalizar ao coletor de lixo que o objeto no mais necessrio e pode ser removido; sugerir (mas no forar) que o sistema execute o coletor de lixo (garbage collector) atravs da invocao ao mtodo gc() da classe java.lang.System.
public static void gc()
sugerir que o sistema execute os mtodos finalize() de objetos descartados atravs da invocao ao mtodo runFinalization() da classe java.lang.System.
public static void runFinalization()
Denilson / Anderson /Ana Paula 108
Atributos Estticos
Quando se cria objetos de uma determinada classe, cada objeto tem sua cpia separada dos atributos definidos para a classe. Em situaes em que necessrio que todos os objetos de uma classe compartilhem um mesmo atributo, semelhante ao que ocorre com variveis globais em linguagens de programao tradicional, deve-se definir o atributo como esttico. Neste caso, o atributo esttico funciona como uma varivel global da classe. Um atributo esttico declarado usando-se a palavra-chave static antes do nome do atributo.
Denilson / Anderson /Ana Paula 109
Atributos Estticos
public class QualStatic { private static int contEstatico = 0; private int contNaoEstatico = 0; public QualStatic(){ contEstatico++; contNaoEstatico++; } public void incContEstatico() { contEstatico++; } public void incContNaoEstatico() { contNaoEstatico++; } public int leContEstatico() { return contEstatico; } public int leContNaoEstatico() { return contNaoEstatico; }
Denilson / Anderson /Ana Paula 110
Atributos Estticos
public static void main (String[] args){ QualStatic obj1 = new QualStatic(); System.out.println("Cont Estatico obj1 = " + obj1.leContEstatico()); // 1 System.out.println("Cont Nao Estatico obj1 = " + obj1.leContNaoEstatico()); // 1 QualStatic obj2 = new QualStatic(); System.out.println("Cont Estatico obj1 = " + obj1.leContEstatico()); // 2 System.out.println("Cont Nao Estatico obj1 = " + obj1.leContNaoEstatico()); // 1 System.out.println("Cont Estatico obj2 = " + obj2.leContEstatico()); // 2 System.out.println("Cont Nao Estatico obj2 = " + obj2.leContNaoEstatico()); // 1 obj1.incContEstatico(); obj1.incContNaoEstatico(); System.out.println("Cont Estatico obj1 = " + obj1.leContEstatico()); // 3 System.out.println("Cont Nao Estatico obj1 = " + obj1.leContNaoEstatico()); // 2 System.out.println("Cont Estatico obj2 = " + obj2.leContEstatico()); // 3 System.out.println("Cont Nao Estatico obj2 = " + obj2.leContNaoEstatico()); // 1 } }
Denilson / Anderson /Ana Paula 111
Mtodos Estticos
Assim como atributos estticos, mtodos estticos no precisam de um objeto para serem ativados. Pode-se invocar diretamente um mtodo esttico sem necessidade de se criar um objeto. Por conseqncia, mtodos estticos:
s podem acessar dados estticos; no podem se referir a this; s podem chamar outros mtodos estticos.
Declarao
precedido da palavra-chave static. Exemplo:
public static double potencia(double x)
Denilson / Anderson /Ana Paula 112
Mtodos Estticos
Ativao:
NomeDaClasse.mtodo()
Exemplos:
todos os mtodos da classe java.lang.Math.
double cosseno = Math.cos(60); double valor = Math.sqrt(144);
mtodo main:
public static void main (String[] args) pode ser chamado antes de qualquer objeto existir. geralmente instancia um objeto aplicao para acessar atributos no estticos.
113
Reusabilidade
Uma das principais vantagens de orientao por objetos a facilidade de reuso de cdigo.
Pode-se criar novas classes a partir de classes existentes que foram criadas e depuradas por terceiros.
Reusabilidade a habilidade de elementos de software servirem a diferentes aplicaes. Outra caracterstica interessante de orientao por objetos a extensibilidade, que a facilidade de adaptar produtos de software a mudanas de especificao. O reuso de cdigo pode se dar por:
Composio; Herana.
Denilson / Anderson /Ana Paula 114
Reusabilidade
Composio
Objetos de classes j existentes so criados dentro de uma nova classe. A nova classe composta de objetos de classes existentes. H um reuso da funcionalidade do cdigo e no da sua forma.
Herana
Permite a criao de novas classes com propriedades adicionais a uma classe j existente. A nova classe herda as funcionalidades da classe j existente e adiciona novas funcionalidades. H um reuso da forma de uma classe.
Denilson / Anderson /Ana Paula 115
Composio
Exemplo:
Implementao de uma classe que descreve uma entidade Quadrado. Quadrado composto de pontos. Ponto uma entidade. Logo, quadrado construda atravs da composio de quatro entidades Ponto.
116
Composio
public class Ponto { private double x; // coordenada x private double y; // coordenada y public Ponto (double x, double y) { this.x = x; this.y = y; } Quadrado ... }
Ponto 1 4
public class Quadrado { private Ponto p1, p2, p3, p4; public Quadrado (Ponto p1, Ponto p2, Ponto p3, Ponto p4) { ... } ... }
Denilson / Anderson /Ana Paula 117
Composio
Composio denota relacionamentos todo/parte, onde o todo constitudo de partes.
Exemplo: relacionamento entre Banco e Agncia.
Banco 1 1..* Agncia
Banco o todo e os objetos Agncia so as partes. Os objetos Agncia no podem existir independentemente do objeto Banco. Se o banco for excludo (encerrar suas atividades) as agncias tambm sero excludas. O inverso no necessariamente verdadeiro.
Agregao
A Agregao por Referncia ou simplesmente Agregao tambm modela relacionamentos todo/parte (tem-um). Diferentemente da composio, os objetos em uma agregao podem existir independentemente uns dos outros.
Denota uma composio menos rigorosa. Exemplo: relacionamento entre Departamento e Localizao. Departa mento Localizao
1..* 1..*
Um departamento possui vrias localizaes, mas uma localizao pode pertencer a mais de um departamento e portanto no excluda se um departamento for excludo. Representada por um losango aberto do lado todo.
Denilson / Anderson /Ana Paula 119
Associao
A Associao indica que um objeto contm ou est conectado a outro objeto. Um objeto usa outro objeto.
Exemplo: relacionamento entre Funcionrio e Departamento, indicando que um funcionrio trabalha para um departamento e que em um departamento trabalham vrios funcionrios.
Funcionrio * trabalha_para 1 Departamento
Herana
Herana denota especializao. Herana permite a criao de novos tipos com propriedades adicionais ao tipo original. Em geral, se uma classe B estender (herdar) uma classe A, a classe B vai herdar mtodos e atributos da classe A e implementar alguns recursos a mais. Herana implementa o relacionamento -UM (IS-A). Exemplo: classes Pedido e PedidoExpresso
PedidoExpresso -UM Pedido PedidoExpresso uma especializao de Pedido. Estende Pedido. PedidoExpresso herda todas as definies (atributos e mtodos) j implementadas na classe Pedido.
Denilson / Anderson /Ana Paula 122
Herana
Exemplos:
Classes Mamfero e Cachorro
Cachorro -UM Mamfero
A classe herdeira chamada de subclasse (ou classe derivada) e a classe herdada chamada de superclasse (ou classe base).
Carro subclasse de Veculo Veculo superclasse de Carro Carro a classe derivada da classe base Veculo
Denilson / Anderson /Ana Paula 123
PedidoExpresso
Herana: PedidoExpresso -UM Pedido Composio: Pedido TEM-UM (tem vrios) Item Associao: Pedido est associado a um Cliente
Denilson / Anderson /Ana Paula 124
Herana
Sintaxe:
Palavra-chave extends. Utiliza-se na definio da subclasse a palavra-chave extends seguida pelo nome da super-classe. class SuperClasse { ... } class SubClasse extends SuperClasse { ... }
125
Classe Object
Object uma classe em Java da qual todas as outras derivam. Quando uma classe criada e no h nenhuma referncia a sua superclasse, implicitamente a classe criada derivada diretamente da classe Object.
Todos os objetos podem invocar os mtodos da classe Object.
Class getClass ()
Retorna a classe do objeto.
Object clone ()
copia o contedo de um objeto para outro (clone raso).
Denilson / Anderson /Ana Paula 126
128
super
super usado para invocar explicitamente o construtor da superclasse imediatamente superior. Exemplo:
class Ponto2D { private double x, y; public Ponto2D (double x, double y) { this.x = x; this.y = y } } class Ponto3D extends Ponto2D { private double z; public Ponto3D (double x, double y, double z) { super (x, y); this.z = z; } }
Denilson / Anderson /Ana Paula 129
super
A invocao do mtodo super(), se presente, deve estar na primeira linha. Se o mtodo super() no for usado, implicitamente o compilador faz a invocao do construtor super() default (sem argumentos) para cada construtor definido. sempre interessante ter o construtor default definido.
A invocao direta pode ser interessante quando se deseja invocar algum construtor que no o default, como no exemplo anterior.
Super tambm usado para acessar membros (atributos e mtodos) da superclasse imediatamente superior.
super.nomeDoAtributo ou super.nomeDoMtodo()
Denilson / Anderson /Ana Paula 130
public String toString() { return nome + " " + salario + " " + anoContratacao() } }
Denilson / Anderson /Ana Paula 132
Restries de Acesso
Restries de acesso especificam o quo acessvel um membro (atributo ou mtodo) de um objeto a partir de outros objetos. Existem 4 formas de restrio de acesso em Java:
public: o membro visvel (pode ser acessado) a todos os objetos; protected: o membro visvel dentro da prpria classe, dentro de suas subclasses e dentro do pacote ao qual a classe pertence; package: o membro visvel dentro da prpria classe e dentro do pacote ao qual a classe pertence. No se usa a palavra package: restrio default; private: o membro visvel somente dentro da prpria classe.
Denilson / Anderson /Ana Paula 134
Restries de Acesso
Especificador Classe Subclasse Pacote Mundo public X X X X protected X X X package X X private X Dicas: sempre mantenha os atributos privados. crie mtodos acessores (get) e modificadores (set) para os atributos visveis fora da classe
nem todos os atributos necessitam acessores e modificadores.
Denilson / Anderson /Ana Paula 135
Todos os mtodos na SuperClasse so herdados sem modificao na SubClasse. Todos os atributos que formam a SuperClasse formam tambm a SubClasse.
Denilson / Anderson /Ana Paula 136
Atributos Herdados
Subclasses podem adicionar novos atributos. Subclasses no podem remover atributos herdados. Subclasses podem criar atributos com os mesmos nomes dos atributos originais (herdados). Neste caso, os atributos originais so escondidos (shadow).
137
Mtodos Herdados
Subclasses podem adicionar novos mtodos. Subclasses no podem remover mtodos herdados. Subclasses podem redefinir (override) mtodos originais (herdados), usando a mesma assinatura. Subclasses no podem reduzir o nvel de acesso de mtodos herdados. O contrrio vlido.
Exemplo: de public para private. // incorreto de public para protected // incorreto de protected para private // incorreto de private para public // correto . . .
Denilson / Anderson /Ana Paula 138
Override X Shadowing
class SuperClasse { int i = 2; int getI() { return i; } } class SubClasse extends SuperClasse { int i = 1; int getI() { return i; } } public class OverrideShadowing { public static void main (String[] args) { SubClasse b = new SubClasse(); System.out.println(b.i); // 1 System.out.println(b.getI()); // 1 SuperClasse a = b; System.out.println(a.i); // 2 System.out.println(a.getI()); } // 1 }
Denilson / Anderson /Ana Paula 139
final
final uma palavra chave em Java que indica que um atributo, um mtodo ou uma classe no podem ser modificados ao longo do restante da hierarquia de descendentes. Atributos final so usados para definir constantes.
Apenas valores dos tipos primitivos podem ser usados para definir constantes. O valor definido na declarao ou nos construtores da classe, e no pode ser alterado. Exemplo: final double PI = 3.14; Para objetos e arranjos, apenas a referncia constante (o contedo do objeto ou arranjo pode ser modificado).
Denilson / Anderson /Ana Paula 140
final
Na lista de parmetros de um mtodo, final indica que o parmetro no pode ser modificado.
public void exemplo (final int par1, double par2) { ... }
par1 no pode ser modificado dentro do mtodo.
Para mtodo, final indica que o mtodo no pode ser redefinido em classes derivadas.
final public void exemplo () { ... }
mtodo exemplo no pode ser redefinido em classes herdeiras.
Polimorfismo
Polimorfismo significa muitas formas. Em termos de programao, significa que um nico nome de classe ou de mtodo pode ser usado para representar comportamentos diferentes dentro de uma hierarquia de classes. A deciso sobre qual comportamento utilizar tomada em tempo de execuo. As linguagens que suportam polimorfismo so chamadas de linguagens polimrficas. As que no suportam so chamadas de linguagens monomrficas. Nestas, cada nome vinculado estaticamente ao seu cdigo.
Denilson / Anderson /Ana Paula 142
Polimorfismo
Clientes podem ser implementados genericamente para chamar uma operao de um objeto sem saber o tipo do objeto. Se so criados novos objetos que suportam uma mesma operao, o cliente no precisa ser modificado para suportar o novo objeto. O polimorfismo permite que os clientes manipulem objetos em termos de sua superclasse comum. O polimorfismo torna a programao orientada por objetos eficaz, permitindo a escrita de cdigo genrico, fcil de manter e de estender.
143
public String toString() { return nome + " " + salario + " " + anoContratacao() } }
Denilson / Anderson /Ana Paula 145
Polimorfismo
Polimorfismo no exemplo anterior:
O objeto emps do tipo Empregado[], portanto uma posio do vetor pode receber um objeto do tipo Empregado ou do tipo Gerente (ou do tipo de qualquer subclasse de Empregado que venha a existir). O mtodo reajustaSalario() existe tanto na classe Empregado quanto na classe Gerente. No cdigo
for (int i = 0; i < 4; i++) { emps[i].reajustaSalario(5);
o compilador executa o cdigo de reajustaSalario() da classe Empregado se o objeto da posio emps[i] for do tipo Empregado ou o cdigo da classe Gerente se o objeto emps[i] for do tipo Gerente.
Denilson / Anderson /Ana Paula 148
Polimorfismo
Se no houvesse polimorfismo:
O vetor emps s receberia objetos do tipo Empregado e portanto em tempo de compilao j se saberia qual cdigo de reajustaSalario() seria executado. A classe GerenteTeste mudaria para:
... emps[0] = new Empregado("Jose Silva", 3200, new Day(1998,10,1)); emps[1] = new Empregado("Maria Oliveira", 1100, new Day(1997,12,15)); emps[2] = new Empregado("Joao Barros", 300, new Day(2003,3,15)); for (int i = 0; i < 3; i++) { emps[i].reajustaSalario(5); // executa cdigo da classe Empregado System.out.println(emps[i].toString()); } chefe.reajustaSalario(5); // executa cdigo da classe Gerente System.out.println(chefe.toString()); ...
Denilson / Anderson /Ana Paula 149
Polimorfismo
Considere o seguinte trecho de cdigo:
public class Empresa { private static final int MAXEMPS = 1000; private Empregado[] emps = new Empregado[MAXEMPS]; private numEmps = 0; // nmero de empregados na lista ... public void adicionaEmpregado (Empregado emp) { if (numEmps = MAXEMPS) return; // lista cheia emps[numEmps] = emp; numEmps++; } public void reajustaSalarios(double perc) { for (int i=0; i<numEmps; i++) emps[i].reajustaSalario(perc); } ... } Denilson / Anderson /Ana Paula
150
Polimorfismo
Com o uso de polimorfismo, o cdigo da classe Empresa genrico:
O mtodo adicionaEmpregado() pode receber como parmetro tanto um objeto do tipo Empregado quanto do tipo Gerente e adicion-lo lista emps que do tipo Empregado[]. O mtodo reajustaSalarios() chama o mtodo reajustaSalario() da classe Empregado ou da classe Gerente dependendo do tipo do objeto na posio emps[i]. Se for criada uma nova subclasse de Empregado, por exemplo, a classe Diretor, o cdigo da classe Empresa no precisaria ser modificado para inserir e reajustar salrios dos objetos do tipo Diretor.
Denilson / Anderson /Ana Paula 151
Polimorfismo
Se no houvesse polimorfismo, a classe Empresa seria algo do tipo:
public class Empresa { private Empregado[] emps = new Empregado[1000]; private Gerente[] gers = new Gerente[50]; ... public void adicionaEmpregado (Empregado emp) { . . . } public void adicionaGerente (Gerente ger) { . . . } public void reajustaSalariosEmps(double perc) { . . . } public void reajustaSalariosGers(double perc) { . . . } }
Se fosse criada a classe Diretor, a classe Empresa tambm deveria ser alterada, incluindo uma lista de diretores e mtodos para adicionar e reajustar salrios de diretores.
Denilson / Anderson /Ana Paula 152
Polimorfismo
O tipo de polimorfismo mostrado nos exemplos anteriores conhecido como Polimorfismo de Incluso ou Polimorfismo Puro. A Sobrecarga de mtodos tambm um tipo de polimorfismo (Polimorfismo ad-hoc). Ela permite que vrios mtodos tenham o mesmo nome, desde que o tipo e/ou o nmero de parmetros sejam diferentes. Exemplo: os mtodos da classe Math:
static static static static int max (int a, int b) long max (long a, long b) float max (float a, float b) double max (double a, double b)
Denilson / Anderson /Ana Paula 153
Polimorfismo
Se no houvesse sobrecarga cada mtodo teria de ter um nome diferente, mesmo tendo o mesmo significado. Exemplo:
static static static static int maxInt (int a, int b) long maxLong (long a, long b) float maxFloat (float a, float b) double maxDouble (double a, double b)
Com polimorfismo, pode-se chamar simplesmente max() e passar os parmetros. O compilador chamar o mtodo correto internamente.
154
Neste exemplo, o objeto chefe do tipo Gerente (subclasse) e o objeto emps do tipo Empregado[] (superclasse). Portanto a atribuio abaixo legal:
emps[0] = chefe // atribuio legal
resulta em erro, mesmo sendo o objeto emps[0] do tipo Gerente. Para converter novamente o objeto para sua classe original, usa-se a converso de tipo explcita (cast), semelhante ao que foi feito com a converso de tipos primitivos:
Gerente chefe2 = (Gerente) emps[0]; // legal ((Gerente) emps[0]).setNomeSecretaria(Patricia Ferreira); // legal
156
emps[1] no um Gerente! Pode-se fazer uma converso de tipo explcita somente dentro de uma hierarquia de classes.
Ponto2D p1 = (Ponto2D) emps[1]; // erro de compilao
157
158
As converses de tipo explcitas so usadas habitualmente com contineres como a classe Vector.
Ao ler o valor de um continer, seu tipo somente conhecido como o genrico Object e torna-se necessrio usar uma converso de tipo explcita para cas-lo com o tipo de objeto que foi colocado no recipiente.
Denilson / Anderson /Ana Paula 159
Classe Abstrata
Classe Abstrata uma classe que no pode ser instanciada, ou seja, no se pode criar objetos diretamente de uma classe abstrata.
abstract public class Exemplo { public static void main (String[] args) { Exemplo obj = new Exemplo(); // ERRO } }
abstract a palavra-chave em Java que indica que uma classe ou um mtodo no tem definio concreta. Classes abstratas correspondem a especificaes genricas, que devero ser concretizadas em classes derivadas.
Denilson / Anderson /Ana Paula 160
Classe Abstrata
FormaGeomet rica obtemArea()
Circulo
Triangulo
Classes abstratas devem possuir pelo menos uma subclasse para serem utilizveis. No exemplo acima, FormaGeometrica uma classe abstrata. Todos os objetos ou so crculos ou so tringulos, no existem instncias diretas de FormaGeometrica.
Denilson / Anderson /Ana Paula 161
Classe Abstrata
Um mtodo abstrato cria apenas uma declarao de um mtodo que dever ser implementado em uma classe derivada. um mtodo que s faz sentido para as subclasses.
Exemplo, o mtodo obtemArea() da classe FormaGeometrica um mtodo abstrato. S faz sentido obter rea de uma forma geomtrica concreta como um crculo ou um tringulo.
Classe com pelo menos um mtodo abstrato uma classe abstrata. Uma subclasse de uma classe abstrata permanece abstrata, mesmo no sendo declarada explicitamente, at que redefina e implemente todos os mtodos abstratos.
Denilson / Anderson /Ana Paula 162
Classe Abstrata
abstract public class FormaGeometrica { abstract public double obtemArea(); } public class Circulo extends FormaGeometrica { private double raio; ... public double obtemArea() { return Math.PI * Math.pow(raio,2); }} public class Triangulo extends FormaGeometrica { private double lado1, lado2, lado3; ... public double obtemArea() { double sp = (lado1 + lado2 + lado3) / 2; return Math.sqrt(sp*(sp-lado1)*(sp-lado2)*(sp-lado3)); }}
Denilson / Anderson /Ana Paula 163
165
emps[0] = new Empregado("Jose Silva", 3200, new Day(1998,10,1)); emps[1] = new Empregado("Maria Oliveira", 1100, new Day(1997,12,15)); emps[2] = new Empregado("Joao Barros", 300, new Day(2003,3,15));
ArrayAlg.shellSort(emps); for (int i = 0; i < emps.length; i++) System.out.println(emps[i]); } }
168
Herana Mltipla
No exemplo anterior, Empregado subclasse de Sortable. Suponha que Empregado seja tambm descendente de Pessoa. Ento tem-se a seguinte hierarquia:
Pessoa Sortable
Empregado
Neste caso, Empregado tem duas superclasses, o que caracteriza uma herana mltipla. Herana mltipla ocorre quando uma classe herda de mais de uma superclasse.
Denilson / Anderson /Ana Paula 169
Interface
Java no permite herana mltipla de classes, como no exemplo anterior. Java possui apenas um tipo restrito de herana mltipla, onde no mximo uma das superclasses uma classe e as outras so interfaces. Interface uma classe totalmente abstrata. uma classe que possui somente mtodos abstratos e constantes. Uma interface declarada usando-se a palavrachave interface. No se usa a palavra-chave abstract na declarao dos mtodos (todos os mtodos j so abstratos).
Denilson / Anderson /Ana Paula 170
Interface
Uma interface herdada usando-se a palavrachave implements ao invs de extends. Diz-se que a subclasse implementa a interface, ou seja, implementa os mtodos abstratos da interface. Na herana mltipla do exemplo anterior, tem-se:
public interface Sortable { public int compareTo (Sortable[] b); } public class Empregado extends Pessoa implements Sortable { . . . }
Interface
O exemplo anterior, de ordenao de empregados, pode ser mudado para interface da seguinte forma:
public interface Sortable { public int compareTo (Sortable[] b); } public class Empregado implements Sortable { . . . } /* As classes ArrayAlg e EmpregadoSortTeste no so alteradas */
Java j tem pronta uma interface de nome Comparable no pacote java.lang, equivalente a Sortable. Tambm, a classe Arrays do pacote java.util tem um mtodo de ordenao de nome sort.
Denilson / Anderson /Ana Paula 172
Entrada e Sada
Em Java, um objeto do qual se pode ler uma seqncia de bytes chamado de um fluxo de entrada (implementado pela classe abstrata InputStream). Um objeto no qual se pode escrever uma seqncia de bytes chamado de um fluxo de sada (implementado pela classe abstrata OutputStream). Esses objetos fonte e destino de seqncias de bytes so normalmente arquivos, mas tambm podem ser conexes de rede e mesmo blocos de memria.
vantagem dessa generalidade: informaes armazenadas em arquivos, por exemplo, so tratadas essencialmente da mesma forma que aquelas obtidas de uma conexo de rede.
Denilson / Anderson /Ana Paula 173
Entrada e Sada
Os dados, no final das contas, so armazenados como uma srie de bytes, mas pode-se pensar neles, em um nvel mais alto, como sendo uma seqncia de caracteres ou de objetos. Java fornece uma hierarquia de classes de entrada e sada cuja base so as classes InputStream e OutputStream. Pode-se manipular fluxos de diversos formatos: compactados, textos, registros de tamanho fixo com acesso aleatrio e objetos. A seguir, ser apresentada uma forma para se manipular fluxos de objetos usando o mecanismo de serializao de objetos.
Denilson / Anderson /Ana Paula 174
Fluxos de Objetos
Usando-se as classes ObjectOutputStream e ObjectInputStream pode-se gravar e ler objetos em um fluxo, de forma automtica, atravs de um mecanismo chamado serializao de objetos. Classe java.io.ObjectOutputStream: ObjectOutputStream (OutputStream saida)
cria um ObjectOutputStream de modo que se possa escrever objetos no OutputStream (fluxo de sada) especificado.
Fluxos de Objetos
Classe java.io.ObjectInputStream: ObjectInputStream (InputStream entrada)
cria um ObjectInputStream para ler informaes de objetos do InputStream (fluxo de entrada) especificado.
Object readObject ()
l um objeto do ObjectInputStream. Em particular, l a classe do objeto, a assinatura da classe e os valores dos campos no transientes e no estticos da classe e de todas as suas superclasses. Ele faz a desserializao para permitir que mltiplas referncias de objetos possam ser recuperadas.
Fluxos de Objetos
Classe java.io.FileOutputStream: FileOutputStream (String nome)
cria um novo fluxo de sada de arquivo especificado pela string nome. Os nomes de caminhos que no so absolutos so interpretados como relativos ao diretrio de trabalho. Ateno: apaga automaticamente qualquer arquivo existente com esse nome.
177
Fluxos de Objetos
Passos para salvar dados de um objeto: abra um objeto ObjectOutputStream
ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(empregado.dat);
Fluxos de Objetos
leia os objetos usando o mtodo readObject
Empregado e1 = (Empregado) in.readObject(); Gerente g1 = (Gerente) in.readObject(); os objetos so gravados como Object e podem ser convertidos para o seu tipo original usando cast. cada chamada de readObject() l um objeto na mesma ordem em que foram salvos.
Para que uma classe possa ser gravada e restaurada num fluxo de objetos necessrio que ela implemente a interface Serializable. Esta interface no tem mtodos, portanto no necessrio alterar nada na classe.
public class Empregado implements Serializable { . . . }
179
Fluxos de Objetos
Pode-se salvar/restaurar um array de objetos em uma nica operao:
Empregado[] emp = new Empregado[3];
. . .
out.writeObject(emp);
. . .
Ao salvar um objeto que contm outros objetos, os mesmos so gravados automaticamente. quando um objeto compartilhado por vrios outros objetos, somente uma cpia gravada.
a tcnica de serializao atribui um nmero de srie a cada objeto. Aps um objeto ser gravado, uma outra cpia compartilhada apenas recebe uma referncia ao nmero de srie j gravado anteriormente.
Denilson / Anderson /Ana Paula 180
Tratamento de Excees
Considere o seguinte trecho de cdigo:
public class Estoque { private int codProduto; private int qtdeEstoque; public void decrementaEstoque (int qtde) { qtdeEstoque = qtdeEstoque - qtde; } }
181
Tratamento de Excees
Opo 1: desconsiderar operao
public class Estoque { private int codProduto; private int qtdeEstoque; public void decrementaEstoque (int qtde) { if (qtdeEstoque >= qtde) qtdeEstoque = qtdeEstoque - qtde; } }
Problema:
No h como saber se a operao foi realizada. Nenhuma informao retornada ao cliente (outros mtodos da classe ou de outras classes).
Denilson / Anderson /Ana Paula 182
Tratamento de Excees
Opo 2: mostrar mensagem de erro
public class Estoque { private int codProduto; private int qtdeEstoque; public void decrementaEstoque (int qtde) { if (qtdeEstoque >= qtde) qtdeEstoque = qtdeEstoque - qtde; else System.out.println(Estoque Insuficiente!); } }
Problema:
Gera dependncia entre a classe e sua interface de usurio; No retorna informao ao cliente.
Denilson / Anderson /Ana Paula 183
Tratamento de Excees
Opo 3: retornar cdigo de erro
public class Estoque { private int codProduto; private int qtdeEstoque; public boolean decrementaEstoque (int qtde) { if (qtdeEstoque >= qtde) { qtdeEstoque = qtdeEstoque - qtde; return true; } else return false; } }
Problema:
Complica definio e uso do mtodo (clientes tm que fazer testes); Pior para mtodos que j retornam valores.
Denilson / Anderson /Ana Paula 184
Tratamento de Excees
Soluo:
Usar esquema de tratamento de excees.
Error
Exception
RunTimeExc eption
IOEx ception
185
Tratamento de Excees
Error
Descreve erros internos. Ex: falta de memria, disco cheio. No se deve lanar um objeto desse tipo. Pouco se pode fazer se um erro interno ocorre, alm de notificar o usurio e tentar finalizar o programa.
Exception
RunTimeException
Ocorre porque houve um erro de programao (culpa do programador). Ex: converso explcita de tipo (cast), acesso a elemento de array alm dos limites, acesso de apontador nulo.
Outras excees
Ex: tentar ler alm do final de um arquivo, tentar abrir URL incorreta.
Denilson / Anderson /Ana Paula 186
Tratamento de Excees
As excees que derivam da classe Error ou da classe RunTimeException so chamadas excees no verificadas. Todas as demais so chamadas verificadas. Um mtodo precisa declarar todas as excees verificadas que ele lana. Palavra-chave throws no cabealho.
public void gravaDados() throws IOException { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(rh.dat")); out.writeObject(funcionarios); out.close(); }
Se o mtodo no conseguir criar o arquivo ou gravar os dados, ocorrer uma exceo do tipo IOException, que dever ser tratada.
Denilson / Anderson /Ana Paula 187
Tratamento de Excees
A hierarquia de excees possui vrias classes para diversos tipos de excees que podem ser lanadas pelos programas. Para lanar uma exceo, use a palavra-chave throw.
public String lerDados (BufferedReader ent) throws EOFException { ... while ( . . . ) { if (ch == -1) if (n < compr) throw new EOFException(); }}
a classe EOFException sinaliza que ocorreu um fim de arquivo inesperado durante a entrada de dados.
Denilson / Anderson /Ana Paula 188
Tratamento de Excees
Como criar suas prprias classes de Exceo?
Um programa pode ter um problema que no est descrito adequadamente em nenhuma das classes de exceo padro. Para criar um classe de exceo basta deriv-la de Exception ou de uma classe descendente de Exception. habitual criar um construtor padro e um construtor que contenha uma mensagem detalhada. Construtores e um mtodo da classe Throwable:
Throwable() : constri um novo objeto sem mensagem detalhada. Throwable (String mensagem) : constri um novo objeto com a mensagem detalhada especificada. String getMessage() : obtm a mensagem detalhada do objeto Throwable.
Denilson / Anderson /Ana Paula 189
Tratamento de Excees
Criao de uma classe de exceo
public class EIException extends Exception { private int codProd; private int qtdeEst; public EIException () { super(Estoque Insuficiente!); } public EIException (int cod, int qtde) { super(Estoque Insuficiente!); codProd = cod; qtdeEst = qtde; } public int getCodProduto() { return codProd; } public int getQtdeEstoque() {return qtdeEst; } }
Denilson / Anderson /Ana Paula 190
Tratamento de Excees
Lanamento de uma exceo criada
public class Estoque { private int codProduto; private int qtdeEstoque; public void decrementaEstoque (int qtde) throws EIException { if (qtdeEstoque >= qtde) qtdeEstoque = qtdeEstoque - qtde; else throw new EIException(codProduto, qtdeEstoque); } }
191
Tratamento de Excees
Excees levantadas indiretamente tambm devem ser tratadas
public class Pedido { ... public void adicionaItem (Estoque est, int qtde) throws EIException { ... est.decrementaEstoque (qtde); ... } }
192
Tratamento de Excees
Se no se desejar criar uma classe de exceo prpria pode-se levantar uma exceo com uma mensagem personalizada atravs de uma classe prexistente
public class Estoque { private int codProduto; private int qtdeEstoque; public void decrementaEstoque (int qtde) throws Exception { if (qtdeEstoque >= qtde) qtdeEstoque = qtdeEstoque - qtde; else throw new Exception(Estoque Insuficiente!); }}
Mas lembre-se que a classe Exception muito genrica e captura qualquer exceo!
Denilson / Anderson /Ana Paula 193
Tratamento de Excees
Captura de excees
As excees devem ser capturadas e tratadas adequadamente. Se ocorrer uma exceo e esta no for capturada em nenhum lugar, o programa termina mostrando uma mensagem de erro. Para capturar uma exceo, especifica-se um bloco try catch finally (sendo catch e finally opcionais).
try { comando1; comando2; . . . comandon; } catch (TipoExceo1 e1) {tratamento de e1} catch (TipoExceo2 e2) {tratamento de e2} . . . catch (TipoExceon en) {tratamento de en} finally {finalizaes}
Denilson / Anderson /Ana Paula 194
Tratamento de Excees
Exemplo de captura de exceo
public class Interface { ... public void insereItemPedido { ... try { pedido.adicionaItem(est, qtde); } catch (EIException eie) { System.out.println(eie.getMessage()+ Produto: +eie.getCodProduto()+ Estoque: +eie.getQtdeEstoque()); } ... }
Denilson / Anderson /Ana Paula 195
Tratamento de Excees
Se o cdigo dentro do bloco try no lanar nenhuma exceo
o programa executa o cdigo dentro de try, pula a clusula catch, executa o cdigo dentro da clusula finally e o restante do cdigo.
Se qualquer parte do cdigo dentro do bloco try lanar uma exceo da classe especificada na clusula catch
o programa pula o restante do cdigo do bloco try a partir do ponto onde a exceo foi lanada, executa o cdigo da clusula catch correspondente e, ento, o cdigo da clusula finally. Se a clusula catch no lanar nenhuma exceo, o programa executa a primeira linha depois do bloco try. Seno, a exceo lanada de volta para o chamador do mtodo.
Denilson / Anderson /Ana Paula 196
Tratamento de Excees
Se cdigo dentro do bloco try lanar uma exceo que no capturada por nenhuma clusula catch
o programa pula o restante do cdigo do bloco try a partir do ponto onde a exceo foi lanada, executa o cdigo na clusula finally e lana a exceo de volta para o chamador do mtodo.
197
Tratamento de Excees
Para capturar mltiplas excees usam-se clusulas catch separadas, uma para cada
tipo de exceo.
Deve-se colocar as classes mais especficas primeiro.