Vous êtes sur la page 1sur 27

AUTOR: CESAR AUGUSTO TACLA CRIAO: 5/3/2009 11:16 LT.

ALTERAO: 22/9/2009 09:09

UNIVERSIDADE TECNOLGICA FEDERAL DO PARAN

PR

REVISO PROGRAMAO ORIENTADA A OBJETOS UTILIZANDO JAVA

Prof. Cesar Augusto Tacla


Departamento Acadmico de Informtica ht t p : / / w w w . d ai nf . c ef et pr . br / ~ t ac l a

O uso e reproduo desta apostila requerem autorizao expressa do autor.

SUMRIO
1 2 OBJETO ........................................................................................ 4 CLASSE ......................................................................................... 4 2.1 Atributos ......................................................................................5 2.2 Mtodos........................................................................................5 2.3 Encapsulamento ..............................................................................5 2.4 Construtores ..................................................................................6 2.5 Membros de Classe e de Instncia.........................................................6 2.6 Escopo de Variveis..........................................................................7 HERANA ...................................................................................... 8 3.1 POLIMORFISMO ...............................................................................9
3.1.1 3.1.2 3.1.3 Sobrecarga ...................................................................................................................................... 9 Sobreposio/Reescrita (override) ................................................................................................ 10 Princpio da substituio ............................................................................................................... 11

4 5

CLASSES ABSTRATAS ....................................................................... 11 4.1 CLASSES DE INTERFACE ................................................................... 11 VISIBILIDADE DE CLASSES, MTODOS E ATRIBUTOS .................................. 12 5.1 Pacotes ...................................................................................... 12 5.2 Visibilidade ................................................................................. 13 CLASSES ANINHADAS ....................................................................... 14 6.1 Classe interna .............................................................................. 15 6.2 Classes aninhadas Estticas .............................................................. 16 6.3 Classes aninhadas locais e annimas ................................................... 16 DICAS DE PROGRAMAO .................................................................... 17 7.1 Caractersticas desejveis para um projeto de software ............................ 17 TRATAMENTO DE EXCEES EM JAVA .................................................. 18 8.1 Exceo ...................................................................................... 18 8.2 Tipos de exceo........................................................................... 18 8.3 Tratar Excees ............................................................................ 19 8.4 Lanar Excees............................................................................ 19 EXERCCIOS .................................................................................. 21

7 8

1 OBJETO
Um objeto representa uma entidade concreta (ex. produto em estoque) ou abstrata (transao bancria, histrico, taxa de juros) do mundo real. Tambm pode ser algo necessrio ao funcionamento do sistema sem uma ligao forte com uma entidade do mundo real. Um objeto num sistema possui trs propriedades: Estado: definido pelo conjunto de propriedades do objeto (os atributos) e de suas relaes com os outros objetos, muda com o tempo. Ex. objeto turma pode estar aberta ou fechada passa ao estado fechada quando 10 alunos fizerem a inscrio. Comportamento: como um objeto responde s solicitaes dos outros e tudo mais o que um objeto capaz de fazer. implementado por um conjunto de operaes. Ex. objeto turma pode ter operaes acrescentar aluno ou suprimir aluno. Identidade: significa que cada objeto nico no sistema. Por exemplo, o objeto turma Tecno-OO manh diferente do objeto Tecno-OO tarde.

objeto : classe

Tecno-OO manh :Turma

Tecno-OO tarde : Turma


.
Figura 1. Notao de objeto em UML

2 CLASSE
Uma classe uma descrio de um conjunto de objetos com propriedades, comportamento, relacionamentos e semntica comuns. Uma classe pode ser vista como um esqueleto/modelo para criar objetos. Exemplo: classe turma Atributos: sala, horrio Operaes: obter local, adicionar estudante, obter horrio Dicas Classes devem encerrar uma s abstrao do mundo real. Por exemplo, uma classe estudante contendo tambm o histrico do estudante no boa. Melhor dividi-las em duas: estudante e histrico estudante. Utilize substantivos para nomear as classes Podem-se suprimir os atributos e os mtodos deixando somente os compartimentos.

Em UML, classes abstratas so grafadas em itlico

<<esteretipo>> Turma atributos mtodos


Figura 2. Notao UML para classe.

2.1

Atributos

Sintaxe para declarao de um atributo em UML: [<visibilidade>]<nome>[<multiplicidade>]:[<tipo>][=<valor inicial>] <visibilidade>: + = pblico - = privada, somente mtodos da classe podem acess-lo # = protegido, mtodos da classe e das classes derivadas podem acess-lo ~ = pacote, mtodos das classes presentes no mesmo pacote podem acess-lo <nome>: nome do atributo <multiplicidade>: por exemplo, valores[5] ou matriz[4, 6] <tipo>: Pode-se utilizar os tipos da linguagem de implementao. Por exemplo, char, float ou int. <valor inicial>: valor inicial para o atributo que respeite o tipo de dado.

Exemplos - nome[30]: char - sexo: char=f + cdigo: int=20

2.2

Mtodos

Sintaxe para declarao de um atributo em UML: [<visibilidade>]<nome>(<lista argumentos>):[<tipo>] <visibilidade>: + pblico - privada, somente mtodos da classe podem acess-lo # protegido, mtodos da classe e das classes derivadas podem acess-lo ~ pacote, mtodos de classes presentes no mesmo pacote podem acess-lo <nome>: nome do mtodo <lista de argumentos>: (<nome_argumento>:<tipo>, ..., <nome_argumento><tipo>). Por exemplo, (nome:String, idade: int) <tipo>: Tipo do dado retornado. Pode-se utilizar os tipos da linguagem de implementao. Por exemplo, char, float ou int.

Exemplos - calcularIdadeEmMeses(Data data_nasc): int +moverPara(x:int, y:int):void

2.3

Encapsulamento

Encapsular num s objeto atributos (dados) e operaes permite esconder os detalhes internos de funcionamento do objeto. Podemos definir, por exemplo, que os atributos no so visveis (privados) e que certos mtodos os modificam. Tambm, podemos definir que somente alguns dos mtodos dos objetos de uma classe so visveis (mtodos pblicos), os demais seriam para o funcionamento interno do objeto.

2.4

Construtores

