Documente Academic
Documente Profesional
Documente Cultură
Conceitos e Tcnicas
Obtendo Java Conceitos Fundamentais Pacotes Operadores e Estruturas de Controle Tipos Bsicos Modificadores Semntica de Referncia Arranjos Composio de Objetos Passagem de Parmetros Herana Classes Abstratas Interfaces Polimorfismo Tratamento de Excees
Kecia Marques 2
Obtendo JAVA
Kecia Marques
Sun Microsystems
Java uma linguagem de programao orientada por objetos amplamente difundida. Foi desenvolvida pela Sun Microsystems por James Gosling.
Na linguagem Java, gerado um cdigo intermedirio, denominado bytecode, a ser interpretado e executado pela JVM (Java Virtual Machine). A vantagem disso o alto grau de portabilidade dos programas.
.java so os arquivos de cdigo fonte .class so os arquivos compilados, os bytecodes.
Kecia Marques
http://java.sun.com/developer/onlineTraining/
Deitel, H. M.; Deitel, P. J. Java - Como Programar. 6. ed. Prentice-Hall, 2005.
Kecia Marques
Conceitos Fundamentais
Kecia Marques
Classe
Uma classe um conceito OO que encapsula as abstraes de dados e procedimentos necessrios para descrever o contedo e o comportamento de alguma entidade do mundo real. Pressman, 2002. Uma classe a implementao do objeto, seus servios e propriedades destes servios. Uma classe corresponde a um TAD (tipo abstrato de dados)
Kecia Marques
TAD
TAD (Tipo abstrato de dados) a representao encapsulada de um tipo definido pelas suas operaes TAD e uma estrutura de programao na qual uma determinada estrutura de dados conhecida somente via as operaes realizadas sobre os seus elementos de dados, sem que se identifique como a estrutura codificada Staa, 2000 A programao orientada por objetos o resultado do uso da abstrao de dados no desenvolvimento de softwares
Kecia Marques
Objeto
Uma classe descreve uma categoria genrica. Um objeto uma instncia de uma classe. Uma instncia de uma classe uma estrutura de dados que representa um membro especfico da categoria. Exemplo: classe: Aluno so objetos da classes Aluno: Joo, Paulo, Slvia, Marina, Jurema, Felcio. Objeto uma estrutura computacional que representa um objeto do mundo real.
Kecia Marques 10
Kecia Marques
11
Um exemplo simples Conta Corrente Seja o contexto de automao bancria. Identificam-se as seguintes classes neste contexto: cliente, agncia, conta, conta corrente, conta poupana, dentre outras. A figura a seguir mostra a estrutura da classe ContaCorrente.
Kecia Marques 12
Kecia Marques
13
Kecia Marques
14
Kecia Marques
15
Kecia Marques
16
Criao de Objetos
1 ContaCorrente minhaConta; 2 minhaConta = new ContaCorrente(12345, 236);
A linha 1 cria uma rea na memria que uma referncia para um objeto da classe ContaCorrente.
minhaConta
Kecia Marques
17
Criao de Objetos
1 ContaCorrente minhaConta; 2 minhaConta = new ContaCorrente(12345, 236);
minhaConta
Kecia Marques
18
Kecia Marques
19
O mtodo depositar do objeto minhaConta invocado. Em outras palavras, enviada uma mensagem para o objeto minhaConta para que este realize a operao depositar.
Kecia Marques
20
Interface de Classe
Uma classe conhecida externamente por sua interface, que descreve os servios que ela fornece e como eles podem ser utilizados, ocultando a sua implementao. Os membros pblicos de uma classe constituem a sua interface. Informaes que fazem parte da interface da classe: nome da classe; assinatura dos construtores e mtodos pblicos da classe; atributos pblicos da classe.
Kecia Marques 21
Exerccio Para o exemplo de automao bancria citado anteriormente: a) Identifique os atributos e os mtodos das classes Cliente e Conta Poupana. b) Implemente a classe Cliente em Java.
Kecia Marques
22
Pacotes
Kecia Marques
23
Organizao de Classes Em Java classes so organizadas em pacotes. Um pacote um conjunto de classes relacionadas. A palavra package indica o pacote ao qual a classe pertence.
Kecia Marques 24
Kecia Marques
25
Organizao de Classes
Exemplo: o JUnit (uma biblioteca open source para realizar testes em software Java) possui os pacotes extensions, framework, runner e textui.
Kecia Marques
26
Organizao de Classes
Quando uma classe necessita utilizar uma outra classe que no esteja em seu pacote necessrio importar o pacote da classe a ser utilizada. Isso feito incluindo um comando import no incio do cdigo do arquivo .java. Exemplo: se quisermos utilizar a classe Date da API de Java, temos que importar o seu pacote.
import java.util.*;
Kecia Marques 27
Organizao de Classes
Cada ferramenta IDE tem uma estrutura particular para armazenar os arquivos de um projeto. Por exemplo, o Net Beans organiza os arquivos de acordo com a estrutura a seguir:
build: contm os arquivos bytecodes compilados (.class) organizados em pacotes dist: contm o arquivo .jar gerado nbprojetc: contm arquivos de configurao gerados pelo Net Beans. src: onde ficam os arquivos fontes (.java) organizados em pacotes
Kecia Marques 28
Organizao de Classes
Kecia Marques
29
Kecia Marques
30
Operadores
Algumas estruturas utilizadas em Java so muito semelhantes s de C/C++ Incio de fim de blocos so marcados com { } Os operadores utilizados em Java so basicamente os mesmos utilizados em C/C++: Aritmticos: + - / * % ++ -Relacionais: == != >= <= Atribuio: = Lgicos: && || !
Kecia Marques 31
Estruturas de controle
Estruturas de controle Condicional:
if (condio){ comandos; } if (condio){ comandos; } else{ comandos; }
Kecia Marques 32
Estruturas de controle
Escolha: switch (expresso){ case constante1: comandos; break; case constante2: comandos; break; ... default: comandos; }
Kecia Marques 33
Estruturas de controle
Repetio: while (condio){ comandos; } do{ comandos; } while (condio); for (inicializao; condio; passo){ comandos; }
Kecia Marques 34
Tipos Bsicos
Kecia Marques
35
Tipos Bsicos
Tipos bsicos de Java:
boolean: true ou false byte: inteiro de oito bits com sinal. short: inteiro de 16 bits com sinal. char: caracter de 16 bits int: inteiro de 32 bits com sinal. long: inteiro de 64 bits com sinal. float: valor em ponto flutuante de 32 bits double: valor em ponto flutuante de 64 bits
Kecia Marques
36
Wrappers (Empacotadoras)
Empacotadoras: h uma classe empacotadora para cada tipo primitivo em Java
boolean: Boolean byte: Byte short: Short char: Character int: Integer long: Long float: Float double: Double
Kecia Marques 37
Wrappers (Empacotadoras)
Servios das classes empacotadoras:
Contrutor: public Integer(int value) Integer numero = new Integer(5); Contrutor: public Integer(String s) Integer numero = new Integer(5); Se o valor passado estiver no formato incorreto, por exemplo uma letra, lanada uma exceo NumberFormatException.
Kecia Marques 38
Wrappers (Empacotadoras)
public static Integer valueOf(String s) Mtodo que retorna um objeto Integer que empacota um inteiro cujo valor dado por s. obj.intValue() Retorna um valor do tipo primitivo int empacotado pelo objeto obj, que do tipo Integer. public static int parseInt("5") Retorna um valor do tipo primitivo int que corresponde String passada. lanada uma exceo NumberFormatException se a String passada no for do formato de um nmero.
Kecia Marques 39
Wrappers (Empacotadoras)
public void testaWrapper(){ boolean b = true; byte bt = 5; char c = 'k'; short s = 10; long l = 50; int i = 20; float f = 3.4f; double d = 5.8; Boolean B = new Boolean(b); Byte BT = new Byte(bt); Character C = new Character(c); Short S = new Short(s); Long L = new Long(l); Integer I = new Integer(i); Float F = new Float(f); Double D = new Double(d);
Kecia Marques
40
Wrappers (Empacotadoras)
//imprime o valor inteiro armazenado em I System.out.println("Valor inteiro de I: " + I.intValue()); //imprime o valor inteiro armazenado em I2 Integer I2 = Integer.valueOf("700"); System.out.println("Valor inteiro de I2: " + I2.intValue()); //imprime o valor de i3 int i3 = Integer.parseInt("500"); System.out.println("Valor de i3: " + i3); try{ int i4 = Integer.parseInt("cinco"); System.out.println("Valor de i4: " + i4); } catch (NumberFormatException e){ System.out.println("Formato numrico invlido"); } }
Kecia Marques
41
Modificadores
Kecia Marques
42
Modificadores de Mtodos
Modificadores de Mtodos
abstract: mtodo abstrato, sem corpo. final: mtodo no pode ser redefinido. public: mtodo pode ser acessado por outras classes. private: mtodo s pode ser acessado pela prpria classe. protected: mtodo pode ser acessado por classes dentro do mesmo pacote ou pelas subclasses. static: mtodo compartilhado por todos os objetos da classe, com acesso a apenas campos estticos.
Kecia Marques 43
Modificadores de Atributos
Modificadores de Atributos
final: atributo uma constante. public: atributo pode ser acessado por outras classes. private: atributo s pode ser acessado pela prpria classe. protected: atributo pode ser acessado por classes dentro do mesmo pacote ou pelas subclasses. static: atributo compartilhado por todos os objetos da classe.
Kecia Marques
44
Semntica de Referncia
Kecia Marques
45
Semntica de Referncia
Em Java no h ponteiros. Java implementa semntica de referncia. A declarao de um objeto de uma classe C cria uma referncia para um objeto da classe C. C obj; Um objeto criado deve ser associado a uma referncia. obj = new C();
Kecia Marques
46
Semntica de Referncia
A atribuio de uma referncia b a outra a, resulta em a e b referenciando o mesmo objeto.
a = new C(); b = new C(); a = b;
a aps executar a=b b b a
Kecia Marques
47
Semntica de Referncia
O que ocorre com o objeto para o qual no h mais referncia? Java possui o Coletor de Lixo (Garbage Collector) que elimina objetos pendentes na memria de tempos em tempos.
Kecia Marques
48
Exerccio Analise o programa a seguir, escrito em Java e formado pelas classes Principal e ClasseMaluca. O que ele imprime?
Kecia Marques
49
Exerccio
public class ClasseMaluca { private int dado1; private int dado2; public ClasseMaluca(int d1, int d2) { dado1 = d1; dado2 = d2; } public int getDado1(){ return (dado1); } public int getDado2(){ return (dado2); } }
Kecia Marques
50
Exerccio
public class Principal { public static void main (String[] args) { ClasseMaluca objA, objB; objA = new ClasseMaluca(10,20); objB = new ClasseMaluca(50,100); System.out.println(objA.getDado1() + " " + objA.getDado2()); System.out.println(objB.getDado1() + " " + objB.getDado2()); objA = new ClasseMaluca(30,60); System.out.println(objA.getDado1() + " " + objA.getDado2()); objB = objA; System.out.println(objB.getDado1() + " " + objB.getDado2()); } }
Kecia Marques
51
Arranjos
Kecia Marques
52
Kecia Marques
54
Arranjos
No caso de arranjo de objetos, cada posio do arranjo deve ser criada para ser ento utilizada. a = new A[4]; a[0] = new A(5,9,8); a[3] = new A(11,23,5);
a 0 1 2 3
Kecia Marques
55
Arranjos
public static void exemploArranjo(){ int[] a = new int[10], b; int c[], d; b = new int[10]; c = new int[5]; // d = new int[3]; Este comando d erro de compilao // porque d no arranjo a[0] = 10; a[9] = 20; // a[10] = 5; Este comando gera a exceo // ArrayIndexOutOfBoundsException for (int i=0; i < a.length; i++) System.out.print(a[i] + " - ");
Kecia Marques
56
Arranjos
A[] vetorObjetos = new A[5]; vetorObjetos[1] = new A(1,2,3); vetorObjetos[1].ImprimeValores(); // vetorObjetos[2].ImprimeValores(); // Este comando gera a exceo NullPointerException }
Kecia Marques
57
Composio de Objetos
Kecia Marques
58
Composio de Objetos
Uma classe pode possuir um membro de dado que seja um objeto de outra classe. Esse tipo de relacionamento chamado composio. Exemplos:
Um Crculo possui um Ponto como centro. Uma Conta Corrente de um Cliente. Uma Turma tem um Professor. Uma Turma tem muitos Alunos.
Kecia Marques 59
Classe Ponto
public class Ponto { private float x, y; public Ponto(float x, float y){ this.x = x; this.y = y; } public void alterarX(float x){ this.x = x; } public void alterarY(float y){ this.y = y; } public float obterX(){ return x; } public float obterY(){ return y; } }
Kecia Marques 60
Classe Circulo
public class Circulo { private float raio; private Ponto centro; public Circulo(float x, float y, float r){ raio = r; centro = new Ponto(x,y); } public void alterarCentro(float x, float y){ centro.alterarX(x); centro.alterarY(y); } public void alterarRaio(float r){ raio = r; } public float obterCentroX(){ return centro.obterX(); }
Kecia Marques
61
Classe Circulo
public float obterCentroY(){ return centro.obterY(); } public float obterRaio(){ return raio; } }
Kecia Marques
62
Classe Aplicacao
import java.util.Scanner;
public class Aplicacao { public static void main(String[] args){ float x, y, raio; Circulo circ; Scanner in = new Scanner (System.in); System.out.println("Digite as coordenadas do centro: "); x = in.nextFloat(); y = in.nextFloat(); System.out.println("Digite o raio: "); raio = in.nextFloat(); circ = new Circulo (x, y, raio); System.out.println("Circulo criado: "); System.out.println("Raio: " + circ.obterRaio()); System.out.println("Centro: (" + circ.obterCentroX() + ", " + circ.obterCentroY() + ")."); System.out.println(""); } }
Kecia Marques 63
Passagem de Parmetros
Kecia Marques
64
Passagem de parmetros
Em Java a passagem de parmetros para mtodos se d sempre por valor. No existe passagem de parmetro por referncia em Java. O que ocorre quando um objeto passado por parmetro?
Kecia Marques
65
Passagem de parmetros
Quando um objeto passado por parmetro, na verdade a sua referncia est sendo passada por parmetro. Alteraes realizadas no objeto dentro do mtodo tem impacto no argumento passado para o mtodo. Por exemplo, se o objeto a for passado como parmetro para um mtodo m(A x) e em m ocorrer alguma alterao em x (enquanto este estiver referenciando o mesmo objeto que a), aps a execuo de m, a estar com as alteraes sofridas por x.
Kecia Marques 66
Passagem de parmetros
Exemplo: considerando as classes Ponto e Circulo mostradas anteriormente, o que a classe Aplicao a seguir gera como sada para entradas 1, 1 e 2?
Kecia Marques
67
Classe Aplicao
public class Aplicacao { public static void alteraCirculo(Circulo c){ c.alterarCentro(10, 20); c.alterarRaio(5); System.out.println("\n\n**Dados do circulo dentro do mtodo: **"); System.out.println("Raio: " + c.obterRaio()); System.out.println("Centro: (" + c.obterCentroX() + ", " + c.obterCentroY() + ")."); c = new Circulo(3,3,9); System.out.println("\n\n**Dados do novo circulo dentro do mtodo: **"); System.out.println("Raio: " + c.obterRaio()); System.out.println("Centro: (" + c.obterCentroX() + ", " + c.obterCentroY() + ")."); }
Kecia Marques
68
Classe Aplicao
public static void main(String[] args){ float x, y, raio; Circulo circ; Scanner in = new Scanner (System.in); System.out.println("Digite as coordenadas do centro: "); x = in.nextFloat(); y = in.nextFloat(); System.out.println("Digite o raio: "); raio = in.nextFloat(); circ = new Circulo (x, y, raio); System.out.println("Circulo criado: "); System.out.println("Raio: " + circ.obterRaio()); System.out.println("Centro: (" + circ.obterCentroX() + ", " + circ.obterCentroY() + ")."); //Passando objeto circ como parmetro alteraCirculo(circ);
Kecia Marques
69
Classe Aplicao
System.out.println("\n**Circulo aps execuo do mtodo: **"); System.out.println("Raio: " + circ.obterRaio()); System.out.println("Centro: (" + circ.obterCentroX() + ", " + circ.obterCentroY() + ")."); System.out.println(""); } } Circulo criado: Raio: 2.0 Centro: (1.0, 1.0). **Dados do circulo dentro do mtodo: ** Raio: 5.0 Centro: (10.0, 20.0). **Dados do novo circulo dentro do mtodo: ** Raio: 9.0 Centro: (3.0, 3.0). **Circulo aps execuo do mtodo: ** Raio: 5.0 Centro: (10.0, 20.0).
Kecia Marques
70
O mtodo que recebe o arranjo como parmetro deve indicar isso na sua lista de parmetros.
void metodo(int b[])
Kecia Marques
71
Kecia Marques
72
Classe Aplicao
public class TesteArranjo { public static void alteraArranjo(int b[]){ for(int i=0; i<b.length; i++){ b[i] = i*2; } System.out.println(\n**Arranjo b**"); for (int valor : b) System.out.print(valor + " - ");
b = new int[3]; System.out.println("\n**Novo arranjo b**"); for (int valor : b) System.out.print(valor + " - "); }
Kecia Marques
73
Classe Aplicao
public static void main(String[] args){ int[] a = {1,2,3,4,5};
System.out.println("\n**Arranjo a antes da chamada do mtodo**"); for (int valor : a) System.out.print(valor + " - "); alteraArranjo(a); System.out.println("\n**Arranjo a aps a chamada do mtodo**"); for (int valor : a) System.out.print(valor + " - "); } }
Kecia Marques
74
Classe Aplicao
**Arranjo a antes da chamada do mtodo** 1-2-3-4-5 **Arranjo b** 0-2-4-6-8**Novo arranjo b** 0-0-0**Arranjo a aps a chamada do mtodo** 0-2-4-6-8-
Kecia Marques
75
Herana
Kecia Marques
76
Herana
Herana um recurso que permite que novas classes sejam definidas a partir de classes j definidas. Na hierarquia de classes:
Super classes (ou ascendente): so as ascendentes de um classe. Sub classes (ou descendente): so as descendentes de um classe Classe me: a ascendente direta de um classe Classe filha: a descendente direta de uma classe.
Kecia Marques 77
Herana
No exemplo:
Filha descendente ou subclasse de Me e Av. Me e Av so ascendentes ou superclasses de Filha Me descendente ou subclasse de Av. Me filha de Av.
Significa que:
Me herda caractersticas e comportamentos de Av. Filha herda caractersticas e comportamentos de Me e de Av.
Kecia Marques 78
Herana
No exemplo:
Conta superclasse de Conta Corrente e de Conta Poupana. Conta Corrente e Conta Poupana so subclasses de Conta.
Kecia Marques
79
Kecia Marques
80
Herana
Kecia Marques
81
Herana
No exemplo:
Conta Corrente possui como atributos: nmero, saldo e limite, pois herda os dois primeiros da classe Conta. Conta Corrente possui como mtodos: criar, depositar, sacar, consultarSaldo, obterNumero, e consultarSaldoTotal, consultarLimite e alterarLimite, sendo que os cinco primeiros so herdados de Conta.
Kecia Marques
82
Herana
No exemplo:
Conta Poupana possui como atributos: nmero, saldo e rendimento, pois herda os dois primeiros da classe Conta. Conta Poupana possui como mtodos: criar, depositar, sacar, consultarSaldo , obterNumero e atualizarRendimentos , sendo que, os cinco primeiros so herdados de Conta.
Kecia Marques 83
Kecia Marques
84
Herana
public class A { protected int x, y; private int z; public A(int a, int b, int c) { x = a; y = b; z = c; } public int obterX(){ return (x); } public int obterY(){ return (y); }
Kecia Marques 85
Herana
public int obterZ(){ return (z); } public void alterarX(int a){ x = a; } public void alterarY(int a){ y = a; } public void alterarZ(int a){ z = a; }
Kecia Marques
86
Herana
public void ImprimeValores(){ System.out.println("O valor de X : " + x); System.out.println("O valor de Y : " + y); System.out.println("O valor de Z : " + z); }
}
public class B extends A{ private int k; public B(int a, int b, int c, int d){ super (a,b,c); k = d; }
Kecia Marques
87
Herana
public void ImprimeValores(){ System.out.println("O valor de X : " + x); System.out.println("O valor de Y : " + y); System.out.println("O valor de K : " + k); System.out.println("Z no pertence a esta classe"); System.out.println("O valor de Z da superclasse : " + obterZ()); } }
Kecia Marques
88
Herana
public class TesteHeranca { public static void main (String[] args){ B obj1 = new B(10,20,30,40); obj1.ImprimeValores(); obj1.alterarY(100); obj1.ImprimeValores(); } }
Kecia Marques
89
Herana O exemplo de cdigo a seguir mostra a implementao das classes Conta e ContaCorrente em Java. mostrada tambm uma classe MainBanco para exemplificar o uso das classes criadas.
Kecia Marques
90
Herana
public class Conta { long numero; double saldo; public Conta(long n) { numero = n; saldo = 0; } public void depositar(double v){ if (v > 0) saldo = saldo + v; }
Kecia Marques 91
Herana
public boolean sacar(double v){ if ( (v > 0) && (saldo-v) >= 0){ saldo = saldo - v; return true; } else return false; } public double consultarSaldo(){ return(saldo); }
Kecia Marques
92
Herana
public long obterNumero(){ return(numero); } } // Fim da classe Conta public class ContaCorrente extends Conta{ double limite; public ContaCorrente(long n, double l) { super(n); limite = l; }
Kecia Marques
93
Herana
public void alterarLimite(double l){ if (l > 0) limite = l; } public double consultarLimite(){ return limite; }
Kecia Marques
94
Herana
public boolean sacar(double v){ if ((v > 0) && (saldo + limite - v ) >= 0){ saldo = saldo - v; return true; } else return false; } public double consultarSaldoTotal(){ return(saldo + limite); } } // Fim da classe Conta Corrente.
Kecia Marques
95
Herana
public class MainBanco { public static void main (String[] args){ ContaCorrente minhaConta; minhaConta = new ContaCorrente(12345, 300); System.out.println("Numero da Conta: " + minhaConta.obterNumero()); System.out.println("Saldo: " + minhaConta.consultarSaldo());
Kecia Marques
96
Herana
minhaConta.alterarLimite(200); System.out.println("Limite: " + minhaConta.consultarLimite()); System.out.println("Saldo Total: " + minhaConta.consultarSaldoTotal());
minhaConta.depositar(300); System.out.println("Saldo aps depsito: " + minhaConta.consultarSaldo()); System.out.println("Saldo total aps depsito: " + minhaConta.consultarSaldoTotal());
Kecia Marques
97
Herana
if (minhaConta.sacar(200)) { System.out.println("Saldo aps saque: " + minhaConta.consultarSaldo()); System.out.println("Saldo total aps saque: " + minhaConta.consultarSaldoTotal()); } else System.out.println("No foi possvel realizar operao. Saldo total disponvel de " + minhaConta.consultarSaldoTotal());
Kecia Marques
98
Herana
if (minhaConta.sacar(700)) { System.out.println("Saldo total aps saque: " + minhaConta.consultarSaldoTotal()); } else System.out.println("No foi possvel realizar operao. Saldo total disponvel de " + minhaConta.consultarSaldoTotal()); } }//Fim da classe MainBanco
Kecia Marques 99
Herana Herana prov reuso de classes j construdas. Alguns benefcios do uso de herana:
evitar duplicao de cdigo; reso de cdigo; manuteno mais fcil (desde que no haja abuso do recurso); extensibilidade.
Kecia Marques 100
Herana Exerccio:
Implemente a classe ContaPoupana. Altere a classe MainBanco para criar e realizar operaes sobre a classe ContaPoupana que voc criou. Pesquise: para que servem as seguintes palavras reservadas de Java: protected, public, private, static, final.
Kecia Marques 101
Classes Abstratas
Kecia Marques
102
Classes Abstratas
A linguagem Java possui o recurso de criao de classes abstratas. Caractersticas de uma classe abstrata:
designada pela palavra chave abstract.
abstract class FiguraGeometrica{...}
objetos de classes abstratas no podem ser criados. pode haver hierarquias de classes abstratas.
Kecia Marques 103
Classes Abstratas Propsito de uso de classes abstratas: fornecer uma superclasse apropriada da qual outras classes possam herdar interface e/ou implementao. As classes herdeiras de uma classe abstrata so denominadas classes concretas.
Kecia Marques
104
Interface
Kecia Marques
105
Interface
Interface de Java um recurso que permite especificar os servios de uma classe. interface Forma {...} Uma interface declara: mtodos pblicos sem definio de corpo (mtodos no podem ser estticos); campos pblicos, estticos e finais. Objetos no podem ser criados diretamente a partir de uma interface.
Kecia Marques 106
Exemplo
Classes que implementam uma interface devem implementar todos os mtodos daquela interface e todos eles devem ser pblicos. class Circulo implements Forma {...} Uma interface pode ser implementada por vrias classes. Uma classe pode implementar vrias interfaces. Interface um caso especial de classe abstrata.
Kecia Marques
107
Polimorfismo
Kecia Marques
108
Polimorfismo
Verificao de Tipos: atividade que garante que os operandos utilizados com um operador sejam de tipos compatveis. Tipo Compatvel: um tipo cujos valores so adequados para a realizao da operao designada pelo operador ou que pode ser convertido implicitamente em um tipo cujos valores sejam adequados.
Varejo, 2004.
Kecia Marques
109
Polimorfismo
LP fracamente tipada: somente parte dos erros de tipos so verificados. Ex.: C. Em C, um ponteiro para float pode acessar um posio de memria ocupada por um char, por exemplo. LP fortemente tipada: realizam uma verificao extremamente ampla de tipos. Ex.: Java
Kecia Marques
110
Polimorfismo
Polimorfismo a caracterstica que possibilita a criao de cdigo capaz de operar sobre valores distintos. Por exemplo, onde se espera um dado de um tipo de X, possvel receber um dado de um tipo Y. Polimorfismo = muitas formas
Kecia Marques
111
Polimorfismo
Coerso: a converso implcita de tipos. Quando um operao realizada sobre um operando de tipo diferente do esperado, o compilador verifica se possvel realizar a converso. Por exemplo, em C, um valor char pode ser convertido implicitamente para um valor int.
int a; char c = k; a = c;
Kecia Marques 112
Polimorfismo
Sobrecarga (ou Overloading): um identificador ou operador sobrecarregado quando pode ser utilizado para designar duas ou mais operaes distintas. Ex.: O operador + em Java.
int a, b; a = 10; b = a + 20; System.out.println(Resutaldo = + b );
Polimorfismo
Incluso: o polimorfismo decorrente de herana. Um subtipo S de um tipo T formado por um subconjunto dos valores de T. Assim, todo valor de S deve ser tambm um valor de T.
Kecia Marques
114
Polimorfismo
Ex.: Considere as classes A e B do exemplo de herana dado anteriormente. A classe a seguir exemplifica uma situao polimrfica.
Kecia Marques
115
Polimorfismo
Exemplo 1) public class TesteHeranca { public static void main (String[] args){ B obj1 = new B(10,20,30,40); A obj2 = new A (200, 300, 400); testePolimorfismo(obj2); testePolimorfismo(obj1); } public static void testePolimorfismo(A obj){ obj.ImprimeValores(); } }
Kecia Marques
116
Polimorfismo
O programa anterior imprime:
O valor de X : 200 O valor de Y : 300 O valor de Z : 400 O valor de X : 10 O valor de Y : 20 O valor de K : 40 Z no pertence a esta classe O valor de Z da superclasse : 30
Kecia Marques
117
Tratamento de Excees
Kecia Marques
118
Tratamento de Excees
Conceito Ausncia de mecanismos para excees em LP Mecanismos para excees em LP Lanamento de Excees Tratamento de Excees Propagao de Excees Relanamento de Excees Continuao aps o Tratamento de Excees
Kecia Marques
119
Conceito
Robustez: a capacidade de um software continuar em operao corretamente mesmo em condies anormais. Problemas: Como prevenir-se de erros em tempo de execuo? Como contornar situaes anormais? Exemplos de situaes anormais: diviso por zero, fim de arquivo, overflow, utilizao de um objeto no inicializado, acesso a um ndice invlido de um vetor.
Kecia Marques 120
Conceito
Exceo:
um evento ocorrido durante a execuo de um programa que desvia o fluxo normal de instrues. uma condio provocada por uma situao excepcional que requer uma ao especfica imediata. Varejo, 2004.
Kecia Marques 121
Conseqncias:
Programas menos confiveis. Programas com legibilidade prejudicada.
Kecia Marques
125
Kecia Marques
126
Lanamento de Excees
O lanamento (ou sinalizao) de excees pode ser realizado:
Automaticamente: o prprio mecanismo de exceo o responsvel pelo lanamento da exceo. Esta situao pode surgir em qualquer ponto do programa passvel de ocorrncia de situao anormal.
Kecia Marques
127
Lanamento de Excees
Explicitamente: o programador realiza o lanamento de uma exceo. O exemplo a seguir mostra um lanamento explcito de exceo em Java. Para tal, empregase a palavra reservada throw.
try{
throw new Exception(); }
Kecia Marques
128
Tratamento de Excees
Tratadores de excees so trechos de cdigos responsveis por tomar atitudes em resposta ocorrncia de uma exceo. Em Java: os comandos do bloco try so os tratados; os comandos das clusulas catch correspondem ao tratamento das excees ocorridas no bloco try correspondente;
Kecia Marques 129
Tratamento de Excees
podem ser includas vrias clusulas catch aps o try; a cada catch corresponde um classe de excees.
Kecia Marques
130
Tratamento de Excees
Ex.:
... String n, d; ... try{ int num = Integer.valueOf(n).intValue(); int den = Integer.valueOf(d).intValue(); int div = num / den; } catch(NumberFormatException x){ System.out.println(Erro na formatao.); }
Kecia Marques
131
Tratamento de Excees
catch(ArithmeticException y){ System.out.println(Diviso por zero); } catch(Exception z){ System.out.println(Ocorreu um erro durante a operao); }
No exemplo: a clusula catch(NumberFormatException x) captura excees de formato de nmeros. O comando dentro do bloco deste catch o tratamento dado a este tipo de exceo.
Kecia Marques
132
Tratamento de Excees
a clusula catch(ArithmeticException y) captura excees de ocorridas em operaes aritmticas. Neste caso, serve para tratar divises por zero. O comando dentro do bloco deste catch o tratamento dado a este tipo de exceo. a clusula catch(Exception z) captura qualquer tipo de excees de ocorridas dentro do bloco try. O comando dentro do bloco deste catch o tratamento genrico dado a qualquer outra exceo que ocorra dentro do bloco try, que no sejam dos tipos ArithmeticException ou NumberFormatException.
Kecia Marques
133
Propagao de Excees
Quando um exceo ocorre, busca-se pela clusula catch associada ao seu tipo. A sequncia para realizar esta busca a que aparece no cdigo. Quando um exceo no tratada no bloco em que ocorreu, ela retornada para o bloco mais externo. No caso de chamadas de mtodos, retornada para o mtodo chamador.
Kecia Marques 134
Propagao de Excees
Se o bloco ou mtodo para o qual a exceo foi retornada no fizer o seu tratamento, ela retornada para o bloco (ou mtodo chamador) mais externo a este. Se a exceo chegar ao mtodo principal sem que seja tratada, o programa abortado.
Kecia Marques
135
Relanamento de Excees
Em algumas situaes, pode ser necessrio que o local onde ocorreu a exceo a trate de maneira parcial, deixando o restante de seu tratamento para um dos blocos mais externo (ou para um dos mtodos na seqncia de chamada). Neste caso, utiliza-se o recurso de relanamento de excees.
Kecia Marques
136
Relanamento de Excees
Ex.:
... try{ try{ ... throw new IOException(); ... } catch(IOException e){ ... //tratamento parcial da exceo e throw e; //relanamento da exceo e } } catch(IOException e){ ...// restante do tratamento da exceo. }
Kecia Marques 137
Kecia Marques
138
Kecia Marques
139
A clusula finally de Java prov este recurso. Em geral, este recurso utilizado quando deseja-se restabelecer o estado de algum objeto de forma independente da ocorrncia e da propagao de excees. Por exemplo, quando deseja-se encerrar conexes com banco de dados ou fechar arquivos quando ocorrer uma exceo qualquer.
Kecia Marques 140
Kecia Marques
141
Kecia Marques
142
Kecia Marques
143
No exemplo, os comandos das duas clusulas finally sero executadas, assim como os comandos da clusula catch.
Kecia Marques 144
Bibliografia
Barnes, David e Klling, M. Programao Orientada a Objetos com Java. So Paulo: Pearson Prentice Hall, 2004. Bigonha, R. S. e Bigonha, M. A. S. Programao Modular. Apostila. Belo Horizonte: DCC-UFMG, 2001. Deitel, H. M.; Deitel, P. J. Java - Como Programar. 6. ed. PrenticeHall, 2005. HORSTMANN,CAY. Big Java. Bookman, 2004. HORSTMANN, C.; Cornell, G. Core Java 2: Fundamentos - vol. 1 . 7.ed. Alta Books. 2005.
Kecia Marques 145