Leonardo Mota
Objetivos
Declarar classes e interfaces; Declarar mtodos, construtores e variveis de instncia e de classe utilizando os modificadores de visibilidade; Declarar tipos primitivos, variveis e arrays utilizando identificadores permitidos; Declarar enums; Utilizar a conveno JavaBeans de nomenclatura Utilizar var-args;
2
Identificadores legais
Os identificadores devem comear com uma letra, $, ou underscore ( _) Os identificadores no podem comear com um nmero Aps o primeiro caracter, so permitidos letras, $, _, ou nmeros; No h limite de tamanho para o identificador; Palavras reservadas no so permitidas como identificadores:
abstract, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while, assert (Java 1.4) e enum (Java 5)
Identificadores legais
Declaraes vlidas:
int _b; int $r; int ______6_s; int _$; int identificador_bem_extenso_para_a_minha_variavel;
Declaraes ilegais:
int :g; int -t; int e#; int .q; int 2k;
4
Convenes da Sun
Classes e interfaces
Primeira letra maiscula A primeira letra de cada palavra que forma o identificador tambm em maiscula (formato camelCase)
Convenes da Sun
Mtodos
Variveis
Convenes da Sun
Constantes
Convenes da Sun
class Teste { private int i; public static void main(String[] args) { Teste t = new Teste(); for (int x = 100; x > 0; --x) { System.out.print(x + " "); } } }
No exame as questes costumam respeitar apenas as convenes de nomenclatura Cdigo aderente s normas da Sun:
Cdigo na questo: class Teste { private int i; public static void main(String[] args) { Teste t = new Teste(); for(int x=100; x>0; --x) { System.out.print(x + " "); } } }
8
Padro JavaBeans
Especifica um padro de nomeclatura para mtodos que manipulam as propriedades das classes: getters (recuperam o valor) e setters (modificam o valor) Para atributos no booleanos, o prefixo do mtodo getter deve ser get. Exemplo: getTamanho() Para atributos booleanos, o prefixo pode ser get ou is. Exemplo: isCarnivoro()ou getCarnivoro() Para mtodos setters, o prefixo deve ser set. Exemplo: setLargura() um nome JavaBean vlido para a propriedade largura O nome do mtodo formado pelo prefixo apropriado seguido pelo nome da propriedade com a primeira letra maiscula
9
Padro JavaBeans
Mtodos setters devem ser pblicos, retornando void e recebendo um argumento com o tipo da propriedade alvo:
public void setCpf(String newCpf) { cpf = newCpf; }
Mtodos getters devem ser pblicos, sem argumentos, e retornam um tipo compatvel com o argumento recebido pelo mtodo setter:
public String getCPF() { return cpf; }
10
Classes
S pode haver uma nica classe pblica por arquivo Caso haja uma classe pblica no arquivo (pode no haver), o nome do arquivo deve bater com o nome da classe. Se no arquivo existe uma classe declarada como public class Animal { } o nome do arquivo deve ser Animal.java Um arquivo sem classes pblicas pode ter qualquer nome (no precisa bater com o nome de nenhuma classe) Se a classe est em um pacote (package), a declarao do pacote deve ser a primeira linha de cdigo do arquivo, antes de qualquer import
11
Classes
Se h algum comando import, ele deve vir entre a declarao do pacote e a declarao da classe. O import deve ser a primeira linha de cdigo do arquivo se no houver declarao de pacote. Se no houver nem declarao de pacote nem import, a declarao da classe deve ser a primeira linha de cdigo do arquivo A declarao do pacote e os imports so globais, afetando todas as classes presentes no arquivo Um arquivo pode conter mais de uma classe no pblica
12
Classes
Declarao
Declarao bsica:
class Classe11 { }
Classes
Modificadores de visibilidade
Classes
Acesso a classes
Se o cdigo em uma classe A acessa uma classe B (A enxerga B), a classe A pode fazer as seguintes operaes com B:
Criar uma instncia de B Estender B (tornar-se subclasse de B) Acessar mtodos e variveis da classe B, desde que permitido pelos respectivos modificadores
15
Classes
Acesso default
Ocorre quando no especificado nenhum modificador Uma classe com acesso default somente pode ser vista por classes do seu mesmo pacote O exemplo a seguir no compila:
Arquivo Bebida.java package pack1; class Bebida {} Arquivo Cafe.java package otherPack.stuff; import pack1.Bebida; // erro de compilao! class Cafe extends Bebida { }
16
Classes
Acesso public
Uma classe declarada como public permite que qualquer outra classe dentro de qualquer pacote a acesse Se as classes estiverem em pacotes diferentes, necessrio o comando import Exemplo:
Arquivo Bebida.java package pack1; public class Bebida { } Arquivo Cafe.java package otherPack.stuff; import pack1.Bebida; class Cafe extends Bebida { }
17
Classes
O modificador final
Uma classe declarada como final no pode ser estendida Se a classe A final, a linha a seguir gera erro de compilao: class B extends A { } O uso de final garante que todos os mtodos da classe A nunca podero ser redefinidos (impede o override) Desvantagem: sem herana no h possibilidade de especializao Exemplo de classe final presente na API Java : String
18
Classes
O modificador final
Exemplo:
Arquivo Bebida.java package pack1; public final class Bebida { } Arquivo Cafe.java package otherPack.stuff; import pack1.Bebida; class Cafe extends Bebida { } // erro de compilao!
19
Classes
O modificador abstract
Uma classe marcada com o modificador abstract (classe abstrata) nunca pode ser instanciada A classe abstrata existe apenas para ser estendida final e abstract so inimigos! Aplica-se quando a classe muito genrica
20
Classes
O modificador abstract
Exemplo:
abstract class Automovel { private double preco; private String marca; private String modelo; private String ano; public abstract void acelera(); //mtodos abstratos terminam em ; public abstract void acendeFarois(); public abstract void buzina(); }
21
Classes
O modificador abstract
A presena de um nico mtodo abstrato requer que a classe seja abstrata Uma classe pode ser abstrata sem que tenha qualquer mtodo abstrato Uma classe abstrata pode ter mtodos no abstratos Exemplo:
abstract class Automovel { private double preco; private String marca; private String modelo; private String ano; public String getModelo() { return modelo; } }
22
Interfaces
Declarao
Uma interface uma definio de um contrato das operaes de uma classe Especifica quais so as operaes, e no como elas sero executadas Exemplo:
Uma interface como se fosse uma classe 100% abstrata. O compilador enxerga o cdigo da seguinte forma:
Interfaces
Declarao
Uma classe que implementa a interface Voador deve ser declarada assim:
class VoaComAsas implements Voador { public void voa () { // public obrigatrio aqui // cdigo fonte que sabe voar com asas } }
O modificador abstract permitido! As duas declaraes abaixo so vlidas e idnticas: Os nveis de acesso permitidos para interfaces so default e public
24
Interfaces
Regras
Todos os mtodos de uma interface so implicitamente pblicos e abstratos. Todas as variveis declaradas em uma interface devem ser definidas como public, static, e final Um interface no pode conter mtodos estticos Mtodos em uma interface no podem ser final, strictfp, ou native Uma interface pode estender uma ou mais interfaces Uma interface somente pode estender interfaces Uma interface no pode implementar uma interface Interfaces podem ser usadas com polimorfismo
25
Interfaces
Declarao de constantes Constantes definidas em uma interface so visveis a todas as classes que implementam a interface Exemplo:
Arquivo MyInterface.java: interface MyInterface { int MAX_SIZE = 10; void go(); } Arquivo MyClass.java: class MyClass implements MyInterface { public void go() { MAX_SIZE = 35; // erro de compilao! MAX_SIZE read-only } }
26
Atributos e mtodos
27
Atributos e mtodos
Tipos de acesso
Cdigo em uma classe pode acessar um atributo ou mtodo em uma outra classe:
class X { public String getName() { return X; } } class Y { public void useX() { X x = new X(); System.out.println(x.getName()=+x.getName()); } }
28
Atributos e mtodos
Tipos de acesso
class A { public String getName() { return A; } } class B extends A { public void myMethod() { System.out.println(1: +this.getName()); // B herda de A A a = new A(); System.out.println(A.getName()=+a.getName()); } }
Quando uma subclasse herda um atributo ou mtodo, como se ela mesma tivesse declarado esse atributo ou mtodo.
29
Atributos e mtodos
Passo 1: Verificar o nvel de acesso da classe B Passo 2: Verificar o nvel de acesso dos atributos e mtodos da classe B
30
Atributos e mtodos
Acesso public
Quando um atributo ou mtodo pblico, todas as outras classes, independente do pacote onde estejam, podem acess-lo Exemplo 1:
Arquivo A.java package p1; import p2.*; class A { public static void main(String[] args) { B b = new B(); b.test(); // Ok porque test pblico } } Arquivo B.java package p2; public class B { public void test() { System.out.println("B!!"); } }
31
Atributos e mtodos
Acesso public
Exemplo 2:
Arquivo A.java package p1; public class A { public String myMethod() { return hi; } } Arquivo B.java package p2; import p1.A; class B extends A { public void testB() { System.out.println(myMethod()); //ou ento this.myMethod() } }
32
Atributos e mtodos
Acesso private
Atributos e mtodos private somente so visveis dentro da prpria classe que os declarou Exemplo 1:
Arquivo A.java package p1; import p2.B; class A { public static void main(String[] args) { B b = new B(); // Ok porque a classe B pblica b.test(); // erro de compilao: cannot find symbol } } Arquivo B.java package p2; public class B { private void test() { System.out.println("B!!"); } }
33
Atributos e mtodos
Acesso private
Arquivo A.java package p1; public class A { private String myMethod() { return hi; } } Arquivo B.java package p1; // A e B esto no mesmo pacote class B extends A { public void testB() { System.out.println(myMethod()); // erro de compilao } }
34
Exemplo 2:
Atributos e mtodos
Um atributo/mtodo com visibilidade default ou protected somente pode ser acessado por classes que pertenam ao mesmo pacote Caso o atributo/mtodo seja protected, qualquer subclasse da classe que declarou o atributo/mtodo pode acess-lo (via herana), podendo a superclasse e a subclasse estarem em pacotes diferentes Caso o atributo/mtodo tenha visibilidade default, uma subclasse da classe que declarou o atributo/mtodo somente pode acess-lo se estiver no mesmo pacote que a superclasse
35
Atributos e mtodos
Exemplo:
Arquivo OutraClasse.java package certificacao; public class OutraClasse { void teste() { // sem modificador, visibilidade default System.out.println("OutraClasse"); } } Arquivo MinhaClasse.java package outroPacote; import certificacao.OutraClasse; class MinhaClasse { public static void main(String[] args){ OutraClasse o = new OutraClasse(); o.teste(); // erro de compilao: mtodo no pode ser // acessado de fora do pacote } }
36
Atributos e mtodos
Exemplo:
Arquivo OutraClasse.java package certificacao; public class OutraClasse { protected void teste() { // visibilidade protected System.out.println("OutraClasse"); } } Arquivo MinhaClasse.java package outroPacote; import certificacao.OutraClasse; class MinhaClasse { public static void main(String[] args){ OutraClasse o = new OutraClasse(); o.teste(); // erro de compilao: mtodo protected } }
37
Atributos e mtodos
Acesso protected
Exemplo 1:
Arquivo Pai.java package certificacao; public class Pai { protected int x = 9; // visvel a todos dentro do pacote e // visvel (herana) a classes fora do pacote } Arquivo Filho.java package outroPacote; // Pai e Filho em pacotes diferentes import certificacao.Pai; class Filho extends Pai { public void teste(){ System.out.println(valor de x: +x); // ok! } }
38
Atributos e mtodos
Acesso protected
Exemplo 2:
Arquivo Pai.java
package certificacao; public class Pai { protected int x = 9; // visvel a todos dentro do pacote e // visvel (herana) a classes fora do pacote } Arquivo Filho.java package outroPacote; // Pai e Filho em pacotes diferentes import certificacao.Pai; class Filho extends Pai { public void teste(){ System.out.println(valor de x: +x); // ok! Pai p = new Pai(); System.out.println(valor de Pai.x: +p.x); // erro! } }
39
Atributos e mtodos
Acesso protected
Quando uma subclasse de fora do pacote herda um atributo protected, o atributo essencialmente privado dentro da subclasse, de forma que apenas a subclasse e suas subclasses podem acess-lo
40
Atributos e mtodos
Acesso default
Exemplo:
Arquivo Pai.java package certificacao; public class Pai { int x = 9; //sem modificador, visvel a todos dentro do pacote } Arquivo Filho.java package outroPacote; // Pai e Filho em pacotes diferentes import certificacao.Pai; class Filho extends Pai { public void teste(){ System.out.println(valor de x: +x); // erro de compilao } }
41
Atributos e mtodos
Acesso default
Corrigindo o exemplo:
Arquivo Pai.java package certificacao; public class Pai { int x = 9; // sem modificador, visvel a todos dentro do pacote } Arquivo Filho.java package certificacao; // Pai e Filho no mesmo pacote class Filho extends Pai { public void teste(){ System.out.println(valor de x: +x); // OK! x = 9 } }
42
Atributos e mtodos
final
class SuperClasse {
} class SubClasse extends SuperClasse { // Ok! public void exibeNome(){ System.out.println(SubClasse); // erro de compilao } }
44
final
A varivel recordNumber declarada como final e por isso no pode ter o seu valor modificado dentro do mtodo. Ou seja, no permitido fazer
recordNumber = novoValor
45
abstract
Um mtodo abstrato um mtodo que foi declarado mas no foi implementado Mtodos abstratos no contm cdigo Quando um mtodo abstrato em uma classe, todas as suas subclasses so obrigadas a fornecer uma implementao para ele Exemplo:
46
abstract
Uma subclasse que estende uma classe abstrata deve implementar todos os seus mtodos abstratos Regra geral: A primeira classe concreta (no abstrata) na hierarquia deve implementar todos os mtodos abstratos, de todas as classes abstratas
47
abstract
Exemplo:
public abstract class Veiculo { private String tipo; public abstract void acelera(); public String getTipo() { return tipo; } } public abstract class Carro extends Veiculo { public abstract void acelera(); public void abrePortaMalas() { // cdigo } } public class Audi extends Carro { public void acelera() { // cdigo especfico do Audi, implementao obrigatria } }
48
abstract
Um mtodo nunca pode ser abstract e final Um mtodo nunca pode ser abstract e private Um mtodo nunca pode ser abstract e static
49
synchronized
Aplica-se somente a mtodos Pode ser combinado com qualquer um dos trs modificadores de acesso (ou quatro nveis de controle de acesso)
native
strictfp
50
Construtores
Declarao:
class Aluno { protected Aluno() {} // Construtor da classe Aluno protected void Aluno() {} // Mtodo vlido (!) }
Um construtor nunca tem um tipo de retorno Pode ter ou no argumentos Todos os modificadores de acesso so permitidos Um construtor deve ter o mesmo nome da classe Construtores no podem ser static, final e abstract
51
Variveis
Tipos de variveis:
52
Variveis
Tipos primitivos:
Podem ser variveis de classe (estticas), de instncia, parmetros de mtodos, tipos de retorno e variveis locais Exemplos:
53
Variveis
Tipos primitivos:
54
Variveis
Tipos primitivos:
Ranges de valores
55
Variveis
Referncias:
Uma varivel de referncia utilizada para acessar um objeto Podem ser variveis de classe (estticas), de instncia, parmetros de mtodos, tipos de retorno e variveis locais Exemplos:
Object o; Animal meuAnimal; String s1, s2, s3; // declara trs variveis String
56
Variveis
Arrays:
Todo array um objeto em Java Um array pode armazenar tipos primitivos ou referncias para objetos Podem ser variveis de classe (estticas), de instncia, parmetros de mtodos, tipos de retorno e variveis locais Exemplos:
int[] chaves; // array de primitivos Animal listaAnimais[]; // array de referncias (a objetos da classe animal) String[][][] multiDimensionalArray1; String[] multiDimensionalArray2[]; //permitido!
57
Variveis
final
Uma varivel declarada com o modificador final nunca mais pode ser modificada aps ter sido inicializada Para primitivos, significa que o valor da varivel no pode mudar Para referncias, significa que a varivel no pode apontar para outro objeto diferente do qual foi especificado na sua inicializao Indica que o atributo da classe no ser considerado durante a serializao Somente pode ser aplicado a variveis de instncia Somente pode ser aplicado a variveis de instncia
58
transient
volatile
Modificador static
Um atributo ou mtodo esttico existe independente de qualquer instncia da classe Para utilizar um atributo ou mtodo esttico no necessrio criar uma nova instncia. Por isso so chamados atributos ou mtodos de classe No importa quantas instncias da classe tiverem sido criadas, h somente uma cpia do atributo esttico na memria Construtores, classes, interfaces e variveis locais no podem ser declaradas como static!
59
Enums
Declarao bsica:
SEGUNDA, TERCA, QUARTA, etc. so do tipo DiaDaSemana Como obter um dia da semana?
DiaDaSemana d = DiaDaSemana.SEGUNDA;
60
Enums
Enums podem ser declarados como atributos da classe ou ento fora da classe Exemplo de enum fora da classe:
class Calendario { DiaDaSemana d; } public class EnumFora { public static void main(String[] args) { Calendario c = new Calendario(); c.d = DiaDaSemana.SEGUNDA; System.out.println(c.d); } } enum DiaDaSemana {SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO, DOMINGO}
61
Enums
class Calendario2 { enum DiaDaSemana {SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO, DOMINGO}; // ; opcional DiaDaSemana d; } public class EnumAtributo { public static void main(String[] args) { Calendario2 c = new Calendario2(); c.d = Calendario2.DiaDaSemana.SEGUNDA; // nome da classe necessrio System.out.println(c.d); } }
Enums
enum TamanhoPizza {MEDIA(4), GRANDE(8), GIGANTE(16); TamanhoPizza(int fatias) { // construtor do enum this.fatias = fatias; } private int fatias; // varivel de instncia que cada valor do enum possui public int getFatias() { return fatias; } } class Pizza { TamanhoPizza fatias; // cada Pizza tem o seu enum de tamanho public static void main(String[] args) { Pizza p1 = new Pizza(); p1.fatias = TamanhoPizza.MEDIA; Pizza p2 = new Pizza(); p2.fatias = TamanhoPizza.GIGANTE; System.out.println(p1.fatias.getFatias()); // 4 System.out.println(p2.fatias.getFatias()); // 16 } }
63
Var-args
Os mtodos com var-args podem receber um nmero varivel de argumentos Para declarar um var-arg, definir o tipo, inserir ... seguido de um espao e ento o identificador S pode haver um nico parmetro var-arg no mtodo O parmetro var-arg deve ser o ltimo definido na assinatura do mtodo Exemplos:
void calcula(int... x) { // pode receber de 0 a N ints como parmetro System.out.println(x[0]); } void calcula2(char c, int... x) {} void calcula3(Animal... animais) {} // recebe de 0 a N Animais
64
Objetivos
Descrever encapsulamento, coeso e acoplamento Utilizar polimorfismo Implementar construtores e utilizar construtores de superclasse e sobrecarregados (overloaded) Utilizar relacionamentos IS-A ( um) e HAS-A (tem um) Declarar, inicializar e utilizar atributos e mtodos Utilizar sobrecarga (overloading) e sobrescrita (overriding) Identificar tipos de retorno permitidos em mtodos
65
Encapsulamento
Flexibilidade Manutenibilidade
public class MaPraticaOO { // Versao 1 public int altura; public int largura; ... } public class ExploraMaPraticaOO { public static void main (String [] args) { MaPraticaOO b = new MaPraticaOO(); b.altura = -5; // permitido, porem ruim } }
66
Encapsulamento
public class MaPraticaOO { // Versao 2 private int altura; private int largura; public void setAltura(int alt) { this.altura = alt; } ... } public class UsaMaPraticaOO { public static void main (String [] args) { MaPraticaOO b = new MaPraticaOO(); b.setAltura(-5); // o atributo somente pode ser modificado atraves do metodo } }
Encapsulamento
O principal benefcio a capacidade de fazer mudanas no cdigo sem quebrar o cdigo dos outros Os detalhes da implementao ficam escondidos atrs de um conjunto de mtodos a definio de uma API da sua classe possvel alterar um mtodo da API de forma que o mundo exterior no seja afetado
68
Encapsulamento
Alcanando o encapsulamento:
Mantenha as variveis de instncia protegidas por um modificador de visibilidade (private) Implemente mtodos pblicos para acesso aos atributos da classe, para forar que o cdigo chamador use esses mtodos ao invs de acessar os atributos diretamente Utilizar a conveno JavaBeans de nomenclatura
69
Encapsulamento
70
IS-A
Relacionamento baseado em herana ou implementao de interface uma maneira de dizer esta coisa um tipo daquela coisa Exemplos:
Manga Larga Marchador um Cavalo ( um tipo de Cavalo) Audi um Carro ( um tipo de Carro) Cenoura um Vegetal ( um tipo de Vegetal) Pentgono um Polgono ( um tipo de Polgono)
71
implementado em Java atravs das palavraschave extends (herana) e implements (implementao de interface)
public class Car { } public class Audi extends Car { } public inteface Voador { void voa(); } public class Morcego implements Voador { public void voa() { // cdigo que faz o morcego voar } }
72
"Car extends Vehicle" == "Car IS-A Vehicle." "Subaru extends Car" == "Subaru IS-A Car."
73
Vehicle a superclasse de Car. Car a subclasse de Vehicle. Car a superclasse de Subaru. Subaru a subclasse de Vehicle. Car herda de Vehicle. Subaru herda tanto de Vehicle quanto de Car. Subaru derivada de Car. Car derivada de Vehicle. Subaru derivada de Vehicle. Subaru um sub-tipo de Vehicle e de Car ao mesmo tempo.
74
Sim! Podemos dizer que uma classe do tipo de qualquer classe que venha acima na sua rvore de herana Ou seja, o teste do IS-A ser verdadeiro mesmo quando a herana for indireta
A expresso (Subaru instanceof Vehicle) retorna verdadeiro se e somente se Subaru IS-A Vehicle for verdadeiro
75
HAS-A
Significa tem um baseado em utilizao ao invs de herana Dizemos que classe A HAS-A B se cdigo na classe A tem uma referncia para uma instncia da classe B Exemplo:
public class Animal { } public class Cavalo extends Animal {//Cavalo IS-A Animal private Sela umaSela; // Cavalo HAS-A Sela }
A classe Cavalo tem uma varivel de instncia do tipo Sela, e pode invocar mtodos da classe Sela
76
Relacionamentos HAS-A permitem que as classes sejam especialistas Qualquer outra classe do sistema que precisar do comportamento da Sela no precisa implementar esse cdigo, bastando utilizar a classe Sela (especialista)
78
Polimorfismo
class Test { //inserir extends Object apos Test nao seria um erro public static void main(String [] args) { Test t1 = new Test(); Test t2 = new Test(); if (!t1.equals(t2)) // metodo equals() herdado de Object System.out.println("they're not equal"); if (t1 instanceof Object) System.out.println("t1's an Object"); } }
Polimorfismo
Dada a classe
class Pessoa {}
p IS-A Pessoa == verdadeiro (p instanceof Pessoa) p IS-A Object == verdadeiro (p instanceof Object)
80
Polimorfismo
A linha acima declarou uma varivel p do tipo Pessoa e atribuiu a p uma referncia a um novo objeto na memria p uma varivel de referncia para a Pessoa Joao
81
Polimorfismo
Uma varivel de referncia pode ter o seu valor alterado, passando a apontar para outro objeto O tipo de uma varivel de referncia determina os mtodos que podem ser invocados no objeto que ela referencia Uma varivel de referncia pode referenciar qualquer sub-tipo do tipo declarado Uma varivel de referncia pode ser declarada com um tipo de classe ou um tipo de interface. Se o seu tipo for uma interface, a varivel pode fazer referncia a qualquer objeto que implemente aquela interface
82
Polimorfismo
class GameShape { public void displayShape() { System.out.println(mostrando elemento"); } ... } class PlayerPiece extends GameShape { public void movePiece() { System.out.println("movendo peca"); } ... } class TilePiece extends GameShape { public void getAdjacent() { System.out.println("obtendo forma adjacente"); } ... }
83
Polimorfismo
public class TestShapes { public static void main (String[] args) { PlayerPiece player = new PlayerPiece(); TilePiece tile = new TilePiece(); doShapes(player); doShapes(tile); } public static void doShapes(GameShape shape) { shape.displayShape(); // todo GameShape ou quem herda de // GameShape possui o mtodo // displayShape() } }
Polimorfismo
tambm vlido fazer: public class TestShapes { public static void main (String[] args) { GameShape player = new PlayerPiece(); GameShape tile = new TilePiece(); doShapes(player); doShapes(tile); } public static void doShapes(GameShape shape) { shape.displayShape(); } }
Relembrando:
Uma varivel de referncia pode apontar para qualquer objeto do seu mesmo tipo ou ento pode referenciar qualquer sub-tipo do tipo declarado
85
Polimorfismo
Alterando a classe PlayerPiece: class GameShape { public void displayShape() { System.out.println(mostrando elemento"); } } public interface Animavel { public void anima(); } class PlayerPiece extends GameShape implements Animavel { public void movePiece() { System.out.println("movendo peca"); } public void anima() { System.out.println(animando...); } }
86
Polimorfismo
PlayerPiece agora passa no teste IS-A para a classe GameShape e a interface Animavel As quatro declaraes abaixo so vlidas:
PlayerPiece player = new PlayerPiece(); Object o = player; GameShape shape = player; Animavel a = player;
87
Polimorfismo
Enquanto o compilador somente conhece o tipo da varivel de referncia, a Mquina Virtual Java (JVM) em tempo de execuo conhece o tipo real do objeto Ou seja, se chamarmos o mtodo displayShape() em um objeto PlayerPiece utilizando uma varivel do tipo GameShape, a JVM saber em tempo de execuo que trata-se de um objeto PlayerPiece Se PlayerPiece sobrescrevesse o mtodo displayShape (override), a JVM invocaria o mtodo definido em PlayerPiece Em tempo de execuo apenas os mtodos de instncia so dinamicamente selecionados com base no tipo real do objeto
88
Sobrescrever redefinir na subclasse o comportamento do mtodo original da superclasse Dessa forma a subclasse pode definir um comportamento especfico para o seu uso Exemplo: Cavalo sobrescreve o mtodo come da classe Animal
public class Animal { public void come() { System.out.println(Animal generico comendo"); } } class Cavalo extends Animal { public void come() { System.out.println(Cavalo comendo feno e cenoura"); } }
89
Se utilizamos uma varivel do tipo Animal o compilador somente permite utilizar mtodos da classe Animal
Animal c = new Cavalo(); c.relincha(); // erro de compilao! Animal no tem o mtodo relincha
Atravs do Polimorfismo, possvel usar um supertipo abstrato (incluindo uma interface) para referenciar
91
Ateno: O mtodo que est sobrescrevendo (na subclasse) no pode ter um modificador de acesso mais restritivo do que o mtodo original (da superclasse)
public class Animal { public void come() { System.out.println(Animal generico comendo"); } } class Cavalo extends Animal { private void come() { // erro de compilao! System.out.println(Cavalo comendo feno e cenoura"); } public void relincha() {} } public class TestaAnimais { public static void main (String [] args) { Animal a = new Animal(); Animal b = new Cavalo(); //var Animal, mas objeto Cavalo a.come(); // Executa o metodo come() da classe Animal b.come(); // Executa o metodo come() da classe Cavalo } }
92
O contrato da superclasse
Uma varivel de referncia do tipo Animal pode sempre apontar para uma instncia da classe Cavalo, pois Cavalo um Animal (Cavalo IS-A Animal verdadeiro) Quem possuir uma referncia da classe Animal para uma instncia de Cavalo livre para chamar todos os mtodos de Animal, independente se Cavalo sobrescreve algum mtodo ou no
93
Regras
A lista de argumentos deve bater exatamente. Se no bater, pode ocorrer overload O tipo de retorno deve ser o mesmo ou um subtipo do tipo de retorno original O nvel de acesso s pode ser menos restritivo do que no mtodo da superclasse Se a subclasse est no mesmo pacote que a superclasse, pode sobrescrever os mtodos que no sejam private ou final. J uma subclasse em um pacote diferente da superclasse pode sobrescrever os mtodos public ou protected (e no final)
94
Regras
O mtodo que est sobrescrevendo pode lanar qualquer runtime exception (ditas unchecked), independente se o mtodo original declara ou no a exceo O mtodo que est sobrescrevendo no pode lanar excees (checked exceptions) novas ou mais genricas do que as que foram declaradas no mtodo original. O mtodo que est sobrescrevendo pode lanar menos excees do que o mtodo original, excees mais especficas ou ento no lanar nenhuma No permitido sobrescrever um mtodo final ou static
95
public class Animal { public void come() { } public void imprimeAnimal() { // Codigo que imprime o Animal } } class Cavalo extends Animal { public void imprimeAnimal() { // Utiliza o codigo da classe Animal, e depois faz mais coisas super.imprimeAnimal(); // Invoca o codigo da superclasse // E depois imprime dados especficos do Cavalo } }
97
Problema: Nvel de acesso mais restritivo Problema: Declara uma exceo (checked) no definida no mtodo da superclasse Problema: A lista de argumentos mudou ( na verdade um overload) Problema: Tipo de retorno mudou (tambm no um overload)
98
Permite que um mtodo com o mesmo nome de um j existente seja criado, porm com argumentos distintos e opcionalmente com outro tipo de retorno Regras:
Deve mudar a lista de argumentos (obrigatrio) Pode mudar o tipo de retorno Pode mudar o modificador de visibilidade Pode declarar novas excees ou excees mais genricas
99
Um mtodo pode ser sobrecarregado dentro da mesma classe ou em uma subclasse Exemplo:
public class A { public void m(int i) {} } class B extends A { public void m(String s) {} // No override! }
No exemplo anterior, dois mtodos com o mesmo nome, mas em classes diferentes, esto sobrecarregados.
100
Dado o mtodo:
void changeSize(int size, String name) { } int changeSize(int size, float pattern) { } void changeSize(float pattern, String name) IOException { }
101
Ao rodarmos o exemplo, produzida a sada: Entrei na versao com arg Animal Entrei na versao com arg Cavalo
102
E se na chamada ao mtodo fazAlgo for passada como parmetro uma referncia do tipo Animal para um objeto da classe Cavalo?
Animal animalRefObjCavalo = new Cavalo(); ua.fazAlgo(animalRefObjCavalo);
103
Ao rodarmos o exemplo, produzida a sada: Entrei na versao com arg Animal Mesmo que em tempo de execuo o objeto seja um Cavalo e no um Animal, a escolha de que mtodo ser invocado feita em tempo de compilao e no dinamicamente em tempo de execuo O tipo da varivel de referncia determina o mtodo que ser invocado
104
public class Animal { public void come() { System.out.println(Animal generico comendo"); } } public class Cavalo extends Animal { public void come() { System.out.println(Cavalo comendo feno"); } public void come(String s) { System.out.println(Cavalo comendo " + s); } }
105
106
Podemos usar uma varivel de referncia de um tipo mais genrico para referenciar um objeto de um tipo mais especfico (Animal a = new Cao()) O que acontece se quisermos usar a referncia a para invocar um mtodo que exclusivo da classe Cao (pois sabemos que um co)? Exemplo:
class Animal { void emiteSom() {System.out.println(som generico"); }} class Cao extends Animal { void emiteSom() {System.out.println(latido"); } void fingeDeMorto() { System.out.println(deita"); } } class CastTest2 { public static void main(String [] args) { Animal [] a = {new Animal(), new Cao(), new Animal() }; for(Animal animal : a) { animal.emiteSom(); if(animal instanceof Cao) { animal.fingeDeMorto();// tenta executar um comportamento de Cao } }}}
107
O cdigo do exemplo anterior no compila: A classe Animal no define o mtodo fingeDeMorto! Erro de compilao: cannot find symbol Cdigo corrigido
class Animal { void emiteSom() {System.out.println(som generico"); }} class Cao extends Animal { void emiteSom() {System.out.println(latido"); } void fingeDeMorto() { System.out.println(deita"); } } class CastTest2 { public static void main(String [] args) { Animal [] a = {new Animal(), new Cao(), new Animal() }; for(Animal animal : a) { animal.emiteSom(); if(animal instanceof Cao) { Cao c = (Cao) animal; // faz o cast da var. de referencia c.fingeDeMorto(); } }}}
108
Antes de chamar o mtodo especfico da classe Cao, precisamos criar uma varivel de referncia do tipo Cao para apontar para o objeto Cao Somente atravs de uma varivel do tipo Cao conseguimos acessar os mtodos exclusivos de um objeto Cao A operao chamada de downcast, pois a partir de um tipo mais genrico (Animal) obtivemos um tipo mais especfico (Cao)
109
O compilador apenas verifica se as duas classes envolvidas no cast pertencem mesma rvore de herana
Animal animal = new Animal(); Cao c = (Cao) animal; String s = (String) animal; // erro de compilao: inconvertible types
110
class Animal { } class Cao extends Animal { } class Test { public static void main(String [] args) { Cao c = new Cao(); Animal a1 = c; // upcast ok, cast implicito Animal a2 = (Animal) c; // upcast ok, cast explicito } }
Quando samos de um tipo mais especfico para um tipo genrico estamos fazendo upcast uma operao que restringe o acesso ao objeto em questo, pois o tipo genrico no conhece os mtodos exclusivos do tipo especfico O upcast funciona de modo implcito. Exemplo:
111
Tipos de retorno
A partir do Java 5, permitido mudar o tipo de retorno no mtodo da subclasse contanto que o tipo seja um subtipo do tipo de retorno declarado no mtodo da superclasse (que est sendo sobrescrito) o chamado retorno covariante Exemplo:
class Alpha { Alpha fazAlgo(char c) { return new Alpha(); } } class Beta extends Alpha { Beta fazAlgo(char c) {//sobrescrevendo o mtodo da classe Alpha return new Beta(); // OK, Beta um subtipo de Alpha } }
112
Tipos de retorno
Regras:
null pode ser retornado em um mtodo que retorne uma referncia para um objeto. Exemplo:
Um mtodo que retorna um tipo primitivo pode retornar qualquer valor que possa ser implicitamente convertido para o tipo declarado. Exemplo:
113
Tipos de retorno
Regras (continuao):
Um mtodo que retorna um tipo primitivo pode retornar qualquer valor que possa ser explicitamente convertido para o tipo declarado. Exemplo:
public int foo () { float f = 32.5f; return (int) f; }
114
Tipos de retorno
Regras (continuao)
Um mtodo que retorna uma referncia para um objeto pode retornar qualquer tipo de objeto que possa ser implicitamente convertido para o tipo declarado. Exemplo:
public Animal getAnimal() { return new Cavalo(); // Cavalo extends Animal }
115
Construtores e instanciao
Para criar um objeto em Java necessrio invocar o seu construtor Sempre que utilizamos a palavra-chave new estamos indicando que queremos executar o construtor do objeto Dois pontos chave:
Um construtor no tem tipo de retorno O nome do construtor deve bater exatamente com o nome da classe
Tipicamente nos construtores inicializamos o estado do objeto (atribuindo valores s suas variveis de instncia)
116
Construtores e instanciao
Exemplo:
class Foo { int size; String name; Foo(String name, int size) { this.name = name; this.size = size; } }
Invocando o construtor:
Foo f = new Foo(); // No compila Foo f = new Foo("Fred", 43); // Ok, argumentos batem com o construtor
117
Construtores e instanciao
1.
O que realmente acontece quando executamos a linha de cdigo Cavalo c = new Cavalo(); Dado que Cavalo estende Animal e Animal estende Object?
O construtor de Cavalo chamado. Todo construtor invoca o construtor da sua superclasse com uma chamada (implcita) a super(), a no ser que o construtor invoque um construtor sobrecarregado da mesma classe O construtor de Animal chamado (Animal superclasse de Cavalo) O construtor de Object chamado (Object superclasse de todas as classes, de forma que a classe Animal estende Object mesmo que no seja digitado "extends Object" na declarao da classe. implcito). Nesse ponto estamos no topo da pilha de execuo As variveis de instncia de Object so inicializadas com seus valores explcitos, que foram atribudos na declarao das variveis, como "int x = 27", onde "27" o valor explcito da varivel de instncia O construtor de Object chega ao fim. As varivel de instncia de Animal so inicializadas com seus valores explcitos O construtor de Animal chega ao fim As variveis de instncia de Cavalo so inicializadas com seus valores explcitos O construtor de Cavalo chega ao fim
118
2. 3.
4.
5. 6. 7. 8. 9.
Construtores e instanciao
119
Construtores e instanciao
Construtores podem usar qualquer modificador de visibilidade, incluindo private Construtores no devem ter tipo de retorno permitido ter um mtodo com o mesmo nome da classe, mas isso no o torna um construtor. Se h tipo de retorno, trata-se de um mtodo e no um construtor Se a classe no declarar um construtor, um construtor default ser automaticamente gerado pelo compilador
120
Construtores e instanciao
Regras para uso de construtores (continuao) O construtor default sempre um construtor sem argumentos Se queremos um construtor sem argumentos e foram declarados outros construtores (com argumentos) na classe, o compilador no fornecer o construtor sem argumentos. Todo construtor tem como sua primeira linha de cdigo ou uma chamada a um construtor sobrecarregado (this()) ou uma chamada para o construtor da superclasse (super()), e essa ltima pode ser automaticamente inserida pelo compilador
121
Construtores e instanciao
Regras para uso de construtores (continuao) Se a classe declara explicitamente um construtor, e no for digitada a chamada a super() ou uma chamada para this(), o compilador ir inserir uma chamada sem argumentos a super(), e essa ser a primeira linha de cdigo do construtor Uma chamada para super() pode ser com ou sem argumentos No permitido fazer uma chamada a um mtodo de instncia ou acessar uma varivel de instncia at que o construtor de super termine a sua execuo
122
Construtores e instanciao
Apenas variveis e mtodos estticos podem ser acessados na chamada a super() ou a this(). (Ex: super(Animal.NOME) est OK, pois NOME declarado como static) As classes abstratas tem construtores, os quais so sempre chamados quando uma subclasse concreta instanciada Interfaces no tm construtores No permitido escrever cdigo que chama um construtor. Exemplo:
Construtores e instanciao
124
Construtores e instanciao
class Animal { Animal(String name) { } } class Cavalo extends Animal { Horse() { super(); // Erro de compilao! } }
Exemplo 2:
class Animal { Animal(String name) { } } class Cavalo extends Animal { } // Erro de compilao!
125
Construtores e instanciao
A subclasse obrigada a declarar um construtor e a invocar super passando os argumentos necessrios A subclasse no pode usar o construtor default fornecido automaticamente pelo compilador, pois esse construtor somente faz uma chamada sem argumentos a super
126
Construtores e instanciao
Sobrecarga (overload) de construtores Ocorre quando existem diferentes verses do construtor, cada uma delas tendo uma lista de argumentos distinta Exemplo:
127
O modificador static
Quando usar?
Quando a execuo do mtodo no tem nenhuma dependncia com o estado das variveis (atributos) dos objetos da classe. Ex: Classes com mtodos utilitrios Quando todas as instncias da classe precisam compartilhar o mesmo valor de um determinado atributo. Ex: Constantes (em conjunto com o modificador final) Variveis e mtodos estticos pertencem classe ao invs de pertencerem a qualquer instncia especfica H apenas uma cpia da varivel esttica na memria, ou seja, todas as instncias da classe enxergam o mesmo valor
Conceitos:
128
O modificador static
Exemplo 1:
class Sapo { static int contaSapo = 0; // Declara e inicializa a varivel esttica public Sapo() { contaSapo += 1; // Altera o valor da varivel } public static void main (String [] args) { new Sapo(); new Sapo(); new Sapo(); System.out.println(Contador igual a " + contaSapo); } }
O modificador static
Exemplo 2:
class Sapo { int contaSapo = 0; // Declara e inicializa a varivel de instncia public Sapo() { contaSapo += 1; // Altera o valor da varivel } public static void main (String [] args) { new Sapo(); new Sapo(); new Sapo(); System.out.println(Contador igual a " + contaSapo); } }
ERRO DE COMPILAO !!!!!
130
O modificador static
Um mtodo esttico no pode acessar variveis de instncia (no-estticas); Pelo mesmo motivo, um mtodo esttico no pode invocar mtodos de instncia
Varivel ou mtodo Esttico = = Varivel ou mtodo de Classe Varivel ou mtodo No-esttico = = Varivel ou mtodo de Instncia
Quando a JVM roda o mtodo main, ela no cria nenhuma instncia da classe
131
O modificador static
class Sapo { static int contaSapo = 0; // Declara e inicializa // a varivel esttica public Sapo() { contaSapo += 1; // Altera o valor da varivel } } class TestaSapo{
public static void main (String [] args) { new Sapo(); new Sapo(); new Sapo(); System.out.println(Contador igual a " + Sapo.contaSapo); }
}
132
O modificador static
class Animal { static void fazCoisas() { System.out.print("a "); } } class Cao extends Animal { static void fazCoisas() { // no um override System.out.print("d "); } public static void main(String [] args) { Animal [] a = {new Animal(), new Cao(), new Animal()}; for(int x = 0; x < a.length; x++) a[x].fazCoisas(); // invoca o mtodo esttico } }
Coeso e Acoplamento
Coeso
Determina se uma classe tem um propsito claro e responsabilidades bem definidas Classes altamente coesas so mais fceis de manter e tendem a ser reutilizadas Mede o quanto uma classe conhece dos detalhes de implementao das outras classes desejvel que as classes interajam entre si apenas atravs de suas APIs O encapsulamento favorece o baixo acoplamento
134
Acoplamento
Objetivos
135
Operadores
Atribuio Relacionais Instanceof Aritmticos Concatenao de Strings Incremento e Decremento Operador condicional (Ternrio) Lgicos
136
Operadores de Atribuio
So operadores de atribuio =, +=, -=, *= e /= Exemplo: y = y - 6; x = x + 2 * 5; Produz o mesmo resultado que: y -= 6; x += 2 * 5; // a expresso do lado direito sempre avaliada primeiro
137
Operadores de Atribuio
Imprime b is true O resultado de qualquer operao de atribuio o valor que est sendo atribudo O seguinte cdigo NO compila:
int x = 1; if (x = 0) { } // x == 0 corrige o programa
138
Operadores Relacionais
O resultado sempre um valor booleano (true ou false) H seis operadores: >, >=, <, <=, ==, e != == e != podem testar a igualdade de nmeros, caracteres, booleanos e variveis de referncia Quando os operandos so variveis de referncia, == retorna true somente se ambas as variveis apontam para o mesmo objeto na memria
139
Operadores de igualdade
import javax.swing.JButton; class CompareReference { public static void main(String[] args) { JButton a = new JButton("Exit"); JButton b = new JButton("Exit"); JButton c = a; System.out.println("a == b? " + (a == b)); System.out.println("a == c? " + (a == c)); } }
O operador instanceof
usado para determinar se um determinado objeto passa no teste IS-A contra um tipo especificado Somente pode ser usado para testar objetos contra tipos da sua mesma hierarquia Para interfaces, um objeto passa no teste de instanceof se qualquer superclasse implementar a interface especificada
141
O operador instanceof
Exemplo
class A { } class B extends A { public static void main (String [] args) { A myA = new B(); m2(myA); } public static void m2(A a) { if (a instanceof B) ((B)a).doBstuff(); // downcasting } public static void doBstuff() { System.out.println("'a' refers to a B"); } }
142
Operadores Aritmticos
Quatro operadores bsicos: soma (+), subtrao (), multiplicao (*) e diviso (/) O operador % retorna o resto da diviso As expresses so avaliadas da esquerda para a direita, a no ser que haja parnteses, ou a no ser que alguns operadores tenham maior precedncia Os operadores *, /, e % tm maior precedncia que + e 143
Concatenao de Strings
Realizada pelo operador + Se qualquer operando for uma String, o operador + far a concatenao dos operandos Se ambos os operandos forem numricos, o operador + far a soma aritmtica dos operandos
144
Concatenao de Strings
Exemplo 1
String animal = Cavalo " + branco";
Exemplo 2
String a = "String"; int b = 3; int c = 7; System.out.println(a + b + c); // imprime String37
Exemplo 3
String a = "String"; int b = 3; int c = 7; System.out.println(a + (b + c)); // imprime String10
145
Incremento de Decremento
So realizados com os operadores ++ e -O pr-incremento ou pr-decremento ocorre antes do valor ser utilizado na expresso O ps-incremento ou ps-decremento ocorre depois que o valor utilizado na expresso
146
Incremento de Decremento
Exemplo
class MathTest { static int players = 0; public static void main (String [] args) { System.out.println("players online: " + players++); System.out.println("The value of players is " + players); System.out.println("The value of players is now " + ++players); } }
Sada do programa:
Operador ternrio
Se a expresso for true, retorna o valor depois de ? Se a expresso for false, retorna o valor depois de :
148
Operadores lgicos
O exame cobra seis operadores: &, |, ^, !, && e || Operadores lgicos trabalham com duas expresses booleanas (exceto !) Os operadores && e & retornam true se os dois operandos so true Os operadores || e | retornam true se qualquer operando true && no avalia o operando da direita caso o operando da esquerda seja false
149
Operadores lgicos
|| no avalia o operando da direita se o da esquerda true Os operadores & e | sempre avaliam os dois operandos O operador ^ (ou-exclusivo) retorna true se exatamente um operando true O operador ! (negao) retorna o valor oposto ao valor do seu operando booleano
150
Operadores lgicos
Exemplo 1 int z = 5; if(++z > 5 || ++z > 6) z++; // z = 7 depois dessa linha Exemplo 2 int z = 5; if(++z > 5 | ++z > 6) z++; // z = 8 depois dessa linha
151
Objetivos
Utilizar os comandos if e switch Implementar loops com os comandos for, while e dowhile, e utilizar break e continue Utilizar try, catch e finally Reconhecer os efeitos das excees Reconhecer excees comuns Implementar cdigo com o comando assert
152
O comando if-else
Sintaxe bsica:
Exemplos
if (x > 3) { ystem.out.println(x maior que 3); } else { System.out.println(x nao e maior que 3); } if (x > 3) { y = 2; } // else opcional z += 8; a = y + x;
153
O comando if-else
Chaves so opcionais para blocos que contenham apenas uma expresso O seguinte cdigo:
if (x > 3) { y = 2; } z += 8; a = y + x;
equivalente a:
if (x > 3) y = 2; z += 8; a = y + x;
154
O comando if-else
If-else aninhados
if (price < 300) { buyProduct(); } else { if (price < 400) { getApproval(); } else { dontBuyProduct(); } } // Equivalente ao anterior if (price < 300) { buyProduct(); } else if (price < 400) { getApproval(); } else { dontBuyProduct(); }
155
O comando if-else
// Exemplo 1 int x = 1; if ( x == 3 ) { } else if (x < 4) {System.out.println("<4"); } else if (x < 2) {System.out.println("<2"); } else { System.out.println("else"); } // Exemplo 2 if (exam.done()) if (exam.getScore() < 0.61) System.out.println("Try again."); else System.out.println("Java master!"); // Exemplo 3 if (exam.done()) if (exam.getScore() < 0.61) System.out.println("Try again."); else System.out.println("Java master!");
156
O comando if-else
157
O comando if-else
ser
boolean if (x = int x = if (x =
158
O comando switch
Sintaxe bsica switch (expressao) { case constante1: bloco de codigo case constante2: bloco de codigo default: bloco de codigo }
159
O comando switch
Exemplo 1
int x = 3; switch (x) { case 1: System.out.println(x igual a 1); break; case 2: System.out.println(x igual a 2); break; case 3: System.out.println(x igual a 3); break; default: System.out.println(nao conheco x); }
160
O comando switch
Exemplo 2
enum Color {red, green, blue} class SwitchEnum { public static void main(String [] args) { Color c = Color.green; switch(c) { case red: System.out.print("red "); case green: System.out.print("green "); case blue: System.out.print("blue "); default: System.out.println("done"); } } }
161
O comando switch
A expresso de um switch somente aceita enum, byte, short, int, e char. No permitido fazer
long s = 30; switch(s) { case 12: // codigo aqui case 3: // mais codigo aqui }
162
O comando switch
O case deve testar um valor constante, que deve ser um literal, varivel final, ou ento uma expresso constante, incluindo um enum.
final int a = 1; final int b; b = 2; int x = 0; switch (x) { case a: // ok case b: // erro de compilacao! }
163
O comando switch
int temp = 90; switch(temp) { case 80 : System.out.println("80"); case 80 : System.out.println("80"); // Nao compila! case 90 : System.out.println("90"); default : System.out.println("default"); }
164
O comando switch
Se a condio no comando switch casa com algum case, a execuo ir percorrer todo o cdigo desde o case encontrado, at que um comando break ou o final do switch sejam alcanados. A palavra-chave default deve ser usada quando preciso executar cdigo quando nenhum dos cases casa com o valor condicional. Nesse caso, o bloco default ser executado, e se no contiver um break, o cdigo continuar a executar at o final do switch ou at que um break seja encontrado
165
While
Do-While
166
167
168
for (int x = 1; x < 2; x++) { System.out.println(x); // Ok } System.out.println(x); // Nao compila! x esta fora do escopo
Se uma varivel incrementada ou avaliada dentro do for, ela deve ser declarada antes do loop ou na declarao do for Uma varivel declarada na declarao do for ou criada dentro do bloco definido pelo for no pode ser acessada de fora do for Exemplo:
169
Declaraes vlidas
for (;;) { // nenhuma das tres partes e obrigatoria System.out.println("loop infinito"); } int i = 0; for (; i < 10;) { // somente a expressao condicional; funciona como while i++; // mais codigo aqui } for (int i = 0, j = 0; (i < 10) && (j < 10); i++, j++) { System.out.println("i = " + i + " j = " + j); } int b = 3; for (int a = 1; b != 1; System.out.println("iterate")) { b = b - a; }
170
Sintaxe
for(declaracao : expressao)
A expresso o array ou coleo a qual se deseja percorrer A declarao a varivel (escopo de bloco), cujo tipo compatvel com os elementos do array ou coleo. A varivel contm o valor do elemento de uma dada iterao
171
O novo for: for-each, enhanced for, for-in Simplifica a iterao sobre arrays e colees Exemplos
int[] a = { 1, 2, 3, 4 }; for (int x = 0; x < a.length; x++) // for basico System.out.print(a[x]); for (int n : a) // novo for System.out.print(n);
172
int x; long x2; Long [] La = {4L, 5L, 6L}; long [] la = {7L, 8L, 9L}; int [][] twoDee = {{1,2,3}, {4,5,6}, {7,8,9}}; String [] sNums = {"one", "two", "three"}; Animal [] animals = {new Dog(), new Cat()}; // declaracoes validas for(long y : la ) ; for(long lp : La) ; for(int[] n : twoDee) ; for(int n2 : twoDee[2]) ; for(String s : sNums) ; for(Object o : sNums) ; for(Animal a : animals) ; // declaracoes invalidas for(x2 : la) ; // x2 ja foi declarada for(int x2 : twoDee) ; // tipos incompativeis: array e int for(int x3 : la) ; // tipos incompativeis: long e int for(Dog d : animals) ; // nem todo animal e um cao
173
for (int i = 0; i < 10; i++) { System.out.println(entrei no loop"); if (foo.doStuff() == 5) { continue; } // mais codigo, que nao sera executado quando o if acima // for verdadeiro } boolean problem = true; while (true) { if (problem) { System.out.println(Houve um problema"); break; } }// mais codigo
174
// Ex 1 boolean isTrue = true; outer: // -> identificador valido for(int i=0; i<5; i++) { while (isTrue) { System.out.println("Hello"); break outer; } System.out.println("Outer loop."); } System.out.println("Good-Bye");
175
Um break provocar a interrupo da iterao atual do loop mais interno e a linha de cdigo seguinte ao loop ser executada Um continue provocar a interrupo da iterao atual do loop mais interno, a execuo da expresso da iterao e a avaliao da condio daquele loop, e, caso a condio seja true, o loop ser novamente executado Caso break ou continue sejam usados com label, provocaro efeito similar no loop marcado com o label, e no no loop mais interno
176
Tratamento de excees
Exceo == condio ou situao excepcional Uma exceo pode ser causada por vrios motivos: falha de hardware, falta de recursos da mquina, bugs Quando um evento que gera exceo ocorre em Java, dizemos que a exceo lanada (throw) O cdigo responsvel por tratar a exceo pega a exceo (catch)
177
Tratamento de excees
Sintaxe
try { // 1a linha de codigo da regiao protegida // Codigo aqui pode causar algum tipo de excecao } catch(MyFirstException) { // Codigo que trata essa excecao especifica } catch(MySecondException) { // Codigo que trata essa excecao } // Restante do codigo, nao protegido
178
Tratamento de excees
try { // codigo protegido } catch(MyFirstException) { // Codigo que trata essa excecao } catch(MySecondException) { // Codigo que trata essa excecao } finally { // Codigo de fechamento, limpeza e liberacao de recursos // eventualmente alocados no try } // mais codigo
179
Tratamento de excees
O bloco finally (opcional) sempre ser invocado, independente se uma exceo foi ou no lanada no try ou se foi ou no tratada no catch O nico caso de exceo regra finally sempre executado que um finally no ser executado caso a JVM seja desligada. Isto pode ocorrer se cdigo dos blocos try/catch chamarem System.exit() O fato de finally ser sempre executado no significa que ser sempre inteiramente executado. Cdigo no bloco finally pode lanar uma exceo ou executar um System.exit()
180
Tratamento de excees
// Ex 1: Ok try { // codigo protegido } finally { //libera recursos } // Ex 2: Erro try { // codigo protegido } // precisa de um catch ou finally System.out.println(hello"); // Ex 3: Erro try { // codigo protegido } // nao pode existir codigo entre try/catch System.out.println(sai do try"); catch(Exception ex) { }
181
Tratamento de excees
Propagao de excees
Excees no tratadas (apenas lanadas) se propagam atravs da pilha de chamadas, iniciando pelo mtodo que originou a exceo e terminando ou com o primeiro mtodo que tem um catch adequado para aquela exceo ou com a parada da JVM (que ocorre se a exceo chega a main(), e main() apenas a declara)
182
Tratamento de excees
183
Tratamento de excees
import java.io.*; public class ReadData { public static void main(String args[]) { try { RandomAccessFile raf = new RandomAccessFile("myfile.txt", "r"); byte b[] = new byte[1000]; raf.readFully(b, 0, 1000); } catch (FileNotFoundException e) { System.err.println("File not found"); System.err.println(e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println("IO Error"); System.err.println(e.toString()); e.printStackTrace(); } } }
184
Tratamento de excees
Todos os blocos catch devem estar ordenados do mais especfico para o mais geral. Se h um catch para IOException e outro para Exception, o catch de IOException deve vir primeiro no cdigo. Caso contrrio, a IOException seria tratada pelo catch(Exception e), pois um catch pode tratar a exceo especificada ou qualquer um de seus subtipos.
185
Tratamento de excees
Unchecked so as excees que herdam de RuntimeException Checked so as excees que herdam da classe Exception, e que no estendem RuntimeException
186
Tratamento de excees
As checked exceptions esto sujeitas regra declare ou trate. Qualquer mtodo que possa lanar uma checked exception (incluindo mtodos que invocam mtodos que podem lanar uma checked exception) devem ou declarar a exceo usando throws ou ento tratar a exceo com um bloco try/catch Subtipos de Error ou RuntimeException so ditos unchecked, de forma que o compilador no obriga a regra declare ou trate.
187
Tratamento de excees
possvel criar excees customizadas estendendo a classe Exception A exceo ser considerada como checked exception, e o compilador ir obrigar o cumprimento da regra declare ou trate Exemplo
class MyException extends Exception { }
188
Tratamento de excees
189
assert
Mecanismo fornecido pela linguagem a partir da verso 1.4 O uso de asserts permite que as proposies assumidas no cdigo sejam testadas em tempo de desenvolvimento e depurao
Asserts so habilitados durante a fase de testes e desabilitados durante produo O exame cobra conhecer como o mecanismo de assert funciona, como habilit-lo e quando usar e no usar asserts
190
assert
Exemplo
private void methodA(int num) { assert (num>=0); // lana um AssertionError // se o teste nao for true useNum(num + x); }
O assert permanece inativo a no ser que esteja ativado O cdigo em produo (assert desabilitado) executaria como se tivesse sido escrito assim:
assert
Sintaxe Forma 1 private void doStuff(){ assert (y > x); // codigo que assume que y e maior que x } Sintaxe Forma 2 private void doStuff() { assert (y > x): "y = " + y + " x = " + x; // codigo que assume que y e maior que x }
192
assert
void noReturn() { } int aReturn() { return 1; } void go() { int x = 1; boolean b = true; assert(x == 1); // ok assert(b); // ok assert true; // ok assert(x == 1) : x; // ok assert(x == 1) : aReturn(); // ok assert(x == 1) : new ValidAssert(); // ok assert(x = 1); // nao compila assert(x); // nao compila assert 0; // nao compila assert(x == 1) : ; // nao compila assert(x == 1) : noReturn(); // nao compila assert(x == 1) : ValidAssert va; // nao compila }
193
assert
assert vem por padro desabilitado em tempo de execuo Para habilitar a execuo com assert, utilizar a flag -ea ou enableassertions Exemplos:
java -ea com.ks.TestClass java -enableassertions com.ks.TestClass
194
assert
Para desabilitar o uso de asserts, utilizar a flag -da or disableassertions A desabilitao o mesmo que executar a classe sem usar a flag ea til para habilitar o assert em algumas classes do sistema e desabilitar em outras Exemplos:
java -da com.ks.TestClass java -disableassertions com.ks.TestClass
195
assert
possvel combinar as flags para ter assert habilitado para algumas classes e desabilitado para outras, ou o contrrio Exemplo: java -ea -da:MyClass TestClass Se a habilitao ou desabilitao for feita utilizando as flags sem argumentos, o efeito ser global
196
assert
No utilizar asserts para validar argumentos de mtodos pblicos No utilizar asserts que causem efeitos colaterais. Utilizar asserts mesmo em mtodos pblicos para validar que um bloco de cdigo em particular nunca ser alcanado. possvel usar assert false; para cdigo que nunca deve ser executado, de forma que um assertion error lanado imediatamente se o comando assert for executado
197
assert
Exemplos
public void doStuff(int x) { assert (x > 0); // uso inadequado // codigo que usa x } private void doMore(int x) { // uso apropriado assert (x > 0); // codigo que usa x } switch(x) { // uso apropriado case 1: y = 3; case 2: y = 9; case 3: y = 27; default: assert false; // essa situacao nunca deveria ocorrer! }
198
Objetivos
Utilizar atributos de classe e entender a inicializao de variveis de instncia Entender o escopo e a inicializao de variveis locais Utilizar primitivos e arrays Desenvolver cdigo que utiliza Wrappers e Autoboxing Determinar os efeitos da passagem de parmetros para mtodos Reconhecer quando objetos tornam-se elegveis para garbage collection
199
Como os elementos so armazenados na memria da mquina virtual Java Objetos e Variveis de instncia vivem na heap Variveis locais vivem na stack Entender esse funcionamento til para resolver diversas questes do exame
200
201
name = dogName;
} }
202
203
Literais
Decimais int tamanho = 343; Octais int num = 011; (colocar um zero na frente do nmero) Hexadecimais int x = 0x7fffff; (equivalente a 0X7ffFfF) long n = 110600L (equivalente a 110600l)
204
Literais
Nmeros de ponto flutuante so definidos como um nmero, um smbolo decimal (sempre um ponto (.)) e mais nmeros:
double d = 11301874.9881024;
205
Literais
Booleanos
true e false boolean t = true; // Legal boolean f = 0; // Erro de compilao
Caracteres
char a = 'a'; char b = '@';
206
Corrigindo:
class Casting { public static void main(String [] args) { int x = (int)3957.229; // operao vlida System.out.println("int x = " + x); // imprime int x = 3957 } }
207
Exemplo:
class ValueTest { public static void main (String [] args) { int a = 10; // Atribui um valor a a System.out.println("a = " + a); int b = a; b = 30; System.out.println("a = " + a + " apos alteracao em b"); }
208
Exemplo:
Button b = new Button();
A linha de cdigo acima faz trs operaes: Cria uma nova varivel de referncia chamada b, do tipo Button Cria um novo objeto Button na heap e atribui o objeto recm criado varivel de referncia b
209
Exemplo:
Button b = null;
A linha de cdigo acima faz trs operaes: Cria uma nova varivel de referncia chamada b, do tipo Button Faz com que a varivel b no aponte para nenhum objeto
210
Exemplo
import java.awt.Dimension; class ReferenceTest { public static void main (String [] args) { Dimension a = new Dimension(5,10); System.out.println("a.height = " + a.height); Dimension b = a; b.height = 30; System.out.println("a.height = " + a.height + " apos mudanca de b"); } }
Sada do programa
a.height = 10 a.height = 30 apos mudanca de b
211
Escopo de variveis
class Layout { static int s = 343; // varivel esttica int x; // varivel de instncia { x = 7; int x2 = 5; } // bloco de inicializao Layout() { x += 8; int x3 = 6;} // construtor void doStuff() { int y = 0; // varivel local for(int z = 0; z < 4; z++) { // bloco de iterao y += z + x; } } }
212
Escopo de variveis
Regras bsicas:
Variveis estticas possuem o escopo mais duradouro; Variveis de instncia so criadas quando uma nova instncia criada, e sobrevivem at que a instncia seja coletada pelo garbage collector Variveis locais sobrevivem apenas no contexto do mtodo em que so declaradas Variveis de bloco sobrevivem apenas enquanto o bloco est executando
213
Escopo de variveis
Exemplo:
class ScopeErrors { public static void main(String [] args) { ScopeErrors s = new ScopeErrors(); s.go(); } void go() { int y = 5; go2(); y++; // assim que go2() terminar, y volta a estar no escopo } void go2() { y++; // erro de compilao: cannot find symbol } }
214
O programador tem a opo de deixar a varivel no-inicializada Neste caso, a varivel assume um valor padro quando uma nova instncia criada
215
public class Data { int ano; // Varivel de instncia primitiva public static void main(String [] args) { Data d = new Data(); d.mostraAno(); } public void mostraAno() { System.out.println(O ano " + ano); } }
public class Livro { private String titulo; // Varivel de instncia de referncia public String getTitulo() { return titulo; } public static void main(String [] args) { Livro b = new Livro(); System.out.println"O titulo + b.getTitulo()); } }
Sada do programa:
ano[0] = 0 ano[1] = 0 ... ano[98] = 0 ano[99] = 0
218
Se a varivel array est inicializada, os seus elementos esto tambm inicializados, com os mesmos valores padro que receberiam caso fossem variveis de instncia Os elementos de um array so sempre inicializados com valores padro, independente do tipo de varivel do array
219
Se a varivel no for inicializada, ocorrer erro de compilao na primeira tentativa de uso da varivel
220
public class TimeTravel { public static void main(String [] args) { int ano; // variavel local (declarada mas nao inicializada) System.out.println("O ano " + ano); // ERRO! Variable may not have // been initialized }}
Exemplo 2: Compila OK
public class TimeTravel { public static void main(String [] args) { int ano; // declarada mas nao inicializada int dia; // declarada mas nao inicializada System.out.println("Entre no portal"); ano = 2050; // Atribui um valor System.out.println("Bem vindo ao ano " + ano); }}
221
import java.util.Date; public class TimeTravel { public static void main(String [] args) { Date date; if (date == null) // Erro de compilao! System.out.println("date is null"); } }
Quando passamos um objeto como parmetro para um mtodo, estamos na realidade passando uma referncia para o objeto e no o objeto em si IMPORTANTE: Quando a varivel de referncia passada para o mtodo, o mtodo recebe uma cpia da varivel Tanto o mtodo chamado quanto o cdigo chamador tero cpias idnticas da referncia para o objeto, apontando para o mesmo objeto na memria
223
Sada do programa:
Antes de altera()
d.height = 10 dim = 11
Apos altera()
d.height = 11
224
A passagem por valor! Uma cpia da referncia passada como parmetro para o mtodo Como o chamador e o mtodo chamado ambos possuem cpias idnticas da varivel, qualquer mudana feita no objeto ser visvel no contexto do chamador.
225
ATENO:
O mtodo chamado no capaz de alterar o valor da varivel original (do cdigo chamador) Exemplo:
void bar() { Foo f = new Foo(); doStuff(f); } void doStuff(Foo g) { g.setName("Boo"); g = new Foo(); }
Fazer a varivel g apontar para um novo objeto, no faz f apontar para um novo objeto!
226
int a = 1; ReferenceTest rt = new ReferenceTest(); System.out.println(Antes de altera() a = " + a); rt.altera(a); System.out.println("Apos altera() a = " + a);
} void altera(int number) {
Sada do programa:
Antes de altera() a = 1 number = 2 Apos altera() a = 1
227
Arrays
Conceitos
228
Arrays
Conceitos
Um array um objeto em Java que armazena mltiplas variveis de um mesmo tipo Todo array um objeto. Mesmo um array de primitivos um objeto na memria
229
Arrays
Instanciando um array
Instanciar um array significa criar um novo objeto array na memria O tamanho do array (nmero de elementos) deve ser especificado neste momento Exemplo:
int[] teste; // Declara um array de ints teste = new int[4]; // Constroi o array e // atribui a variavel teste
230
Arrays
Quantos objetos so criados na memria depois que as linhas de cdigo a seguir executarem?
231
Arrays
Arrays multidimensionais
int[][] myArray = new int[3][]; // declara e constroi um array de 2 dimensoes do tipo int myArray[0] = new int[2]; myArray[0][0] = 6; myArray[0][1] = 7; myArray[1] = new int[3]; myArray[1][0] = 9; myArray[1][1] = 8; myArray[1][2] = 5;
232
Arrays
Arrays multidimensionais
233
Arrays
Inicializao
Inicializar o array significa atribuir valor aos seus elementos Array de primitivos: preencher cada elemento primitivo com o valor adequado
int[] x = new int[5]; x[4] = 2; // OK x[5] = 3; // Runtime exception: No existe ndice 5 // (ArrayIndexOutOfBoundsException) Array de objetos: atribuir a cada elemento uma referncia para um objeto do tipo (ou subtipo) do array Animal [] pets = new Animal[3]; pets[0] = new Animal(); pets[1] = new Animal(); pets[2] = new Animal();
234
Arrays
Cao[] meusCaes = new Cao[6]; for (int x = 0; x < meusCaes.length; x++) { meusCaes[x] = new Cao(); // atribui um novo Cao a posicao com indice x }
235
Arrays
236
Arrays
public class MeuTeste { void recebeUmArray(int [] umArray) { // use o parametro array } public static void main (String [] args) { MeuTeste o = new MeuTeste(); o.recebeUmArray(new int[] {7,7,8,2,5}); // cria um array // e passa como parametro }}
237
Arrays
238
Arrays
Array de objetos: permitido armazenar objetos de qualquer subclasse da classe declarada do array
class Car {} class Subaru extends Car {} class Ferrari extends Car {} ... Car [] myCars = {new Subaru(), new Car(), new Ferrari()};
Qualquer objeto que passe no teste IS-A executado com a classe declarada do array pode ser atribudo a um elemento do array
239
Arrays
Array de primitivos
int[] s; int[] d = new int[4]; char[] lex = new char[5]; s = d; // OK, d aponta para um array de ints s = lex; // Erro de compilacao, lex aponta para um array de char
240
Arrays
Array de objetos
Car[] carros; Honda[] carrosImportados = new Honda[5]; carros = carrosImportados; // OK, Honda IS-A Car Bebida[] bebidas = new Bebida[99]; carros = bebidas; // Erro de compilacao!
241
Blocos de inicializao
Os blocos de inicializao so executados quando a classe carregada pela primeira vez (blocos estticos) ou ento quando uma nova instncia da classe criada A ordem em que os blocos aparecem no cdigo da classe influencia no resultado
242
Wrappers
Permitir que tipos primitivos possam ser includos em operaes exclusivas de objetos, como ser adicionado a uma coleo ou ser retornado de um mtodo que retorna um objeto Fornecer uma gama de funes utilitrias para os tipos primitivos
243
Wrappers
244
Wrappers
245
Wrappers
Principais mtodos
toXxxString() permite converter um nmero na base 10 para uma String contendo a sua representao hexa, binria ou octal
String s3 = Integer.toHexString(254); // converte 254 para hexa System.out.println("254 igual a " + s3); // "254 igual a fe"
246
Autoboxing
No Java 5:
Integer y = new Integer(567); y++; System.out.println("y = " + y); // y = 568
247
Autoboxing
Exemplos de uso
class UseBoxing { public static void main(String [] args) { UseBoxing u = new UseBoxing(); u.go(5); } boolean go(Integer i) { // faz o boxing do int que foi passado Boolean ifSo = true; // faz o boxing do literal booleano Short s = 300; // faz o boxing do literal primitivo if(ifSo) { // faz o unboxing System.out.println(++s); // faz o unboxing, incrementa e depois // faz o boxing } return !ifSo; // faz o unboxing (retorno eh primitivo) } }
248
class AddBoxing { static void go(Integer x) { System.out.println("Integer"); } static void go(long x) { System.out.println("long"); } public static void main(String [] args) { int i = 5; go(i); // qual go() sera invocado? } }
Sada do programa:
long
249
class AddVarargs { static void go(int x, int y) { System.out.println("int,int");} static void go(byte... x) { System.out.println("byte... "); } public static void main(String[] args) { byte b = 5; go(b,b); // qual go() sera invocado? } }
Sada do programa:
int,int
250
class BoxOrVararg { static void go(Byte x, Byte y) { System.out.println("Byte, Byte"); } static void go(byte... x) { System.out.println("byte... "); } public static void main(String [] args) { byte b = 5; go(b,b); // qual go() sera invocado? } }
Garbage Collection
O garbage collector remove da heap os objetos que no so mais utilizados, liberando espao na memria Utiliza-se o mtodo System.gc() para invocar o garbage collector, mas a sua execuo no garantida
Essa chamada apenas solicita que o garbage collector seja executado A deciso de quando ele ser executado da JVM
Um objeto ser alvo do garbage collector caso no possa mais ser acessado, ou seja, quando no existirem mais referncias para ele
252
Objetivos
Utilizar colees Utilizar o pacote java.util para ordenao e busca Utilizar Comparable e Comparator Sobrescrever os mtodos equals() e hashCode() Distinguir equals() de = = Utilizar as verses genricas das colees, incluindo Set, List e Map Implementar mtodos genricos e utilizar tipos genricos
253
Colees
collection : uma estrutura de dados que armazena referncias para objetos Collection : interface contida no pacote java.util Collections : uma classe que contm mtodos teis (estticos)para colees
254
Colees
Operaes bsicas
Adicionar objetos ( add () ) Remover objetos ( remove () ) Verificar se um determinado objeto faz parte da coleo ( contains () ) Buscar objetos Percorrer a coleo ( iterator () )
255
Colees
256
Colees
257
Colees
List
Interface que herda da interface Collection Pode ter elementos duplicados Usa ndices Mantm a ordem de insero Classes que implementam List cobradas no exame um array que pode crescer dinamicamente Fornece iterao rpida e rpido acesso aleatrio um ArrayList mais lento (mtodos so synchronized) uma lista duplamente encadeada Boa para adicionar elementos s extremidades, isto , pilhas e filas
258
ArrayList
Vector
LinkedList
Colees
import java.util.*; public class TestArrayList { public static void main(String[] args) {
List<String> test = new ArrayList<String>(); String s = "hi"; test.add("string"); // adiciona elemento test.add(s); test.add(s+s); System.out.println(test.size()); // imprime tamanho System.out.println(test.contains(42)); // verifica existencia System.out.println(test.contains("hihi")); test.remove("hi"); // remove elemento System.out.println(test.size());
} }
259
Colees
A iterao em uma coleo pode ser feita ou com o enhanced for (foreach) ou ento utilizando um objeto Iterator e seus mtodos hasNext() e next() hasNext() determina se existem mais elementos; o iterador no se move next() retorna o prximo elemento e move o iterador para frente
260
Colees
Set
Interface que herda da interface Collection No permite elementos duplicados ( utiliza equals () ) Pode ou no ser ordenado Pode ou no manter a ordem de insero Classes que implementam Set cobradas no exame: HashSet
Acesso rpido, no mantm ordem de insero A iterao feita pela ordem de insero Mantm os elementos ordenados
LinkedHashSet
TreeSet
261
Colees
Usando Set
boolean[] ba = new boolean[5]; Set s = new HashSet(); ba[0] = s.add("a"); ba[1] = s.add(new Integer(42)); ba[2] = s.add("b"); ba[3] = s.add("a"); ba[4] = s.add(new Object()); for(int x=0; x<ba.length; x++) System.out.print(ba[x] + " ");
System.out.println("\n");
Colees
Map
Interface que no herda da interface Collection No permite chaves duplicadas ( utiliza equals () ) Pode ou no ser ordenado Pode ou no manter a ordem de insero
263
Colees
Map
No mantm ordem de insero Permite uma chave nula e vrios valores nulos um HashMap mais lento (como Vector, devido aos mtodos synchronized) No permite nem valores nem chaves nulas A iterao feita pela ordem de insero ou acesso (LRU least-recently used) Permite uma chave nula e vrios valores nulos Mantm os elementos ordenados
Hashtable
LinkedHashMap
TreeMap
264
Colees
Usando Map import java.util.*; class Dog { public Dog(String n) { name = n; } public String name; public boolean equals(Object o) { if((o instanceof Dog) && (((Dog)o).name == name)) { return true; } else { return false; } } public int hashCode() {return name.length(); } } class Cat { } enum Pets {DOG, CAT, HORSE }
265
Colees
266
Colees
Queue
Interface que herda da interface Collection Mantm os elementos ordenados por FIFO ou por prioridade Classes que implementam Queue cobradas no exame: PriorityQueue
Fila ordenada pela prioridade dos elementos Fila FIFO (first-in, first-out)
LinkedList
267
Colees
Usando PriorityQueue
import java.util.*; class PQTest { public static void main(String[] args) { int[] ia = {1,5,3,7,6,9,8 }; PriorityQueue<Integer> pq1 = new PriorityQueue<Integer>(); // usa ordem natural for(int x : ia) pq1.offer(x); // insere na fila for(int x : ia) System.out.print(pq1.poll() + " ");//remove da fila System.out.println(""); } }
268
Colees
Mtodos de PriorityQueue
offer() adiciona um elemento fila poll() remove a cabea da fila peek() retorna o valor da cabea da fila (sem remover)
269
Colees
Ordenao e Busca
As classes Collections e Arrays fornecem mtodos estticos para ordenao e busca em colees e arrays, respectivamente:
sort() : Ordena os elementos, alterando a coleo ou array existente binarySearch(): Faz uma busca binria em uma coleo ou array ordenado
270
Colees
Ordenao Exemplo
ArrayList<String> cidades = new ArrayList<String>(); cidades.add("Denver"); cidades.add("Boulder"); cidades.add("Vail"); cidades.add("Aspen"); cidades.add("Telluride"); System.out.println("desordenada " + cidades); Collections.sort(cidades); System.out.println("ordenada " + cidades);
} }
Resultado:
desordenada [Denver, Boulder, Vail, Aspen, Telluride] ordenada [Aspen, Boulder, Denver, Telluride, Vail]
271
Colees
O mtodo sort() recebe um parmetro do tipo List Os elementos armazenados na lista devem implementar uma interface chamada Comparable A classe String implementa Comparable, por essa razo possvel ordenar o ArrayList cidades do exemplo anterior
class DVDInfo { String title; String genre; String leadActor; DVDInfo(String t, String g, String a) { title = t; genre = g; leadActor = a; } }
272
Colees
class DVDInfo implements Comparable<DVDInfo> { String title; String genre; String leadActor; DVDInfo(String t, String g, String a) { title = t; genre = g; leadActor = a; } public int compareTo(DVDInfo d) { return title.compareTo(d.getTitle()); } public String getTitle() { return title; } }
Negativo Se o objeto menor que o outro objeto Zero Se o objeto igual ao outro objeto Positivo Se o objeto maior que o outro objeto
273
Colees
Ficamos restritos a um nico critrio de ordenao: no existe outro mtodo para implementar na interface Comparable Para incluir uma nova ordenao, preciso alterar o cdigo do mtodo compareTo() Se surgir uma nova classe cujos objetos precisem ser ordenados, temos que alterar o seu cdigo para implementar a interface Comparable
274
Colees
H uma verso sobrecarregada do mtodo sort() que recebe um List e um Comparator A interface Comparator define o mtodo compare(), que funciona com as mesmas regras do mtodo compareTo(), porm recebe como parmetro os dois objetos que sero comparados
275
Colees
Busca Exemplo
String [] sa = {"one", "two", "three", "four"}; Arrays.sort(sa); for(String s : sa) System.out.print(s + " "); System.out.println("\none = " + Arrays.binarySearch(sa,"one"));
} }
Se a busca encontrou o elemento procurado, retorna o ndice do elemento (iniciado em 0) Uma busca sem sucesso retorna um int que representa o ponto de insero (iniciado em -1) Para que a busca binria seja executada com sucesso, o array ou lista deve estar ordenado!
276
Mtodo equals( )
Utilizamos equals() para que dois objetos diferentes possam ser considerados iguais equals() serve para determinar se dois objetos so semanticamente equivalentes = = serve para determinar se duas variveis de referncia referem-se ao mesmo objeto
277
Mtodo equals( )
Exemplo 1
public class TesteEquals0{ public static void main(String[] args){ Pessoa p1 = new Pessoa("123"); Pessoa p2 = p1; System.out.println("p1.equals(p2)? "+ (p1.equals(p2))); System.out.println("p1 == p2? "+ (p1 == p2)); } } class Pessoa{ private String cpf; Pessoa(String sCpf){ cpf = sCpf; } public String getCpf(){ return cpf; } }
278
Mtodo equals( )
Exemplo 1 Resultado p1.equals(p2)? True p1 = = p2? True Pela implementao de Object, dois objetos s vo ser considerados semanticamente equivalentes se as referncias apontarem para o mesmo objeto!
279
Mtodo equals( )
Exemplo 2
public class TesteEquals1{ public static void main(String[] args){ Pessoa p1 = new Pessoa("123"); Pessoa p2 = new Pessoa("123"); System.out.println("p1.equals(p2)? "+ (p1.equals(p2))); System.out.println("p1 == p2? "+ (p1 == p2)); } } class Pessoa{ private String cpf; Pessoa(String sCpf){ Resultado cpf = sCpf; p1.equals(p2)? false } public String getCpf(){ p1 == p2? false return cpf; } }
280
Mtodo equals( )
Exemplo 3
Pessoa p1 = new Pessoa("123"); Pessoa p2 = new Pessoa("123"); System.out.println("p1.equals(p2)? "+ (p1.equals(p2))); System.out.println("p1 == p2? "+ (p1 == p2));
}
} class Pessoa{ private String cpf; Pessoa(String sCpf) { cpf = sCpf; } public String getCpf() { return cpf; } public boolean equals(Object o){ if ((o instanceof Pessoa) && (((Pessoa)o).getCpf().equals(cpf)))
Mtodo equals( )
282
Mtodo equals( )
equals() X hashing
Se equals() no for sobrescrito, os objetos no podero ser chaves de hash Strings e wrappers (Integer, Long, Boolean etc) sobrescrevem equals() e portanto so boas chaves de hash Utilizar o operador instanceof para ter certeza que a classe do objeto passado por parmetro apropriada Comparar os atributos significativos dos objetos
283
Sobrescrevendo equals()
Mtodo equals( )
Contrato de equals()
Reflexivo: x.equals(x) verdadeiro Simtrico: x.equals(y) verdadeiro se e somente se y.equals(x) verdadeiro Transitivo: Se x.equals(y) verdadeiro e y.equals(z) verdadeiro, ento x.equals(z) verdadeiro Consistente: Mltiplas chamadas a x.equals(y) sempre retornaro o mesmo resultado, dado que as informaes usadas na comparao no se alterem Nulo: Se x no nulo, ento x.equals(null) falso
284
Mtodo equals
um
contrato
conjunto
com
Se x.equals(y) verdadeiro, ento x.hashCode() = = y.hashCode() verdadeiro Se dois objetos so semanticamente equivalentes, o hashcode deles tem que ser igual Se equals() for sobrescrito, hashCode() tambm deve ser sobrescrito
285
Mtodo hashCode( )
um mtodo pblico da classe java.lang.Object public int hashCode() Retorna um valor inteiro associado ao objeto, de forma que o objeto possa ser utilizado em colees que usam hashing H questes no exame que pedem para identificar se uma determinada implementao do mtodo hashCode() adequada
286
Mtodo hashCode( )
287
Mtodo hashCode( )
Localizar o bucket utilizando o hashCode Inserir o objeto no bucket encontrado Utilizar o hashCode para encontrar o bucket correto Utilizar o mtodo equals() para encontrar o objeto dentro do bucket
288
Mtodo hashCode
} class Pessoa{ private String cpf; Pessoa(String sCpf) { cpf = sCpf; } public String getCpf() { return cpf; } public boolean equals(Object o){
289
Mtodo hashCode( )
Resultado:
p1.equals(p2)? true p1 == p2? false p1.hashCode() == p2.hashCode()? false p1.hashCode() == 26022015 p2.hashCode() == 3541984
290
Mtodo hashCode( )
Implementando hashCode()
class HasHash { public int x; HasHash(int xVal) { x = xVal; } public boolean equals(Object o) { HasHash h = (HasHash) o; if (h.x == this.x) { return true; } else { return false; } } public int hashCode() { return (x * 17); } }
291
Mtodo hashCode( )
Contrato de hashCode()
Consistente: mltiplas chamadas a x.hashCode() retornam o mesmo valor inteiro Se x.equals(y) verdadeiro, ento x.hashCode() == y.hashCode() verdadeiro Se x.equals(y) falso, ento x.hashCode() == y.hashCode() pode ser ou verdadeiro ou falso, mas falso tende a ser mais eficiente
292
Mtodo hashCode( )
Sobrescrevendo hashCode()
Variveis transientes (palavra-chave transient) no so adequadas para equals() e hashCode() Uma sobrescrita adequada de hashCode() respeita o contrato de hashCode() Uma sobrescrita eficiente de hashCode() distribui os elementos uniformemente pelos buckets permitido que um mtodo hashCode() retorne o mesmo valor para todas as instncias (embora muito ineficiente)
293
Generics
Permite que o programador force, em tempo de compilao, os tipos dos elementos inseridos em uma coleo (type safety) ArrayList de Strings, antes do Java 5
List myList = new ArrayList(); myList.add("Fred"); // OK, insiro uma String myList.add(new Dog()); // OK, tambem posso inserir um Dog myList.add(new Integer(42)); // OK, posso inserir um Integer ArrayList de Strings, a partir do Java 5 List<String> myList = new ArrayList<String>(); myList.add("Fred"); // OK, insiro uma String myList.add(new Dog()); // erro de compilacao!!
294
Generics
Quando uma coleo genrica usada, no necessria uma operao de cast para obter os elementos (get) da coleo. Com colees no-genricas, o cast requerido
List<String> gList = new ArrayList<String>(); List list = new ArrayList(); // mais codigo que adiciona elementos String s = gList.get(0); // nao necessita de cast String s = (String)list.get(0); // cast requerido
295
Generics
import java.util.*; public class TestLegacy { public static void main(String[] args) {
List<Integer> myList = new ArrayList<Integer>(); myList.add(4); myList.add(6); Adder adder = new Adder(); int total = adder.addAll(myList); System.out.println(total);
} } class Adder { // codigo legado int addAll(List list) { Iterator it = list.iterator(); int total = 0;
while (it.hasNext()) {
int i = ((Integer)it.next()).intValue(); total += i;
}
return total; }} 296
Generics
import java.util.*; public class TestBadLegacy { public static void main(String[] args) {
List<Integer> myList = new ArrayList<Integer>(); myList.add(4); myList.add(6); Inserter in = new Inserter(); in.insert(myList);
} } class Inserter { // codigo legado void insert(List list) {
297
Generics
Se o compilador reconhecer que um cdigo que no type safe pode alterar uma coleo originalmente type-safe, uma mensagem de warning ser lanada No Exemplo 2, ambas as chamadas ao mtodo add() na coleo recebida por parmetro so consideradas operaes no seguras e geram warning. As informaes de tipos genricos no existem em tempo de execuo as checagens so feitas apenas em tempo de compilao. Misturar generics com cdigo legado
298
Generics
Polimorfismo e Generics
Atribuies polimrficas aplicam-se apenas ao tipo base, no se aplicam ao tipo genrico O tipo declarado na varivel (lado esquerdo) deve casar com o tipo do objeto (lado direito)
Um ArrayList pode ser atribudo a uma varivel List, porm um ArrayList de Dog no pode ser atribudo a um List de Animal A regra da atribuio polimrfica aplica-se a toda situao na qual uma atribuio puder ser realizada. Os seguintes exemplos so ilegais:
void foo(List<Animal> aList) { } // no pode receber um List<Cao> List<Animal> bar() { } // no pode retornar um List<Cao>
299
Generics
Polimorfismo e Generics
Um ArrayList<Animal> pode armazenar referncias para objetos do tipo Cao, Gato ou qualquer outro subtipo de Animal (ou se Animal uma interface, qualquer classe que a implementa)
300
Generics
abstract class Animal { public abstract void checkup(); } class Dog extends Animal { public void checkup() { System.out.println("Dog checkup"); } } class Cat extends Animal { public void checkup() { System.out.println("Cat checkup"); } } class Bird extends Animal { public void checkup() { System.out.println("Bird checkup"); } }
301
Generics
Polimorfismo e Generics Exemplo 1 (continuao) public class AnimalDoctorGeneric { public void checkAnimals(List<Animal> animals) { for(Animal a : animals) { a.checkup(); } } public static void main(String[] args) {
List<Dog> dogs = new ArrayList<Dog>(); dogs.add(new Dog()); dogs.add(new Dog()); List<Cat> cats = new ArrayList<Cat>(); cats.add(new Cat()); cats.add(new Cat()); List<Bird> birds = new ArrayList<Bird>(); birds.add(new Bird()); AnimalDoctorGeneric doc = new AnimalDoctorGeneric(); doc.checkAnimals(dogs);doc.checkAnimals(cats);doc.checkAnimals (birds);
} }
302
Generics
AnimalDoctorGeneric.java:36: checkAnimals(java.util.List<Animal>) in AnimalDoctorGeneric cannot be applied to (java.util.List<Dog>) doc.checkAnimals(dogs); ^ AnimalDoctorGeneric.java:37: checkAnimals(java.util.List<Animal>) in AnimalDoctorGeneric cannot be applied to (java.util .List<Cat>) doc.checkAnimals(cats); ^ AnimalDoctorGeneric.java:38: checkAnimals(java.util.List<Animal>) in AnimalDoctorGeneric cannot be applied to (java.util.List<Bird>) doc.checkAnimals(birds); ^ 3 errors
303
Generics
Polimorfismo e Generics Exemplo 1 : Correo public class AnimalDoctorGeneric { public void checkAnimals(List<? extends Animal> animals) { for(Animal a : animals) { a.checkup(); } } public static void main(String[] args) {
List<Dog> dogs = new ArrayList<Dog>(); dogs.add(new Dog()); dogs.add(new Dog()); List<Cat> cats = new ArrayList<Cat>(); cats.add(new Cat()); cats.add(new Cat()); List<Bird> birds = new ArrayList<Bird>(); birds.add(new Bird()); AnimalDoctorGeneric doc = new AnimalDoctorGeneric(); doc.checkAnimals(dogs);doc.checkAnimals(cats);doc.checkAnimals (birds);
} }
304
Generics
O uso do caracter coringa ? (wildcard) permite que o mtodo aceite qualquer subtipo do tipo declarado no argumento:
void addD(List<Cao> d) {} // pode receber apenas <Cao> void addD(List<? extends Cao> d) {} // recebe <Cao> ou <Beagle>
A palavra-chave extends usada com sentido de extends ou implements. Ento em <? extends Cao>, Cao pode ser uma classe ou uma interface Ao usar List<?> ou List<? extends Cao>, a coleo pode ser acessada mas no modificada
305
Generics
Utilizar o caracter coringa combinado com a palavrachave super permite que a coleo seja acessada e modificada (add() permitido) No Exemplo 2, o compilador aceita qualquer lista (subtipo de List) cujo tipo genrico seja Dog ou um supertipo de Dog Uma coleo declarada com qualquer supertipo de Dog pode aceitar um Dog como elemento (regra da atribuio)
306
Generics
O uso de Generics tambm permite que o programador defina, em tempo de compilao, os tipos usados em classes e mtodos declarados com tipos genricos
307
Generics
import java.util.*; public class RentalGeneric<T> { private List<T> rentalPool; private int maxNum; public RentalGeneric(int maxNum, List<T> rentalPool) { this.maxNum = maxNum; this.rentalPool = rentalPool; } public T getRental() { return rentalPool.get(0); } public void returnRental(T returnedThing) { rentalPool.add(returnedThing); } } class Car { }
308
Generics
Declaraes de tipos genricos Exemplo (continuao) class TestRental { public static void main (String[] args) { Car c1 = new Car(); Car c2 = new Car(); List<Car> carList = new ArrayList<Car>(); carList.add(c1); carList.add(c2); RentalGeneric<Car> carRental = new RentalGeneric<Car>(2, carList); Car carToRent = carRental.getRental(); carRental.returnRental(carToRent); } }
309
Generics
public class TestGenerics<T> { T anInstance; T [] anArrayOfTs; TestGenerics(T anInstance) { this.anInstance = anInstance; } T getT() { return anInstance; } }
310
Generics
No cdigo acima, T no o tipo de retorno. Este mtodo retorna void, e para usar T dentro do argumento do mtodo deve ser declarado <T>, o que deve ocorrer ANTES do tipo de retorno
311
Generics
A palavra-chave extends tambm pode ser utilizada na declarao do tipo genrico da classe ou mtodo, para determinar o conjunto de tipos que podem ser aceitos:
public class AnimalHolder<T extends Animal> { T animal; public static void main(String[] args) {
AnimalHolder<Dog> dogHolder = new AnimalHolder<Dog>(); // OK AnimalHolder<Integer> x = new AnimalHolder<Integer>(); // Erro!
312
Objetivos
Utilizar String, StringBuilder e StringBuffer Desenvolver cdigo de leitura e escrita de arquivos utilizando o pacote java.io Utilizar o pacote java.io para implementar serializao de objetos Implementar cdigo que trabalhe com datas, nmeros e valores monetrios Utilizar expresses regulares
313
Exemplo 2
String s = new String("abcdef");
Exemplo 3
String s = "abcdef";
314
Depois que um objeto String criado, ele nunca mais pode ser alterado
Se um novo objeto String for criado e no for atribudo a nenhuma varivel, ele ser perdido
315
Exemplo 1
class StringTest { public static void main(String [] args) { String x = "Java"; String y = x; System.out.println("y string = " + y); x = x + " Bean"; System.out.println("y string = " + y); } }
Resultado
y string = Java y string = Java
316
Exemplo 2
Resultado
Fred Fred
317
Exemplo 3
String x = "Java"; x = x.concat(" Rules!"); System.out.println("x = " + x); x.toLowerCase(); System.out.println("x = " + x); x = x.toLowerCase(); System.out.println("x = " + x);
Resultado
x = Java Rules! x = Java Rules! x = java rules!
318
charAt() Retorna o caracter localizado no ndice informado concat() Concatena duas Strings (idem ao +) equalsIgnoreCase() Determina a igualdade de duas Strings, ignorando maisculas e minsculas length() Retorna o nmero de caracteres da String replace() Substitui ocorrncias de um caracter por um novo caracter substring() Retorna um pedao da String toLowerCase() Retorna uma String com todos os caracteres em minsculas toString() Retorna o valor da String toUpperCase() Retorna uma String com todos os caracteres em maisculas trim() Remove espaos das extremidades da String
319
As classes java.lang.StringBuffer e java.lang.StringBuilder devem ser usadas quando houver necessidade de muita manipulao de Strings Utilizar a classe String nesse cenrio acabaria gerando muitos objetos String abandonados na memria
320
321
A classe StringBuffer tem a mesma API que a classe StringBuilder, porm os mtodos de StringBuilder no so synchronized
Os mtodos de StringBuilder tm execuo mais rpida que os mtodos de StringBuffer Utilizar StringBuilder sempre que possvel!
Ambos so mutveis podem ser alterados sem a necessidade de criao de um novo objeto O mtodo equals() no sobrescrito em nenhuma das duas classes.
322
323
Java I/O
324
Java I/O
Exemplo:
import java.io.*; class Writer1 { public static void main(String [] args) { try { boolean newFile = false; File file = new File("fileWrite1.txt"); System.out.println(file.exists()); newFile = file.createNewFile(); System.out.println(newFile); System.out.println(file.exists()); } catch(IOException e) { } } }
325
Java I/O
Objetos da classe File podem representar arquivos ou diretrios A classe File permite gerenciar (criar, renomear e excluir) arquivos e diretrios A criao de um novo objeto File no implica na criao de um novo arquivo no disco
326
Java I/O
import java.io.*; class Writer2 { public static void main(String [] args) { char[] in = new char[50]; int size = 0;
try {
File file = new File("fileWrite2.txt"); FileWriter fw = new FileWriter(file); // cria um arquivo no disco fw.write("howdy\nfolks\n"); fw.flush(); fw.close(); FileReader fr = new FileReader(file); size = fr.read(in); // le o arquivo inteiro! System.out.print(size + " "); // qtd bytes lidos for(char c : in) System.out.print(c); fr.close();
} catch(IOException e) { } }
} 327
Java I/O
O cdigo problemas:
do
exemplo
anterior
tem
dois
Tivemos que inserir quebras de linha manualmente Tivemos que criar um buffer de tamanho fixo para armazenar o contedo lido do arquivo
FileWriter e FileReader so classes de baixo nvel. Elas podem ser usadas para leitura e escrita de arquivos, porm geralmente so utilizadas encadeadas a outros objetos de java.io
328
Java I/O
As classes no pacote java.io foram projetadas para serem usadas encadeadas com outras classes comum encapsular um FileReader em um BufferedReader, de forma a ter acesso a mtodos de mais alto nvel comum encapsular um FileWriter em um BufferedWriter, de forma a ter acesso a mtodos de mais alto nvel
329
Java I/O
Leitura
File file = new File("fileWrite2.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String data = br.readLine();
330
Java I/O
Trabalhando com diretrios Exemplo 1 File myDir = new File("mydir"); myDir.mkdir(); File myFile = new File(myDir, "myFile.txt"); myFile.createNewFile();
331
Java I/O
Trabalhando com diretrios Exemplo 2 Suponha que exista um diretrio chamado pasta1 contendo um arquivo chamado lista.txt
File existingDir = new File(pasta1"); System.out.println(existingDir.isDirectory()); File existingDirFile = new File(existingDir, lista.txt"); System.out.println (existingDirFile.isFile()); FileReader fr = new FileReader(existingDirFile); BufferedReader br = new BufferedReader(fr); String s; while( (s = br.readLine()) != null) System.out.println(s); br.close();
332
Serializao de objetos
linguagem
para
Permite salvar o objeto e as suas variveis de instncia de uma forma simples Variveis transient no so serializadas (persistidas)!
333
Serializao de objetos
API bsica
334
Serializao de objetos
Exemplo:
import java.io.*; class Cat implements Serializable { } public class SerializeCat { public static void main(String[] args) { Cat c = new Cat();
try { FileOutputStream fs = new FileOutputStream("testSer.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(c); os.close(); } catch (Exception e) { e.printStackTrace(); } try { FileInputStream fis = new FileInputStream("testSer.ser"); ObjectInputStream ois = new ObjectInputStream(fis); c = (Cat) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); }
} }
335
Serializao de objetos
Uma classe deve implementar a interface Serializable para que seus objetos sejam serializados
FileOutputStream e FileInputStream so usadas para criar as streams de baixo nvel que as classes ObjectXxxStream utilizam
336
Serializao de objetos
class Dog implements Serializable { private Collar theCollar; private int dogSize; public Dog(Collar collar, int size) { theCollar = collar; dogSize = size; } public Collar getCollar() { return theCollar; } } class Collar implements Serializable { private int collarSize; public Collar(int size) { collarSize = size; } public int getCollarSize() { return collarSize; } }
337
Serializao de objetos
338
Serializao de objetos
Opo 1: No fazer nada. Ao tentar executar o cdigo da serializao, ser lanada a exceo java.io.NotSerializableException: Collar Opo 2: Declarar a varivel Collar como transient. Dessa forma, o objeto Dog ser serializado, porm o valor salvo para a varivel Collar ser null Opo 3: Implementar os mtodos writeObject() e readObject(). Nesse caso, as chamadas aos mtodos defaultWriteObject() e defaultReadObject() trataro da parte automtica da serializao
339
Serializao de objetos
Implementando a Opo 3
class Dog implements Serializable { transient private Collar theCollar; private int dogSize; public Dog(Collar collar, int size) {
341
A classe java.util.Date
Uma instncia da classe Date representa uma informao de data e hora Internamente armazena a data e hora como um long Representa o nmero de milissegundos decorridos desde 1 de janeiro de 1970 Date d1 = new Date(1000000000000L); Date now = new Date(); // agora
342
Construtores
A classe java.util.Calendar
A classe Calendar fornece um conjunto de mtodos para manipulao de datas, incluindo operaes como obter os dias da semana ou adicionar um nmero de meses ou anos a uma determinada data A classe Calendar uma classe abstrata: Instncias da classe Calendar devem ser criadas usando os mtodos factory (getInstance()) Os mtodos da classe Calendar cobrados no exame so: add(), que permite a adio/subtrao de vrios itens (minutos, dias, anos etc) a/de datas e roll(), que funciona como add() mas no provoca deslocamento dos componentes de maior ordem.
343
344
A classe java.text.DateFormat
Instncias da classe DateFormat devem ser criadas usando os mtodos factory (getInstance() e getDateInstance()) H vrios estilos de formatao disponveis na classe DateFormat Os estilos definidos em DateFormat podem ser aplicados em conjunto com vrios Locales para criar uma gama de resultados diferentes para uma determinada data O mtodo DateFormat.format() utilizado para criar Strings contendo datas formatadas
345
import java.text.*; import java.util.*; public class TestaDateFormat { public static void main(String[] args) {
Date d1 = new Date(1000000000000L); DateFormat[] dfa = new DateFormat[6]; dfa[0] = DateFormat.getInstance(); dfa[1] = DateFormat.getDateInstance(); dfa[2] = DateFormat.getDateInstance(DateFormat.SHORT); dfa[3] = DateFormat.getDateInstance(DateFormat.MEDIUM); dfa[4] = DateFormat.getDateInstance(DateFormat.LONG); dfa[5] = DateFormat.getDateInstance(DateFormat.FULL); for(DateFormat df : dfa) System.out.println(df.format(d1));
} }
346
A classe java.util.Locale
A classe Locale utilizada em conjunto com as classes DateFormat e NumberFormat Ambos os objetos DateFormat e NumberFormat podem ser criados com um Locale especfico e imutvel
347
Calendar c = Calendar.getInstance(); c.set(2010, 11, 14); // 14 de dezembro de 2010 // (mes comeca em 0) Date d2 = c.getTime(); Locale locIT = new Locale("it", "IT"); // Italia Locale locPT = new Locale("pt"); // Portugal Locale locUS = new Locale("en", "US"); // EUA DateFormat dfBR = DateFormat.getInstance(); // Locale default System.out.println("BR " + dfBR.format(d2)); DateFormat dfBRfull = DateFormat.getDateInstance(DateFormat.FULL); System.out.println("BR full " + dfBRfull.format(d2)); DateFormat dfIT = DateFormat.getDateInstance(DateFormat.FULL, locIT); System.out.println("Italia " + dfIT.format(d2)); DateFormat dfPT = DateFormat.getDateInstance(DateFormat.FULL, locPT); System.out.println("Portugal " + dfPT.format(d2)); DateFormat dfUS = DateFormat.getDateInstance(DateFormat.FULL, locUS); System.out.println("EUA " + dfUS.format(d2));
348
A classe java.text.NumberFormat
float f1 = 123.4567f; Locale locFR = new Locale("fr"); // Frana NumberFormat[] nfa = new NumberFormat[4]; nfa[0] = NumberFormat.getInstance(); nfa[1] = NumberFormat.getInstance(locFR); nfa[2] = NumberFormat.getCurrencyInstance(); nfa[3] = NumberFormat.getCurrencyInstance(locFR); for(NumberFormat nf : nfa) System.out.println(nf.format(f1));
349
Parsing e formatao
So padres utilizados para buscar dados dentro de grandes fontes de dados Exemplo
Buscar ocorrncias da String ab dentro da String abaaaba ab a expresso regular abaaaba a fonte de dados
350
Parsing e formatao
import java.util.regex.*; class RegexSmall { public static void main(String [] args) { Pattern p = Pattern.compile("ab"); // a expresso Matcher m = p.matcher("abaaaba"); // a fonte de dados boolean b = false; while(b = m.find()) { System.out.print(m.start() + " "); } } }
Resultado: 0 4
351
Parsing e formatao
regex permite a criao de padres de busca utilizando caracteres literais ou metacaracteres Metacaracteres permitem especificar critrios mais abstratos como dgitos ou espao Exemplo:
352
Parsing e formatao
import java.util.regex.*; class RegexSmall2 { public static void main(String [] args) { Pattern p = Pattern.compile("\\d"); // ATENCAO ao escape Matcher m = p.matcher("a12c3e456f"); boolean b = false; while(b = m.find()) { System.out.print(m.start() + " "); } } }
Resultado: 1 2 4 6 7 8
353
Parsing e formatao
354
Parsing e formatao
import java.util.regex.*; class Regex { public static void main(String [] args) { Pattern p = Pattern.compile(args[0]); Matcher m = p.matcher(args[1]); boolean b = false; System.out.println("Pattern is " + m.pattern()); while(b = m.find()) { System.out.println(m.start() + " " + m.group()); } } }
355
Parsing e formatao
[abc] Casa com uma letra a, b ou c [a-f] Casa com uma letra de a at f ER: [a-cA-c] Fonte de dados: cafeBABE Resultado: 0, 1, 4, 5, 6
Exemplo
356
Parsing e formatao
Usando quantificadores
+ : uma ou mais ocorrncias Exemplo 0[xX]([0-9a-fA-F])+ Procure por um 0x ou 0X, e em seguida por no mnimo uma ocorrncia de um dgito hexadecimal, ignorando maisculas e minsculas * : zero ou mais ocorrncias ? : uma ou nenhuma ocorrncia
Exemplo
Parsing e formatao
Tokenizao
o processo de dividir um dado delimitado em pedaos menores Os elementos so chamados de tokens e as Strings que separam os tokens so os delimitadores Os delimitadores podem ser caracteres simples como vrgulas ou ento complexas expresses regulares Pode ser feita com a classe Scanner ou com o mtodo String.split()
358
Parsing e formatao
Tokenizao com String.split() import java.util.*; class SplitTest { public static void main(String[] args) { String[] tokens = args[0].split(args[1]); System.out.println("count " + tokens.length); for(String s : tokens) System.out.println(">" + s + "<"); } }
359
Parsing e formatao
O mtodo String.split() tokeniza a String inteira de uma s vez, o que pode causar impacto de performance quando o dado muito grande A classe Scanner permite que um dado seja tokenizado a partir de um loop, e o processo pode ser interrompido conforme for conveniente
360
Parsing e formatao
boolean b2, b; int i; String s, hits = " "; Scanner s1 = new Scanner(args[0]); // delimitador default espao Scanner s2 = new Scanner(args[0]); while(b = s1.hasNext()) { s = s1.next(); hits += "s"; } while(b = s2.hasNext()) {
if (s2.hasNextInt()) { i = s2.nextInt(); hits += "i"; } else if (s2.hasNextBoolean()) { b2 = s2.nextBoolean(); hits += "b"; } else { s2.next(); hits += "s2"; }}
Parsing e formatao
So novidades do Java 5 dois mtodos utilizados para formatar dados: format() e printf(), ambos da classe PrintStream (o out em System.out uma instncia de PrintStream) A formatao de dados usando printf() (ou format()) realizada atravs de Strings de formatao que so associadas a argumentos primitivos ou Strings As Strings de formatao cobradas no exame so as seguintes:
Se o caracter de converso no casa com o tipo do argumento, uma exceo ser lanada em tempo de execuo (runtime exception)
362
Parsing e formatao
Sintaxe
%[arg_index$][flags][width][.precision]conversion char
Exemplos
System.out.printf("%2$d + %1$d", 123, 456); // 456 + 123 int i1 = -123; int i2 = 12345; System.out.format(">%+-7d< \n", i2); // >+12345 < System.out.printf(">%2$b + %1$5d< \n", i1, false); // >false + -123<
363
Objetivos
Iniciar novas threads Reconhecer os estados das threads e compreender o diagrama de estados Utilizar locking para evitar acesso concorrente Escrever cdigo que utiliza wait(), notify() e notifyAll()
364
Um objeto da classe java.lang.Thread Uma thread de execuo, que tem a sua prpria pilha de chamadas (call stack) Estendendo a classe java.lang.Thread Implementando a interface Runnable
365
class MyThread extends Thread { public void run() { System.out.println("job rodando na thread MyThread"); } }
366
367
A tarefa que a thread deve executar deve estar codificada no mtodo run() A execuo da thread ser feita usando uma pilha de chamadas especificamente designada a ela
368
Forma 2
MyRunnable r = new MyRunnable();// onde e defindo o job Thread t = new Thread (r); // onde o job e executado
369
Aps a criao do objeto Thread na heap, ainda no existe uma thread de execuo (nova pilha de chamadas) Uma thread construda mas no iniciada est no estado NEW
370
1.
Uma nova thread de execuo iniciada (com uma nova pilha de chamadas) A thread sai do estado NEW e vai para o estado RUNNABLE Quando a thread tiver a chance de executar, o mtodo run() ser executado (vai para o estado RUNNING)
371
372
No h garantia que as threads executaro na mesma ordem em que foram iniciadas (ordem de chamada dos mtodos start()) No h garantia que uma vez que uma thread comece a executar, ela continuar executando sem interrupes at que chegue ao fim A nica garantia dada pela JVM que todas as threads sero iniciadas e executaro o seu job por completo
373
papel do escalonador decidir qual deve ser a thread, dentre todas as disponveis, que deve estar em execuo Quando uma thread inicia sua execuo, a outra thread que estava executando volta ao pool de threads (runnable pool) Uma thread disponvel para execuo uma thread que est no estado RUNNABLE A ordem na qual as threads so escolhidas para execuo no garantida
374
Diagrama de estados
375
Diagrama de estados
O estado NEW
A instncia da Thread foi criada, mas o mtodo start() ainda no foi chamado Ainda no h uma thread de execuo!
376
Diagrama de estados
O estado RUNNABLE
A thread est disponvel para execuo (no est executando) A thread entra nesse estado pela primeira vez assim que o mtodo start() chamado A thread retorna para RUNNABLE depois de executar a sua vez ou ento depois de voltar do estado WAITING/BLOCKING
377
Diagrama de estados
O estado RUNNING
A thread foi selecionada pelo escalonador para ser executada H somente um modo de uma thread entrar no estado RUNNING: sendo escolhida pelo escalonador
378
Diagrama de estados
O estado WAITING/BLOCKING/SLEEPING
A thread ainda est viva, porm indisponvel para execuo A thread nesse estado pode estar esperando pela liberao de algum recursO, hibernando (sleeping) ou ento aguardando um evento gerado por outra thread (mecanismo de wait/notify)
379
Diagrama de estados
estado DEAD
A thread vai para o estado DEAD quando seu mtodo run() chega ao fim O objeto Thread ainda existir, mas a thread de execuo no A thread que deixou de ser thread no pode ser novamente iniciada (uma nova chamada a start() causa runtime exception)
380
Diagrama de estados
O mtodo esttico sleep(), da classe Thread, provoca uma pausa na execuo da thread (manda a thread ir dormir) A thread aps acordar retorna para RUNNABLE, ou seja, volta ao pool de threads disponveis para execuo Exemplo:
381
Diagrama de estados
Faz a thread atualmente em execuo voltar ao pool (estado RUNNABLE) para permitir que outras threads possam executar A thread pode no sair do estado RUNNING Se a thread sair do estado RUNNING, ela pode ser escolhida pelo escalonador para retornar execuo
382
Diagrama de estados
Faz a thread atualmente em execuo bloquear at que outra thread tenha finalizado a sua execuo Exemplo:
Thread t = new Thread(); t.start(); t.join();
A thread que executar o cdigo acima estar dizendo t deve terminar antes que eu possa executar novamente
383
Diagrama de estados
O seu mtodo run() termina chamado o mtodo wait() em um objeto A thread no consegue obter o lock de um objeto O escalonador decide interromper a execuo da thread e deixar outra thread executar
384
Sincronizao
Todo objeto em Java tem um lock Quando uma thread invoca um mtodo synchronized em um objeto, ela obtm o lock do objeto Como s h um lock por objeto, se uma thread obteve o lock, nenhuma outra poder obter at que a thread detentora do lock o libere. Somente a thread com o lock pode executar cdigo synchronized. A liberao do lock ocorre quando o mtodo synchronized chega ao fim
385
Sincronizao
public synchronized void doStuff() { System.out.println("synchronized"); } // Forma equivalente public void doStuff() { synchronized(this) { System.out.println("synchronized"); } }
Sincronizao
class ContaCorrente { private int saldo = 50; public int getSaldo() { return saldo; } public void realizaSaque(int valor) { saldo = saldo - valor; } }
Uma conta corrente possui dois correntistas: Fred e Lucy Eles querem realizar saques de $10,00, porm o saldo nunca pode ficar negativo
387
Sincronizao
public class AccountDanger implements Runnable { private ContaCorrente cc = new ContaCorrente(); public static void main (String [] args) {
AccountDanger r = new AccountDanger(); Thread one = new Thread(r); Thread two = new Thread(r); one.setName("Fred"); two.setName("Lucy"); one.start(); two.start();
} public void run() {
private void saca(int val) { if (cc.getSaldo() >= val) { System.out.println(Thread.cu rrentThread().getName() + " vai fazer um saque"); try { Thread.sleep(500);} catch(InterruptedException ex) { } cc.realizaSaque(val); System.out.println(Thread.cu rrentThread().getName() + " completou o saque"); }else System.out.println("Conta sem saldo para " + Thread.currentThread().getNa me() + " sacar: " + cc.getSaldo()); }
388
Sincronizao
Se a thread est tentando executar um mtodo synchronized mas o lock do objeto no est mais disponvel, a thread fica bloqueada A thread fica nesse estado at que o lock do objeto em questo seja liberado, quando ento ela retornar ao estado RUNNABLE
389
Esses mtodos tm que ser chamados a partir de um contexto sincronizado (mtodo ou bloco synchronized) Uma thread no pode invocar os mtodos wait() ou notify() em um objeto sem antes ter obtido o seu lock
390
Todo objeto em Java tem uma lista de threads que esto esperando por uma notificao do objeto Uma thread entra nessa lista ao chamar o mtodo wait() no objeto Uma vez na lista, a thread no executa mais nenhuma instruo at que o objeto alvo chame o mtodo notify()
391
synchronized(outroObjeto) { // obtem o lock em outroObjeto try { outroObjeto.wait(); // a thread libera o lock e espera // apos ser notificada, retoma a execucao aqui } catch(InterruptedException e){} }
Aps a chamada a wait() no objeto alvo, a thread libera o lock que tinha obtido, sai do estado RUNNING e vai para o estado WAITING Quando uma thread chama sleep() o lock no liberado! O mesmo se aplica aos mtodos yield() e join()
392
Quando notify() for chamado em outroObjeto, a thread que estava aguardando ficar novamente disponvel para execuo, ou seja, sai do estado WAITING e vai para o estado RUNNABLE Se vrias threads esto esperando na lista de outroObjeto, apenas uma ser escolhida, e a ordem de seleo no garantida
393
Utilizando notifyAll()
O mtodo notifyAll() permite que todas as threads esperando na lista do objeto retornem ao estado RUNNABLE Todas as threads sero notificadas e comearo a competir pela obteno do lock do objeto
394
Objetivos
396
Classes Internas
Classes internas padro Classes internas locais a mtodos (method-local) Classes internas annimas (anonymous) Classes internas aninhadas estticas (static nested classes)
397
Uma classe interna uma classe declarada dentro de outra classe Uma instncia da classe interna tem acesso a todos os atributos e mtodos da classe que a contm, mesmo aqueles definidos como private Sintaxe bsica
class MyOuter { private int x = 7; // inner class
class MyInner {
public void seeOuter() { System.out.println("Outer x is " + x); } } // fecha inner class } // fecha outer class
398
class MyOuter { private int x = 7; public void makeInner() { MyInner in = new MyInner(); in.seeOuter(); } class MyInner { public void seeOuter() { System.out.println("Outer x is " + x); } } }
399
public static void main(String[] args) { MyOuter mo = new MyOuter(); MyOuter.MyInner inner = mo.new MyInner(); inner.seeOuter(); } // Forma equivalente public static void main(String[] args) { MyOuter.MyInner inner = new MyOuter().new MyInner(); inner.seeOuter(); }
400
Uma classe interna padro faz parte da classe que a contm, da mesma forma que os atributos e mtodos da classe Os seguintes modificadores podem ser aplicados s classes internas:
401
class MyOuter2 { private String x = "Outer2"; void doStuff() { class MyInner { public void seeOuter() { System.out.println("Outer x is " + x); } // fecha metodo da inner class } // fecha declaracao da inner class MyInner mi = new MyInner(); // Deve vir apos a classe mi.seeOuter(); } // fecha metodo doStuff() da outer class } // fecha outer class
402
A classe interna no pode ser instanciada em nenhum outro bloco de cdigo a no ser no prprio mtodo na qual foi declarada Somente pode acessar parmetros ou variveis locais declarados como final Os nicos modificadores permitidos so abstract e final
403
Exemplos
class Popcorn { public void pop() { System.out.println("popcorn");} } class Food { Popcorn p = new Popcorn() { // declara uma classe que e subclasse de Popcorn
class MyWonderfulClass { void go() { Bar b = new Bar(); b.doStuff(new Foo() { public void foof() { System.out.println("foofy"); } // fim do metodo foof }); // fim da inner class e da chamada a b.doStuff() } // fim do go() } // fim da classe interface Foo { void foof(); } class Bar { void doStuff(Foo f) { } }
405
uma classe interna declarada com o modificador static A classe interna esttica no tem nenhum relacionamento com as instncias da classe que a contm O modificador static indica que a classe interna pode ser acessada por outras classes, sem que seja necessria a criao de uma instncia da classe que a contm
406
Exemplo
class BigOuter { static class Nest {void go() { System.out.println("hi"); } } } class Broom { static class B2 {void goB2() { System.out.println("hi 2"); } } public static void main(String[] args) { BigOuter.Nest n = new BigOuter.Nest(); n.go(); B2 b2 = new B2(); b2.goB2(); } }
407