So mtodos especiais que servem para criar uma instncia de uma classe. Pode haver vrios mtodos construtores variando-se os argumentos (polimorfismo por sobrecarga). Por exemplo, uma classe crculo pode oferecer trs modos de instanciao: um, pelo centro e raio, por circunscrio e inscrio num quadrado cuja diagonal uma reta de x1, y1 a x2, y2 como ilustra a figura 3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import java.lang.Math.*; class Circulo { public float xCentro; public float yCentro; public float raio; // Construtora centro + raio Circulo (float x, float y, float r) { xCentro = x; yCentro = y; raio = r; } // Construtora para crculo inscrito num quadrado // assume que abs de x2 maior que abs de x1 Circulo (float x1, float y1, float x2, float y2) { xCentro = (x1 + x2)/2; yCentro = (y1 + y2)/2; raio = Math.abs(x2 - x1)/2; } // Construtora para crculo circunscrito num quadrado // assume que abs de x2 maior que abs de x1 Circulo (float x11, float y11, float x22, float y22) { xCentro = (x11 + x22)/2; yCentro = (y11 + y22)/2; raio = Math.abs(x22 - x11)/2; } // outros mtodos aqui ... }

Figura 3: exemplo de utilizao de vrias construtoras.

2.5

Membros de Classe e de Instncia

Atributos membros de classe so comuns a todos os objetos instncias de uma mesma classe, ou seja, um atributo esttico nico para todos os objetos instncias de uma classe. Um mtodo esttico tambm um membro de classe e pode ser executado sem que haja um objeto instanciado. Por exemplo, os mtodos da classe Math da API Java so todos statics (java.lang.Math, http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html). Na Figura 13, observe que nas chamadas aos mtodos Math.pow e Math.sqrt no h objeto instanciado. Um mtodo esttico no pode chamar um mtodo no-esttico da mesma classe. De outra forma, um mtodo de classe no pode chamar um mtodo de instncia, pois no h objeto instanciado. Um mtodo de classe tambm no pode fazer referncias a atributos de instncia pelo mesmo motivo. Por exemplo, na Figura 4, o compilador acusa o seguinte erro na linha 9: non-static method imprimir() cannot be referenced from static context.
30 31 32 33 34 35 36 37 38 39 40 public class ImprimirStrings { String str = atributo-nao-estatico; public void imprimir() { String a = new String(abcdef); String b = new String(xyz); System.out.println(a.concat(b)); } public static void main(String[] args) { imprimir(); } }

Figura 4. Mtodos e atributos no-estticos no podem ser referenciados em contextos estticos.

Se fizermos referncia ao atributo no-esttico str no mtodo main ou no imprimir obtermos o seguinte erro de compilao: non-static variable str cannot be referenced from static context. Podemos fazer referncia a mtodos e atributos no estticos de outros objetos. No devemos abusar de mtodos estticos porque um programa que utiliza somente mtodos de classe no orientado a objetos (no h objetos). A Figura 5 mostra um exemplo adicional de mtodo esttico e a Tabela 1 resume o vocabulrio do assunto.
1 2 3 4 5 6 7 8 9 10 public class Circle { static final double PI = 3.14159; public static double calculaArea(double raio) { return PI * ( raio * raio ); } } // um mtodo qualquer ... double circleArea = Circle.calculaArea(5); // utilizamos o nome da classe

Figura 5: exemplo de mtodo esttico. TABELA 1:VOCABULRIO DE MTODOS E ATRIBUTOS ESTTICOS

Mtodo Atributo

De classe um mtodo static, no necessita de objeto para ser chamado. um atributo static, existe um s para todos os objetos da classe.

De instncia um mtodo no static, necessita de objeto para ser chamado. um atributo static, h uma cpia para cada objeto instanciado.

2.6

Escopo de Variveis

As variveis existem somente dentro do bloco em que foram definidas, sendo que um bloco delimitado por chaves. Na figura 6, temos os seguintes escopos:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

num: atributo de instncia existe em todos os mtodos da classe (chaves pretas); res: atributo de instncia existe em todos os mtodos da classe (chaves pretas); n: argumento do mtodo calcular; existe da linha 5 a 17 (chaves vermelhas); res: varivel auxiliar declarada na linha 8; existe da linha 8 a 17 (chaves azuis); i: varivel auxiliar do for; existe nas linhas 9 e 10
public class Fatorial { private int num = 0; private int res = 1; // ltimo nmero calculado // ltimo resultado obtido

public int calcular(int n) { if (n == num) return res; else { int res = 1; for (int i=n; i>0; i--) res = i * res; // guarda resultado this.res = res; num = n; return res; } } }

Figura 6: escopo de variveis (JexemploEscopoVariaveis). Sombreamento. Quando um argumento ou uma varivel de um mtodo possui nome idntico a um atributo (varivel res na figura 6) ento preciso utilizar a palavra reservada this para fazer referncia ao atributo. Isto chamado de sombreamento ou ocultao do atributo pela varivel de mtodo.

3 HERANA
um mecanismo tpico de OO para definir classes que compartilham definies de mtodos e de atributos. Isto feito quando classes apresentam parte do comportamento e da descrio de estado similares e parte especfica. Por exemplo, num editor grfico trabalhamos com duas formas geomtricas: polgonos regulares e crculos. Polgonos e crculos tm parte do comportamento similar, podemos mov-los, redesenh-los, calcular rea e permetro, e parte especfica, polgonos podem ser rotacionados enquanto que crculos no necessitam deste comportamento. Polgonos podem ser descritos da mesma forma: nmero de lados, tamanho do lado, raio da circunferncia inscrita (aptema) e centro do polgono. Embora os crculos tenham centro e raio, no possuem nmero de lados nem tamanho do lado. No exemplo em questo, temos uma classe base denominada forma geomtrica. Uma classe derivada herda mtodos e atributos da classe base. Portanto, as classes polgono e crculo herdam os mtodos e atributos definidos na classe base. Uma classe derivada pode ser a classe base de outra, constituindo assim uma relao de hierarquia entre as classes. Por exemplo, a classe polgono pode ser base de uma classe retngulo, tringulo e outras. Esta tcnica diminui os esforos de codificao assim como a quantidade de cdigo, pois operaes comuns s classes so definidas uma s vez.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 class Ponto { public double x; public double y; Ponto(double x, double y) { this.x = x; this.y = y; } public double calcularDist(Ponto p) { return (Math.sqrt(Math.pow(p.x - x, 2.0) + Math.pow(p.y - y, 2.0))); } } class Circulo extends FormaGeometrica { Circulo(Ponto c, double r) { centro = c; raio = r; } public double CalcularArea() { return (Math.PI * Math.pow(raio, 2)); } public double CalcularPerimetro(){ return (2 * Math.PI * raio); } public void Redesenhar() { // no implementada System.out.println("figura redesenhada"); } } class Poligono extends FormaGeometrica { public int numLados; public double tamLado; public double angRotacao=0; Poligono(int n, double tam, Ponto c, double r) { numLados = n; tamLado = tam; centro = c; raio = r; } public double CalcularPerimetro() { return (numLados * tamLado); } public double CalcularArea() { return (raio * CalcularPerimetro() / 2); } public double Rotacionar(double incremento) { angRotacao = Math.IEEEremainder(angRotacao+incremento, 360.0); return angRotacao; }

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

public void Redesenhar() { // no implementada System.out.println("figura redesenhada"); } } public abstract class FormaGeometrica { public Ponto centro; public Double raio; // para polgonos, o raio inscrito (aptema) public abstract double CalcularArea(); public abstract double CalcularPerimetro(); public abstract void Redesenhar(); public void moverPara(Ponto novoCentro) { centro = novoCentro; Redesenhar(); } }

Figura 7: Exemplo de herana.

A representao em UML do exemplo acima fica:

Figura 8: representao de herana em UML polgono e crculo so classes derivadas de FormaGeomtrica.

Herana mltipla. No h herana mltipla em Java (uma classe deriva de duas ou mais classes base que no sejam de interface), mas podemos simul-la utilizando classes com o modificador interface. Construtores. Mtodos construtores no so herdados pelas classes derivadas, mas um construtor de uma classe base chamado implicitamente antes da primeira linha do construtor da classe derivada. Super. possvel chamar um mtodo tal qual foi definido na classe base utilizando a sintaxe: super.<mtodo>(<lista argumentos>) . Se utilizar somente super(<lista argumentos>) ento chama-se a construtura da classe base (esta ltima opo s pode ser utilizada na primeira linha de um mtodo construtor).

3.1

POLIMORFISMO

Mtodos podem ser redefinidos de duas maneiras: pela mudana de seus argumentos (sobrecarga) ou por sobreposio/reescrita do corpo presevando a mesma assinatura.

3.1.1 Sobrecarga
So mtodos com mesmo nome, mas com assinaturas diferentes (lista de argumentos diferentes). A sobrecarga pode ocorrer numa mesma classe ou entre classe derivada e classe base. Em Java, se dois mtodos tiverem mesmo nome e mesmos argumentos diferindo apenas no valor de retorno ocorre um erro de compilao. A figura 9 mostra um exemplo correto de sobrecarga (Somador) e outro incorreto

(AoQuadrado). Na classe AoQuadrado o compilador aponta que o mtodo elevarQuadrado(float) j foi definido na classe.
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 public class Somador { public int somar(int a, int b) { return a+b; } public int somar(float a, float b) { return a+b; } } public class AoQuadrado { public float elevarQuadrado(float a) { return a*a; } public double elevarQuadrado(float a) { return (double)a*a; } }

Figura 9: Exemplos de sobrecarga de mtodos (correto e incorreto) JExemploPolimorfismoSobrecarga.

3.1.2 Sobreposio/Reescrita (override)


A sobreposio ocorre quando um mtodo de uma classe base reescrito na classe derivada. O mtodo reescrito tem a mesma assinatura que o mtodo da classe base. Assinatura significa mesmo nome, mesma lista de argumentos e mesmo valor retornado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class ClienteEspecial extends Cliente { ClienteEspecial(double desc) { desconto = desc; } // Sobreposio do mtodo calcularDesconto da classe base Cliente public double calcularDesconto(double valor) { return valor * desconto; } } public class Cliente { protected double desconto=0.1; // 10% public double calcularDesconto(double valor) { if (valor > 500) return valor * desconto; else return 0.0; } public static void main(String args[]) { Cliente cli[] = {new Cliente(), new ClienteEspecial(0.15)};

// cli[0] // cli[1]

for (int i=0; i < 2; i++) System.out.println(cli[i].calcularDesconto(100)); } }

Figura 10: Exemplo de sobreposio de mtodo (JExemploPolimorfismoSobreposicao). Restries sobreposio. Alguns mtodos no podem ser sobrepostos em funo dos modificadores que recebem:

final: um mtodo final nunca muda, todas as classes derivadas utilizam a mesma implementao. As chamadas aos mtodos finais so resolvidas em tempo de compilao (vinculao esttica). Static: implicitamente um mtodo final. private: so implicitamente finais, porque no podem ser sobrescritos nas classes derivadas (embora seja possvel escrever um mtodo com mesma assinatura numa classe derivada).

10

3.1.3 Princpio da substituio


Um objeto de uma classe derivada tratado como se fosse objeto da classe base. Observe que no mtodo main (figura 10) so criadas duas instncias de cliente, um normal outro especial. As duas instncias so colocadas num vetor da classe Cliente, i.e., o cliente especial tratado como se fosse um objeto da classe Cliente todas as vezes em que for referenciado por meio da varivel cli[1]. Late Binding (vinculao ou associao dinmica). A pergunta que se faz : qual o mtodo calcularDesconto ser chamado para a instncia armazenada em cli[1]? O mtodo da classe Cliente ou da classe ClienteEspecial? A resposta : o mtodo da classe ClienteEspecial. Em tempo de execuo, o tipo real do objeto armazenado na varivel (cli[1]) determina o mtodo a ser chamado. Isto chamado de late binding, ou seja, associao dinmica.

4 CLASSES ABSTRATAS
Classe abstrata. No admite instncias, no pode ser instanciada. Normalmente so classes bases que contm atributos e comportamentos comuns s classes derivadas. Mtodo abstrato. Um mtodo abstrato apenas uma declarao significando que ele dever ser implementado numa classe derivada concreta (figura 11). Se isto no for feito, a classe derivada deve ser declarada como abstrata. No podem ser declarados como mtodos abstratos: Mtodos construtores: os construtores no so herdados, logo um mtodo construtor abstrato nunca seria implementado. Mtodos static: mtodos static no podem ser sobrepostos pelas classes derivadas, logo um mtodo static abstrato nunca seria implementado.

1 2 3 4 5 6 7 8 9 10 11 abstract class Veiculo { public int cavalos; public abstract double calcularIPVA(); public abstract static void incrementarVeiculos(); // erro: combinao ilegal public abstract Veiculo(); // erro: modificador abstract no permitido } class Carro extends Veiculo { public double calcularIPVA() { return (cavalos * 100); } }

Figura 11: Exemplo de mtodo abstrato.

4.1

CLASSES DE INTERFACE

Uma classe de interface define um contrato que deve ser seguido pelas classes que a implementam. Uma classe interface uma classe abstrata onde todos os mtodos so implicitamente abstratos e pblicos e todos os atributos so implicitamente pblicos, estticos e finais.
Dica: ao tentar colocar visibilidade private ou protected nos atributos e mtodos numa classe interface o compilador acusar erro visibilidade no pemitida.

A palavra-chave final pode ser associada a um mtodo ou atributo. Se for associada a um mtodo, indica que ele no pode ser redefinido. Se for associada a um atributo, indica que seu valor no pode ser modificado depois de ser inicializado. A inicializao de um atributo final pode ser feita na sua declarao ou num mtodo construtor. A Figura 12 ilustra um exemplo de utilizao de uma classe interface.

11

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

interface IPVA { // definimos algumas constantes (implicitamente so static final e declaramos // um mtodo abstrado calcular IPVA Boolean CARRO_PASSEIO = true, CARRO_UTILITARIO = false; double CTE_UTILITARIO = 0.75, CTE_PASSEIO = 1.0; double VALOR_BASE = 500.00; public double calcularIPVA(); } class Carro implements IPVA { Boolean tipoCarro=CARRO_PASSEIO; String placa = new String("ABC1010"); public double calcularIPVA() { if (tipoCarro==CARRO_PASSEIO) return VALOR_BASE * CTE_PASSEIO; else return VALOR_BASE * CTE_UTILITARIO; } } class Caminhao implements IPVA { String placa = new String("CCC1010"); public double calcularIPVA() { return 2 * VALOR_BASE * CTE_UTILITARIO; } } public class ExemplificarInterface { // A classe IPVA homogeiniza a execuo do mtodo calcularIPVA. Aqui no // sabemos se o objeto um carro ou um caminhao, mas como ambas as classes // so obrigadas a implementar o mtodo em questo podemos cham-lo sem // conhecer a classe do objeto. public static void main(String args[]) { IPVA veiculos[] = {new Carro(), new Caminhao()}; for (int i=0; i < veiculos.length; i++) System.out.println(veiculos[i].calcularIPVA()); } }

Figura 12 : exemplo de classe interface para definir mtodos abstratos. Observe que classes do tipo interface podem ser utilizadas para definir constantes (linhas 4-9, Figura 12). Note tambm a aplicao do princpio da substituio na linha 35, uma instncia da classe carro (classe derivada) referenciada como sendo um objeto de IPVA (classe base). O mesmo vale para o caminho.

Runnable e Serializable so classes de interface bem conhecidas da API JAVA

5 VISIBILIDADE DE CLASSES, MTODOS E ATRIBUTOS


Pode-se aplicar os seguintes modificadores de visibilidade a classes, mtodos e atributos: pblico, protegido, privado e default (de pacote ou friendly). Os trs primeiros devem ser definidos explicitamente e default implcito. Nem todos podem ser aplicados indistintamente s classes, mtodos e atributos. Por exemplo, o modificador protegido (protected) no aplicvel a classes. Antes de estud-los em maior profundidade, necessrio conhecermos o conceito de pacotes.

5.1

Pacotes

Servem para organizar o cdigo, por exemplo, agrupar classes correlatas. Vamos supor uma classe ponto pertencente ao pacote formas. A classe ponto internamente nomeada por formas.ponto. Assim se voc estiver utilizando numa aplicao pacotes desenvolvidos por pessoas (empresas) diferentes, h menos risco de haver coincidncia de nomes de classes. Declarao java: package formas; Se voc no declarar o pacote, a classe pertence automaticamente ao pacote default que o diretrio corrente.

12

Para incluir um pacote num cdigo faz-se: import formas.*; //inclui todas as classes definidas no pacote formas import formas.ponto; // inclui uma classe especfica

5.2

Visibilidade

Pode ser aplicada s classes, atributos e mtodos. Se nada for definido pelo programador (default), as visibilidades destes elementos so restritas aos membros que fazem parte do mesmo pacote (os pacotes podem ser vistos como diretrios). A visibilidade pblica modifica a visibilidade default, permitindo que todos os membros do mesmo pacote ou de outros pacotes enxerguem o que for pblico.

Arquivo .java: pode conter somente uma classe pblica que deve ter o mesmo nome que o arquivo. As demais classes (friends) de um arquivo .java possuem a visibilidade padro (pacote). Public: todos os objetos do mesmo ou de outros pacotes podem enxergar classes, atributos ou mtodos pblicos. Protected: atributos protected tm visibilidade restrita prpria classe e s classes derivadas. Objetos de classes do mesmo pacote tambm enxergam atributos protegidos. Private: atributos e mtodos private so visveis pelas instncias de uma mesma classe. Instncias de uma classe derivada no conseguem acessar os atributos e mtodos definidos como private na classe base. Exemplo:
// Testar visibilidade privada de mtodos e atributos class Ponto { // esta classe s visvel neste pacote private double x; private double y; Ponto(double x, double y) { this.x = x; this.y = y; } private double obterX() { return x; } public double calcularDist(Ponto p) { // O objeto que executa este mtodo pode acessar os atributos privados x e y // do objeto passado como argumento, pois so instncias da mesma classe. return (Math.sqrt(Math.pow(p.x - x, 2.0) + Math.pow(p.y - y, 2.0))); } } public class FormasGraficas { public static void criarPontos() { Ponto ptoA = new Ponto(2, -6); Ponto ptoB = new Ponto(5, -2); System.out.println("distancia=" + ptoA.calcularDist(ptoB)); // Se a linha abaixo for includa, o erro de compilao seguinte ocorre: // x has private access in Ponto // System.out.println("Coordenada x:"+ptoA.x); } public static void main(String[] args) { criarPontos(); } }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Figura 13: Exemplo de atributo privado.

Visibilidade e Herana
Os membros de uma classe base quando herdados por uma classe derivada, levam consigo a visibilidade. Assim, se um atributo ou mtodo pblico na classe base tambm o ser na derivada. O compilador acusa erro de sintaxe se tentarmos sobrescrever um mtodo com um modificador de acesso mais restrito que o original.

13

Visibilidade e Construtoras
Construtoras podem receber modificadores de visibilidade. Se uma construtora for definida como private ento a classe deve ter um mtodo esttico pblico que permita criar instncias. Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 // Testar visibilidade privada de mtodos construtores public class Semaforo { private int estado; private String[]={vermelho, verde, amarelo}; private Semaforo() { estado = 0; } public static Semaforo instanciar() { return (new Semaforo()); } }

6 CLASSES ANINHADAS
Em Java, possvel codificar classes dentro de outras classes. Estas classes podem ser static ou no static. Classes no estticas aninhadas so denominadas classes internas como ilustra a figura 14.
1 2 3 4 5 6 7 8 9 class Externa { ... class Interna { ... } class static AninhadaEstatica { ... } }

Figura 14: classes aninhadas Restries:


Classes externas somente podem ter visibilidade de pacote (default) ou pblica Classes internas so membros de classe e como tal podem ser pblicas, protegidas, privadas ou de pacote. Classes aninhadas estticas, assim como os mtodos estticos, no podem referenciar diretamente variveis ou mtodos de instncia da classe externa. Uma classe esttica aninhada funciona exatamente como outra qualquer no aninhada. S colocada dentro de outra por razes de encapsulamento.

TABELA 2: COMPARAO ENTRE CLASSE ANINHADA E ANINHADA STATIC.

Interna (no static) Necessrio instanciar objeto da classe externa? Classe interna tem acesso a atributos e mtodos de instncia da classe externa? Um objeto da classe interna tem implicitamente uma referncia ao objeto da sua classe externa? SIM SIM

Aninhada Static NO NO

SIM

NO (no h objeto)

14

6.1

Classe interna

A figura 15 mostra um exemplo de uma classe aninhada interna. A classe Ponto interna classe JLinha. Observar que dentro da classe Ponto possvel acessar o atributo idLinha (privado em JLinha) sem referncia a um objeto JLinha.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class JLinha { private static int totLinha=0; private int idLinha; protected Ponto pt1; protected Ponto pt2; public JLinha(int x1, int y1, int x2, int y2) { idLinha = ++totLinha; pt1 = new Ponto(x1, y1); pt2 = new Ponto(x2, y2); } public JLinha() { idLinha = ++totLinha; } public class Ponto { protected int x; protected int y; protected this.x this.y } protected return } Ponto(int x, int y) { = x; = y; String pontoStr() { "(" + x + ", " + y + ")";

protected String pontoStrComId(){ return "Linha " + idLinha + " " + pontoStr(); } } }

Figura 15: Exemplo de classe aninhada interna: Ponto. A figura 16 mostra duas formas de se instanciar uma classe interna. Na primeira, a construtora da classe externa realiza a instanciao da classe interna. Na segunda forma, a instanciao feita fora da classe externa. Observar que a chamada de new est atrelada a existncia de um objeto da classe Linha armazenado em l2 j que um objeto de uma classe interna existe somente associado a uma instncia da classe externa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class JMain { public static void main(String args[]) { // duas formas de instanciar pontos // Forma 1: a construtora de linha instancia dois pontos JLinha l1 = new JLinha(5, 15, 7, 17); System.out.println(l1.pt1.pontoStr() + " " + l1.pt2.pontoStr()); // Forma 2: instancia-se linha e depois os pontos JLinha l2 = new JLinha(); JLinha.Ponto p1 = l2.new Ponto(10, 10); JLinha.Ponto p2 = l2.new Ponto(20, 20); l2.pt1 = p1; l2.pt2 = p2; System.out.println(l2.pt1.pontoStrComId() + " " + l2.pt2.pontoStrComId()); } }

Figura 16: Exemplo de utilizao de classe aninhada interna. Uma aplicao tpica de classes internas a navegao por iterator (classe interna) em um conjunto de objetos ou de tipos primitivos armazenados em um array na classe externa. Um exemplo disso pode ser visto em http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html.

15

6.2

Classes aninhadas Estticas

Classes aninhadas estticas podem ser bastante teis para testes. O exemplo seguinte ilustra esta aplicao para testes de limites de uma classe que simula o funcionamento de um radar de velocidade. O radar aplica multas para velocidades superiores a 10% da velocidade mxima para a qual foi configurado. Aps compilar o cdigo da figura 17, so geradas os arquivos JRadar.classe e JRadar$TesteJRadar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 // // // // // JAVARepositorio\JRevisaoOO\JExemClasseAninhadaEstaticaRadar Este programa demonstra como utilizar uma classe aninhada estatica para testar uma classe. Depois da fase de testes a classe aninhada pode ser desprezada. Para executar fazer: java -cp . JRadar$TesteJRadar

public class JRadar { private int velocidadeMaxima; public JRadar(int v) { velocidadeMaxima = v; } public Boolean multar(int v) { // multar return true qdo a velocidade detectada pelo // radar excede em 10% a velocidade maxima; if (v > (velocidadeMaxima * 1.1)) return true; else return false; } public static class TesteJRadar{ public static void main(String args[]) { JRadar r[] = {new JRadar(40), new JRadar(60), new JRadar(110)}; int v[] = {44, 67, 110}; Boolean res[]={false, true, false}; for (int i=0; i < r.length; i++) { if (r[i].multar(v[i]) == res[i]) System.out.println("OK"); else System.out.println("ERRO: radar " + i); } } } }

Figura 17: Exemplo de classe aninhada esttica.

6.3

Classes aninhadas locais e annimas

H outros dois tipos de classes aninhadas:


Local: criada no corpo de um mtodo Annima: criada no corpo de um mtodo sem nome de classe, bastante utilizada em tratamento de eventos de interface grfica. A forma de instanciao ligeiramente diferente. Observar na figura 18, linha 3, a instanciao de uma classe annima que implementa a classe interface ActionListener. Uma classe annima deve estender ou (exclusivo) implementar uma e somente uma classe.
Button b = new Button("Ok"); b.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { tratarOK(); } } );

1 2 3 4 5 6 7 8

Figura 18: Exemplo de classe interna annima.

16

DICAS DE PROGRAMAO

Planejar. Antes de comear a programar fazer um pseudo-cdigo ou fluxograma. Vantagens: Ajuda a detectar defeitos antes da codificao (economiza tempo) Aumenta a confiabilidade do software Desvantagens Cria mais documentao que dever ser mantida Podem exigir ferramentas adicionais, por exemplo, para desenhar fluxogramas Erros podem ser introduzidos no momento da traduo do pseudo-cdigo/fluxograma para o programa Tratar excees. Verificar se os parmetros de entrada condizem ao esperado. Usar nomes expressivos nas variveis e mtodos. Exemplo: manipular (int num) //no diz nada obterNumeroAlunosDaTurma (int num) // melhor D nome aos nmeros Ex: for (int i=0; i < 54; i++) melhor fazer for (int i=0; i < TAM_TURMA; i++) Evitar variveis globais: preferir mtodos com parmetros sempre que possvel. Inicializar as variveis Declarar as variveis perto de sua primeira utilizao Notao Classes: iniciam com letras maisculas: Aluno, VeiculoMotor Mtodos: iniciam com letras minsculas: obterNumeroAlunos() Atributos: numChassis Variveis de mtodos: em minsculas ou idem aos atributos Dicas de programao Evitar utilizar parmetros dos mtodos como variveis do mtodo Limitar o nmero de parmetros dos mtodos (at 6, mximo 7) Evitar aninhamentos (loops) com mais de 3 nveis Verificar contadores de lao (principalmente os limites) Assegurar que os loops terminam

7.1

Caractersticas desejveis para um projeto de software


Correo: o software satisfaz aos requisitos da aplicao? Levar em conta que os requisitos variam ao longo do projeto impondo a necessidade de um projeto flexvel. Robustez: o projeto ou a implementao so robustos quando capazes de tratarem situaes incomuns ou de erro. Flexibilidade: tirar mais ou menos do que j foi implementado (por exemplo, uma calculadora que s faz uma operao por vez, possvel fazer vrias operaes). Adicionar novas funcionalidades e alterar funcionalidades Eficincia: tempo de execuo e utilizao de recursos (processador, memria, armazenamento).

17

Confiabilidade: tempo mdio entre falhas (sistema j est em produo) Usabilidade: facilidade de uso

8 TRATAMENTO DE EXCEES EM JAVA


Este captulo um resumo do tutorial da Sun1 que apresenta dois tipos de exceo: no verificadas e verificadas.

8.1

Exceo

um evento anormal que ocorre durante a execuo do programa interrompendo o fluxo normal de execuo. Quando uma exceo ocorre, um objeto denominado exception object, contendo informaes sobre o erro criado. Throwing an exception: significa que um mtodo lana uma exceo criando um exception object que dever ser processado pelo JRE (Java Runtime Environment). Processado significa passar a exceo a algum que saiba o que fazer com ela, ou seja, pass-la a um exception handler. Um exception handler s saber tratar o exception object se tiver uma clusula catch (pegar a exceo que foi lanada) que trata o tipo da exceo em questo.

8.2

Tipos de exceo

H dois tipos de exceo: no verificadas e verificadas. Excees no verificadas (nonchecked exceptions). So excees que no necessitam serem capturadas (catch) pelos mtodos. Este tipo de exceo ocorre internamente ao JRE, tais como: excees aritmticas (diviso por zero), ponteiros nulos e estouro de ndice de vetores/matrizes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class JExcecoes { public static void gravarArqTexto(String nomeArquivo) { PrintWriter saida = new PrintWriter(new FileWriter(nomeArquivo)); saida.println("Eu sou o arquivo " + nomeArquivo); saida.close(); } public static double dividir(double x, double y) { // Exemplifica exceo no verificada, no precisa ser "caught" // So excees internas ao java runtime. // Em caso de diviso por zero, retorna Infinity return x/y; } public static double extrairRaizQuadrada(double x) { // Se x for negativo, retorna NaN (not a number) return Math.sqrt(x); } public static void main(String[] args) { System.out.println(dividir(5, 0)); System.out.println(extrairRaizQuadrada(-1)) } }

Figura 19. Os mtodos dividir e extrairRaizQuadrada podem gerar excees no verificadas em tempo de compilao.

Excees verificadas (checked exceptions). So excees que devem ser tratadas e o tratamento exigido pelo compilador. So excees que ocorrem externamente ao JRE, por exemplo, aquelas que ocorrem durante operaes de E/S. Na Figura 19, em gravarArqTexto, o mtodo construtor FileWriter lana (pode lanar) uma exceo que deve ser obrigatoriamente tratada. Assim, o compilador acusa o seguinte erro: .

http://java.sun.com/docs/books/tutorial/essential/exceptions/

18

8.3

Tratar Excees

Antes de qualquer coisa preciso saber qual o tipo de exceo gerada para poder trat-la. Por exemplo, o mtodo construtor FileWriter lana uma exceo IOException. Para saber, basta consultar a documentao do mtodo em http://java.sun.com/j2se/1.5.0/docs/api/index.html. A figura seguinte reproduz a documentao Java: Constructor Detail FileWriter public FileWriter(String fileName) throws IOException Constructs a FileWriter object given a file name. Parameters: fileName - String The system-dependent filename. Throws: IOException - if the named file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason
Figura 20 : Exceo lanada pelo construtor de FileWriter.

Para tratar uma exceo preciso cerc-la utilizando o try e peg-la utilizando o comando catch. Cada bloco catch denominado exception handler. Podemos associar mais de um catch a um try. O cdigo mostrado na Figura 19 no passa na compilao. Para corrigi-lo preciso substituir o mtodo gravarArqTexto pelo cdigo mostrado na Figura 20.
public static void gravarArqTexto(String nomeArquivo) { PrintWriter saida = null; try { saida = new PrintWriter(new FileWriter(nomeArquivo)); saida.println("Eu sou o arquivo " + nomeArquivo); } catch (IOException e) { System.out.println("Erro na criao do objeto FileWriter: "+ nomeArquivo+e.getMessage()); } finally { if (saida != null) { System.out.println(nomeArquivo + " sera fechado"); saida.close(); } else System.out.println(nomeArquivo + " nao foi aberto"); } }

Figura 21 : Blocos try, catch e finally.

Observe que o bloco finally sempre executado independentemente do bloco try ser executado at o final ou abortar no meio.

8.4

Lanar Excees

Cdigos que lanam excees podem criar objetos descendentes da classe Throwable atravs do comando throws. No cdigo abaixo, o mtodo pop lana a exceo pilha vazia.

19

23 public Object pop() throws EmptyStackException { 1 Object obj; 2 3 if (size == 0) { 4 throw new EmptyStackException(); 5 } 6 7 obj = objectAt(SIZE - 1); 8 setObjectAt(SIZE - 1, null); 9 size--; 10 return obj; 11 }

Figura 22. Exemplo de lanamento de exceo.

java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.util.EmptyStackException


Figura 23. Classe de um objeto de erro deve ser descendente da Throwable.

Um mtodo pode lanar suas prprias excees, como no exemplo da figura 22, ou lanar excees que foram lanadas por outros mtodos que no foram tratadas no mtodo em questo. At o mtodo main pode lanar excees geradas por outros mtodos para o JRE.

20

9 EXERCCIOS
1. (conceito) Implemente uma classe que represente o comportamento de um semforo (mquina de estados cclica) e instancie um objeto desta classe demonstrando que funciona por meio de uma interface textual.
Soluo disponvel em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercSinaleiroSol

2.

(classe de Interface) Baixe o projeto Netbeans Ratos de Interface e faa o seguinte: ( ) a. Crie um novo rato de canto que implemente as classes de interface LimitesDoTabuleiro e RatoDeTabuleiro nos moldes da RatoDeCanto e modifique a aparncia para X-X. ( ) b. Crie um novo tipo de rato (RatoAleatorio) que anda aleatoriamente no tabuleiro ( ) c. Pegue o cdigo do rato de um colega e plugue no simulador ( ) d. Faa o diagrama de classes para o sistema s com as classes do problema (UML).
fontes disponveis em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercRatosInterface/

3.

(herana) Vamos supor um simulador de futebol simplificado onde jogadores se deslocam num tabuleiro de tamanho N X M e a bola ocupa uma das posies (x, y). Todos os jogadores apresentam comportamentos bsicos similares, so eles: void desenhar(), void apagar(), void reposicionar(), void reposicionar(Point p), void inicializar(Ponto p) e Chute chutar(). Desenhar() desenha o jogador na posio x, y atual; apagar() apaga o jogador da posio x, y atual, reposicionar() faz o jogador retornar ao seu campo na posio inicial e reposicionar(Ponto p) define a prxima posio do jogador no tabuleiro sendo que o jogador somente se movimenta de casa em casa (no salta!). Suponha que h vrios tipos de jogadores que se comportam diferentemente (se movimentam e chutam diferentemente) em funo da posio, zagueiro, atacante, meio-campo e goleiro, e tem aparncias diferentes tambm em funo da posio. Um jogador somente pode chutar a bola se estiver na mesma posio que esta ltima. O chute pode ser dado para frente, trs, esquerda ou direita, e com uma certa fora (fraco, mdio, forte). Logo, um chute a combinao de uma direo com uma fora. O simulador faz o seguinte a cada ciclo: chama a operao Chute jogar() para o time1; calcula a posio da bola em funo das informaes do chute dado ou no, consulta as posies dos goleiros do time1 e time2 executando a operao Ponto GetPosGoleiro() para saber se o goleiro agarrou a bola ou se foi gol e redesenha a bola. Em seguida, repete os passos para o time2. Em caso de gol, os times recebem um reposicionar() do simulador. Neste caso, todos os jogadores devem voltar ao seu campo nas posies originais e o ciclo continua. Na operao jogar(), o time escolhe quais jogadores vo se movimentar em funo da posio da bola (a est a inteligncia e coordenao do time). Os jogadores escolhidos para se movimentar devem ser apagados (apagar()) da posio onde se encontram, reposicionados (reposicionar(Point p)) e redesenhados (desenhar()). Faa um diagrama de classes que represente as classes necessrias e implemente um jogo com dois times. IMPORTANTE: o cdigo deve permitir que um jogador e, at mesmo, um time com seus jogadores desenvolvido por outro programador seja plugado no simulador.
Soluo disponvel em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/VPExercRobosSol

4.

(herana) Uma locadora de veculos aluga diversos tipos de veculos: caminhes, carros de passeio categoria A, B e C, utilitrios (furges e camionetes) e motos. O preo da diria dos veculos varia em funo do imposto de locao e do valor de locao (ambos dirios). A frmula de clculo do aluguel diferente para caminhes, carros de passeio, utilitrios e motos. Caminhes levam em conta o nmero de eixos e motos, a cilindrada (caso no seja informado, assume-se 125cc). Organize as classes hierarquicamente em um diagrama de classes com seus atributos e o mtodo calcular valor locao diria.

21

Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/VPExercDiagClassesVeicLocSol/

5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

(Herana, polimorfismo) Fazer o diagrama de classes para o cdigo abaixo. Qual o tipo de polimorfismo existente no mtodo calcularIPVA()?
interface IPVA { // definimos algumas constantes (implicitamente so static final e declaramos // um mtodo abstrado calcular IPVA Boolean CARRO_PASSEIO = true, CARRO_UTILITARIO = false; double CTE_UTILITARIO = 0.75, CTE_PASSEIO = 1.0; double VALOR_BASE = 500.00; public double calcularIPVA(); } class Carro implements IPVA { Boolean tipoCarro=CARRO_PASSEIO; String placa = new String("ABC1010"); public double calcularIPVA() { if (tipoCarro==CARRO_PASSEIO) return VALOR_BASE * CTE_PASSEIO; else return VALOR_BASE * CTE_UTILITARIO; } } class Caminhao implements IPVA { String placa = new String("CCC1010"); public double calcularIPVA() { return 2 * VALOR_BASE * CTE_UTILITARIO; } } public class ExemplificarInterface { // A classe IPVA homogeiniza a execuo do mtodo calcularIPVA. Aqui no // sabemos se o objeto um carro ou um caminhao, mas como ambas as classes // so obrigadas a implementar o mtodo em questo podemos cham-lo sem // conhecer a classe do objeto. public static void main(String args[]) { IPVA veiculos[] = {new Carro(), new Caminhao()}; for (int i=0; i < veiculos.length; i++) System.out.println(veiculos[i].calcularIPVA()); } }
Soluo do Diagrama de classes em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/VPExercPoliSobrepIPVASol/

6.

(Herana, Construtora) Utilizando os operadores super e this, faa o corpo dos mtodos ObterNomeCientfico presentes cdigo abaixo para que a linha marcada em amarelo imprima o nome cientfico da classe, ordem e a famlia de Tot na seguinte forma: Mammalia.Carnivora.Canidae.
Fonte disponvel em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercThisSuper/ Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercThisSuperSol/

Arquivo Mamifero.java 41 public abstract class Mamifero { 42 private static final String nivel = "Classe"; 43 private static final String nomeCientifico = "Mammalia"; 44 private static final String nomePopular = "Mamifero"; 45 46 public String obterNomeCientifico() { 47 // corpo do mtodo 48 return (um string); 49 } 50 } 51 52 abstract class Carnivoro extends Mamifero { 53 private static final String nivel = "Ordem"; 54 private static final String nomeCientifico = "Carnivora";

22

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

private static final String nomePopular = "Carnivoro"; public String obterNomeCientifico() { // corpo do mtodo return um string ; } } class Canidio extends Carnivoro { private static final String nivel = "Familia"; private static final String nomeCientifico = "Canidae"; private static final String nomePopular = "Canidios"; String nome; Canidio(String nome) { this.nome = nome; } public String obterNomeCientifico() { // corpo do mtodo return um string; } }

Arquivo Main.java 76 public class Main { 77 public static void main(String args[]) { 78 Canidios toto = new Canidios(toto); 79 System.out.println("Nome cientifico " toto.nome + = ); 80 System.out.println(toto.obterNomeCientifico()); 81 } 82 }

7.

Ao executar o cdigo abaixo, com o valor impresso para x? Que mensagens sero impressas e em qual ordem? Fonte:

Arquivo Main.java 83 public class Main { 84 public static void main(String args[]) { 85 C c = new C(); 86 System.out.println(valor de x = + c.x); 87 } 88 } Arquivo A.java 1 public class A { 2 int x; 3 public A() { 4 x = 1; 5 System.out.println("=== A ==="); 6 } 7 } 8 9 class B extends A { 10 public B() { 11 x = 2; 12 System.out.println("\t=== B"); 13 } 14 } 15 16 class C extends B { 17 public C() { 18 x = 3; 19 System.out.println("\t\t=== C"); 20 } 21 }

8.

(classe abstrata, polimorfismo) Um usurio deseja ter vrios tipos de assinaturas para colocar nos seus e-mails de acordo com o destinatrio (h tambm uma assinatura default para outros no especificados). Como voc utilizaria uma classe abstrata, herana e polimorfismo para resolver este problema? A assinatura composta por trs atributos: mensagem, nome, ramal. Deve haver um mtodo imprimirAssinatura. Implemente e faa o diagrama e classes em UML.
Destinatrio Amigo Assinatura []s Joo de Almeida

23

Colega de trabalho Parente

Atenciosamente, Joo de Almeida Ramal 3455 At mais, Joo de Almeida

Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercHerancaAssinaturaEmailSol

9.

(membros classe & instncia) Interprete o cdigo abaixo e responda, considerando que a e b so instncias de Automvel: a) Qual o valor Automovel.numAutosFeitos aps a criao de 5 instncias de Automvel? b) Qual o valor de a.numAutosFeitos (considerando o item a)? c) Automovel.numAutosFeitos, a.numAutosFeitos e b.numAutosFeitos sempre tm o mesmo valor?

1 public class Automovel { 2 public int quilometragem; 3 public static int numAutosFeitos=0; 4 5 public Automovel() { 6 incrementarNumAutosFeitos(); 7 } 8 public static void incrementarNumAutosFeitos() { 9 numAutosFeitos++; 10 } 11 12 public void incrementarQuilometragem(int km) { 13 quilometragem += km; 14 }

10. (membros classe & instncia) Modificar o cdigo do semforo (exerccio 1) para que toda instncia de semforo saiba quantos foram instanciados a qualquer momento.
Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercSinaleiroInstanciasSol/

11. (membros classe & instncia, visibilidade) Reutilize o cdigo do semforo e inclua (ou modifique a) uma construtora tornando-a PRIVATE (no pode haver construtora pblica). Pergunta-se: como uma outra classe poderia instanciar semforos dado que a construtora private? Implemente.
Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExercSinaleiroConstPrivSol/

12. (Visibilidade) O cdigo abaixo contm vrios problemas com as definies de visibilidade dos mtodos, atributos e classes. Corrija-os mantendo os dois arquivos .java.
Soluo em: http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExemPacotesSol/

Arquivo JExemploPacotes.java
// Objetivo: utilizar pacotes e visibilidade. 1 // A classe ponto no visvel deste pacote "default" 2 // pois foi definida como friendly no pacote quadrado 3 import quadrado.*; 4 5 public class JExemploPacotes { 6 7 public static void main(String[] args) { 8 Ponto p = new Ponto(10, 20); 9 Quadrado q = new Quadrado(p, 5); 10 System.out.println(q.calcularArea()); 11 } 12 }

Arquivo Quadrado.java

24

package quadrado; 1 2 class Ponto { 3 private float x; 4 private float y; 5 Ponto(float x1, float y1) { 6 x = x1; 7 y = y1; 8 } 9 } 10 11 public class Quadrado { 12 private Ponto verticeXY; 13 private float lado; 14 15 Quadrado(Ponto v, float l) { 16 verticeXY = v; 17 lado = l; 18 } 19 public float calcularArea() { 20 return (lado*lado); 21 } 22 }

13. (vis, her, poli) Analise o cdigo abaixo e responda:


Arquivo Pessoa.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package pessoa; import java.io.*; public interface Pessoa { abstract public void imprimir(); } abstract class Usuario implements Pessoa { protected String nome; protected int cpf; protected int maxEmprestimo=2; public Usuario(String nome, int cpf) { this.nome = nome; this.cpf = cpf; } public void imprimir() { System.out.println("nome: " + this.nome + " cpf: " + this.cpf + " emprestimos: " + this.maxEmprestimo); } } class UsuarioPadrao extends Usuario { public UsuarioPadrao(String nome, int cpf) { super(nome, cpf); } } class UsuarioEspecial extends Usuario { public UsuarioEspecial(String nome, int cpf) { super(nome, cpf); this.maxEmprestimo = 6; } }

Arquivo CadastroUsuario.java 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package principal; import pessoa.*; public class CadastroUsuario { public static void main(String args[]) { Usuario usuario[] = {new UsuarioPadrao("Joao", 123456), new UsuarioEspecial("Maria", 676767), new UsuarioPadrao("Carlos", 888999)}; for (int i=0; i < usuario.length; i++) usuario[i].imprimir(); } }

Fontes: JAVARepositorio\JRevisaoOO\JExercCadastroUsuarioEnunciado

25

( ) a. Quais so os problemas de visibilidade e como corrigi-los mantendo os pacotes e as classes nos respectivos pacotes e sem mudar/adicionar mtodos? ( ) b. O que o programa (depois das correes) imprime na tela quando executado? ( ) c. Cite um exemplo de polimorfismo de sobreposio. ( ) d. Crie um novo mtodo construtor que faa polimorfismo de sobrecarga sobre o construtor Usuario(String nome, int cpf) da classe Usurio. ( ) e. Onde foram aplicados o princpio da substituio de classes e vinculao dinmica (late binding)? ( ) f. Como voc faria para reduzir o acomplamento entre o pacote principal e o pessoa. De outra forma, faa com que o cdigo da classe CadastroUsuario s utilize uma classe do pacote pessoa. Comparar a soluo obtida com o padro Factory por meio de um diagrama de classes (casar com o diagrama de classes do padro Factory)
Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JCadastroUsuarioFactorySol e http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JCadastroUsuarioFactorySol2

14. (classes interna, interface). Utilize uma classe interna que implemente a interface Iterator e permita navegar num vetor de 10 inteiros (valores aleatrios) armazenados em um atributo de instncia da classe externa. O mtodo next() do Iterator deve retornar somente os valores mpares armazenados no vetor. Por exemplo, se no vetor existirem os seguintes nmeros: {100, 3987, 123, 4}, a sequncia de invocaes abaixo produz: next() -> 3987 next() -> 123 next() -> throw NoSuchElementExecption O mtod hasNext() verifica se h um nmero mpar em alguma posio alm das j pesquisadas. A implementao do mtodo remove() opcional. Caso no seja feita, deve retornar uma instncia de UnsupportedOperationException.
Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JAninhadaIteratorSol

15. (classe aninhada esttica) Utilize uma classe aninhada esttica para testar uma classe externa que calcula o dgito verificador de um cdigo composto por trs dgitos da seguinte forma: 829 => 8*4 + 2*3 + 9*2 = 56 => 56 % 10 = 6 (dgito verificador). O teste deve ser feito para dois cdigos cujos dgitos verificadores so conhecidos (calculados manualmente).
Soluo em http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JRevisaoOO/JExerClasseAninhadaEstaticaDVSol

16. (boas prticas) Um usurio necessita de um sistema para somar dois nmeros reais. Codifique o dito sistema preocupando-se com as dicas de programao e procurando atender s seguintes propriedades de qualidade de software: correo, robustez e flexibilidade. 17. (boas prticas e excees) Completar o exerccio da calculadora levando em conta o seguinte:

Correo: O sistema permite somar quaisquer tipos de nmeros (inteiros, decimais, negativos)? Flexibilidade: Somar vrios nmeros ao invs de dois somente. O usurio pode fazer vrias somas sem precisar executar o programa a cada vez? Introduzir novas operaes: multiplicao, diviso e subtrao. Robustez: Verifica se os operandos lidos do teclado so numricos? Verifica se o usurio solicitou uma operao vlida (adio, subtrao, diviso ou multiplicao)?

26

Usabilidade: fcil de ser usado? As opes para o usurio so claras (ex. como sair do programa)?

18. (excees) Pesquisar o mtodo scanner e ver quais so as exceptions lanadas pelo mesmo. Abaixo as excees lanadas pelo Scanner.nextDouble():
Throws:
InputMismatchException - if the next token does not match the Float regular expression, or is out of range NoSuchElementException - if the input is exhausted IllegalStateException - if this scanner is closed

27

Vous aimerez peut-être aussi