Você está na página 1de 407

SCJP Sun Certified Java Programmer

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 em Java so case-sensitive: valor e VALOR so identificadores diferentes


3

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)

Usar substantivos para classes e adjetivos para interfaces Exemplo:


NotaFiscal Funcionario FileWriter Serializable

Convenes da Sun

Mtodos

Primeira letra minscula Formato camelCase Usar verbo+substantivo


getValor setAltura calculaFatorial

Variveis

Primeira letra minscula Formato camelCase


nomeFuncionario xmlComponent umFuncionario
6

Convenes da Sun

Constantes

TODOS os caracteres em maisculas Separados por underscore ( _ )


VALOR_MAXIMO VALOR_MINIMO

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

Regras para a criao de um arquivo .java


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

Regras para a criao de um arquivo .java

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 { }

Incluindo os modificadores de visibilidade:


public class Classe11 { } // compila sem erros protected class Classe11 { } // erro de compilao private class Classe11 { } // erro de compilao

Incluindo outros modificadores permitidos:


strictfp class Classe11 { } final class Classe11 { } abstract class Classe11 { }
13

Classes

Modificadores de visibilidade

Controlam o acesso s classes H quatro nveis de controle:


Default Public Protected Private

ATENO: H apenas trs modificadores! Apenas public e default se aplicam a classes


14

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(); }

Se a classe Locadora tentar instanciar um objeto da classe Automovel

Automovel a = new Automovel(); // erro de compilao!

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:

interface Voador { void voa(); // termina com um ; }

Uma interface como se fosse uma classe 100% abstrata. O compilador enxerga o cdigo da seguinte forma:

interface Voador { public abstract void voa(); // termina com um ; }


23

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

public abstract interface Dobravel { } public interface Dobravel { }

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

Os quatro nveis de controle de acesso se aplicam a atributos e mtodos:


public protected default private

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

Uma subclasse pode herdar um atributo ou mtodo de sua superclasse:

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

Como verificar se a classe A acessa atributos e mtodos da classe B


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

Acesso protected x acesso default

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

Acesso protected x acesso default

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

Acesso protected x acesso default

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

Outros modificadores utilizados na declarao de atributos e mtodos:


final abstract transient synchronized native strictfp static


43

Modificadores aplicados a mtodos

final

Impede que um mtodo seja redefinido (override) na subclasse Exemplo:


public final void exibeNome(){ System.out.println(SuperClasse); }

class SuperClasse {

} class SubClasse extends SuperClasse { // Ok! public void exibeNome(){ System.out.println(SubClasse); // erro de compilao } }

44

Modificadores aplicados a mtodos

final

Impede que um argumento de um mtodo seja modificado dentro do mtodo Exemplo:

public Record getRecord (String fileName, final int recordNumber) {}

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

Modificadores aplicados a mtodos

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:

public abstract void exibeNome();

46

Modificadores aplicados a mtodos

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

Modificadores aplicados a mtodos

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

Modificadores aplicados a mtodos

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

abstract static void calcula(); // erro de compilao!

49

Modificadores aplicados a mtodos

synchronized

Aplica-se somente a mtodos Pode ser combinado com qualquer um dos trs modificadores de acesso (ou quatro nveis de controle de acesso)

public synchronized Record getRecord(int recId) {}

native

Aplica-se somente a mtodos Aplica-se a classes e a mtodos, nunca a variveis

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:

Primitivos Referncias Arrays

52

Variveis

Tipos primitivos:

Podem ser variveis de classe (estticas), de instncia, parmetros de mtodos, tipos de retorno e variveis locais Exemplos:

byte b; boolean hasNext; int x, y, z; // declara trs variveis int

53

Variveis

Tipos primitivos:

Todos os primitivos so signed

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

Permitem especificar um domnio de valores para uma varivel

Declarao bsica:

enum DiaDaSemana { SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO, DOMINGO };

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

Exemplo de enum como atributo da classe:

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 admitem apenas nvel de acesso public ou default (igual a classes)


62

Enums

Construtores, mtodos e variveis no enum

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

Benefcios da Orientao a Objetos:


Flexibilidade Manutenibilidade

O programador deve codificar usando boas prticas

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

Como melhorar o cdigo?

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 } }

Os usurios da verso 2 no sabem mais utilizar a classe...


67

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

Relacionamento IS-A e HAS-A

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

Relacionamento IS-A e HAS-A

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

Relacionamento IS-A e HAS-A

Exemplo de uma hierarquia de classes


public class Vehicle { ... } public class Car extends Vehicle { ... } public class Subaru extends Car { ... }

"Car extends Vehicle" == "Car IS-A Vehicle." "Subaru extends Car" == "Subaru IS-A Car."

73

Relacionamento IS-A e HAS-A

No jargo de OO, temos:


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

Relacionamento IS-A e HAS-A

correto dizer Subaru IS-A Vehicle ?


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

Relacionamento IS-A e HAS-A

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

Relacionamento IS-A e HAS-A


public class Animal { } public class Cavalo extends Animal { private Sela umaSela; ... public void ajustaSela() { umaSela.ajustaSela(); // utiliza a referncia para a // classe Sela para delegar o // ajuste da Sela } } public class Sela { public void ajustaSela() { // cdigo que sabe como se ajusta uma sela } }
77

Relacionamento IS-A e HAS-A

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

Toda classe em Java estende a classe java.lang.Object

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"); } }

O programa imprime: they're not equal t1's an Object


79

Polimorfismo

Dada a classe

class Pessoa {}

Para qualquer objeto p da classe Pessoa:


p IS-A Pessoa == verdadeiro (p instanceof Pessoa) p IS-A Object == verdadeiro (p instanceof Object)

80

Polimorfismo

Variveis de referncia e objetos


Os objetos em Java so acessados atravs de variveis de referncia Pessoa p = new Pessoa (Joao);

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

Fatos sobre as variveis de referncia:

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() } }

O programa tem a seguinte sada: mostrando elemento mostrando elemento


84

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;

No cdigo acima, h apenas um objeto e quatro variveis de referncia

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

Sobrescrita de mtodos (Override)

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

Sobrescrita de mtodos (Override)


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"); } 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 } }
90

Sobrescrita de mtodos (Override)

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

Sobrescrita de mtodos (Override)

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

Sobrescrita de mtodos (Override)

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

Sobrescrita de mtodos (Override)

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

Sobrescrita de mtodos (Override)

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

Sobrescrita de mtodos (Override)

Ateno: Se um mtodo no pode ser herdado, no existe override


public class TestaAnimais { public static void main (String [] args) { Cavalo c = new Cavalo(); c.come(); // Ilegal pois Cavalo no herda come() } } class Animal { private void come() { System.out.println(Animal generico comendo"); } } class Cavalo extends Animal { }
96

Sobrescrita de mtodos (Override)

Invocando o mtodo sobrescrito (da superclasse) de dentro do mtodo da subclasse

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

Sobrescrita de mtodos (Override)

Dada a seguinte classe:


public class Animal { public void come() { } }

So exemplos de overrides invlidos:

private void come() { }

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

public void come() throws IOException { }

public void come(String comida) { }

public String come() { }

Sobrecarga de mtodos (Overload)

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

Sobrecarga de mtodos (Overload)

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

Sobrecarga de mtodos (Overload)

Dado o mtodo:

public void changeSize(int size, String name, float pattern) { }

So exemplos de overloads vlidos:


public public public throws

void changeSize(int size, String name) { } int changeSize(int size, float pattern) { } void changeSize(float pattern, String name) IOException { }

101

Sobrecarga de mtodos (Overload)

E quando os parmetros forem variveis de referncia?


class Animal { } class Cavalo extends Animal { } class UsaAnimais { public void fazAlgo(Animal a) { System.out.println(Entrei na versao com arg Animal");} public void fazAlgo(Cavalo c) { System.out.println("Entrei na versao com arg Cavalo"); } public static void main (String [] args) { UsaAnimais ua = new UsaAnimais(); Animal animalObj = new Animal(); Cavalo cavaloObj = new Cavalo(); ua.fazAlgo(animalObj); ua.fazAlgo(cavaloObj); } }

Ao rodarmos o exemplo, produzida a sada: Entrei na versao com arg Animal Entrei na versao com arg Cavalo

102

Sobrecarga de mtodos (Overload)

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

Sobrecarga de mtodos (Overload)

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

Sobrecarga de mtodos (Overload)

Sobrecarga, Sobrescrita e Polimorfismo

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

Sobrecarga de mtodos (Overload)

Sobrecarga, Sobrescrita e Polimorfismo

106

Cast de Variveis de Referncia


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

Cast de Variveis de Referncia


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

Cast de Variveis de Referncia

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

Cast de Variveis de Referncia


Ateno: O compilador sempre confia no programador! class Animal { } class Cao extends Animal { } class Test { public static void main(String [] args) { Animal animal = new Animal(); Cao c = (Cao) animal; // compila mas falha em tempo de execuo: ClassCastException } }

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

Cast de Variveis de Referncia


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:

public Button doStuff() { return null; }

Um array pode ser um tipo de retorno. Exemplo:

public String[] go() { return new String[] {"Fred", "Barney", "Wilma"}; }

Um mtodo que retorna um tipo primitivo pode retornar qualquer valor que possa ser implicitamente convertido para o tipo declarado. Exemplo:

public int foo() { char c = 'c'; return c; // char cabe em um int }

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

Pilha de chamadas aos construtores

119

Construtores e instanciao

Regras para uso de construtores

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:

class Cavalo { Cavalo() { } // construtor void fazAlgo() { Cavalo(); // Chamada ilegal } }


123

Construtores e instanciao

124

Construtores e instanciao

O que ocorre se o construtor da superclasse tiver argumentos? Exemplo 1:

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

Se a superclasse no define um construtor sem argumentos, duas coisas acontecem:

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

class Foo { Foo() { } Foo(String s) { } }

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); } }

Sada do programa: Contador igual a 3


129

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

Como acessar mtodos e variveis estticas?


Usar o ponto (.) aps o nome da classe Exemplo:

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

Mtodos estticos no podem ser sobrescritos

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 } }

Sada do programa: aaa


133

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

Utilizar os operadores da linguagem Java

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

O seguinte cdigo compila sem problemas:


boolean b = false; if (b = true) { System.out.println("b is true"); } else { System.out.println("b is false"); }

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

Quando os operandos so variveis de referncia

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)); } }

Sada do programa: a == b? false a == c? true


140

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:

players online: 0 The value of players is 1 The value of players is now 2


147

Operador ternrio

Possui trs operandos:


x = (expressao booleana) ? Valor1 : Valor2

Retorna um dos dois valores especificados dependendo da expresso booleana


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:

if (expressaoBooleana) { System.out.println(Entrei no if); }

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) // nao adere as convencoes da Sun y = 2; z += 8; a = y + x;

Cuidado com a indentao!

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

Cuidado com a indentao!

// 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

O comando if trabalha com expresses booleanas


int y = 5; int x = 2; if ((x > 3) && (y < 2) | doStuff()) { System.out.println("true"); }

Somente so aceitas expresses booleanas


int trueInt = 1; int falseInt = 0; if (trueInt) // ilegal if (trueInt == true) // ilegal if (1) // ilegal if (falseInt == false) // ilegal if (trueInt == 1) // ok if (falseInt == 0) // ok

157

O comando if-else

Cuidado com atribuies que podem confundidas com testes de igualdade:

ser

boolean if (x = int x = if (x =

x = false; true) { } // atribuicao, x sempre sera true 3; 5) { } // Nao compila!

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

No permitido ter dois cases que testam o mesmo valor

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"); }

permitido utilizar autoboxing

switch(new Integer(4)) { case 4: System.out.println("boxing is OK"); }

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

Os comandos while e do-while

While

int x = 2; while(x == 2) { System.out.println(x); ++x; }

Do-While

do { System.out.println("Inside loop"); // executado 1 vez } while(false);

166

Os comandos while e do-while

Declaraes vlidas e invlidas


= 1; (x) { } // Nao compila; x deve ser booleano (x = 5) { } // Nao compila; resulta no valor 5 (x == 5) { } // Ok, teste de igualdade, resultado booleano (true) { } // Ok

int x while while while while

167

O comando for bsico


Sintaxe for (/*Inicializao*/ ; /*Condio*/ ; /* Iterao */) { /* corpo do loop */ } Exemplos for (int i = 0; i<10; i++) { System.out.println("i = " + i); } for (int x = 10, y = 3; y > 3; y++) { }

168

O comando for bsico

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

O comando for bsico

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

O comando for aprimorado


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 comando for aprimorado


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

O comando for aprimorado

Declaraes vlidas e invlidas

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

O uso do break e continue

Exemplos sem label

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

O uso do break e continue

Exemplos com label


// Ex 2 outer: for (int i=0; i<5; i++) { for (int j=0; j<5; j++) { System.out.println("Hello"); continue outer; } // end of inner loop System.out.println("outer"); } System.out.println("Good-Bye");

// 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

O uso do break e continue

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

Uso do bloco finally

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

Declaraes vlidas e invlidas

// 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

Uma exceo um objeto da classe Exception

183

Tratamento de excees

Tratando uma hierarquia 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

Tratando uma hierarquia 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

As excees dividem-se em checked e unchecked

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

O objetivo de um assert testar se uma condio sempre verdadeira

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:

private void methodA(int num) { useNum(num + x); }


191

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

Declaraes vlidas e invlidas

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

Quando usar asserts

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

Mapa da memria Stack e Heap

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

Mapa da memria Stack e Heap

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

201

Mapa da memria Stack e Heap


class Collar { } class Dog { Collar c; // varivel de instncia String name; // varivel de instncia public static void main(String [] args) {

Dog d; // varivel local: d d = new Dog(); d.go(d);


} void go(Dog dog) { // varivel local: dog

c = new Collar(); dog.setName(Aiko");


} void setName(String dogName) { // varivel local: dogName

name = dogName;
} }
202

Mapa da memria Stack e Heap

203

Literais

Nmeros inteiros podem ser representados da seguinte forma em Java:


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

Todo literal inteiro um int por padro (32 bits)!

Literais

Nmeros de ponto flutuante so definidos como um nmero, um smbolo decimal (sempre um ponto (.)) e mais nmeros:
double d = 11301874.9881024;

Todo literal de ponto flutuante um double por padro (64 bits)!


float f = 23.467890; // Erro de compilao: possible loss of precision float g = 49837849.029847F; // OK, tem o sufixo "F (ou f)

205

Literais

Booleanos
true e false boolean t = true; // Legal boolean f = 0; // Erro de compilao

Caracteres
char a = 'a'; char b = '@';

So na verdade inteiros de 16 bits sem sinal (armazenam de 0 a 65535) Strings


String s = Curso SCJP;

206

Cast de tipos primitivos


class Casting { public static void main(String [] args) { int x = 3957.229; // Erro de compilao } }

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

Atribuio de tipos primitivos

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

Atribuio de variveis de referncia

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

Atribuio de variveis de referncia

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

Atribuio de variveis de referncia

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

Como o ciclo de vida das variveis em Java?

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

Inicializao de variveis de instncia

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

Inicializao de variveis de instncia

Variveis de instncia como tipos primitivos

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); } }

Sada do programa: O ano 0


216

Inicializao de variveis de instncia

Variveis de instncia como referncias para objetos

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: O titulo null


217

Inicializao de variveis de instncia

Variveis de instncia como arrays


public class Calendario { static int [] ano = new int[100]; // se int[] ano; ano seria null public static void main(String [] args) { for(int i=0;i<100;i++) System.out.println("ano[" + i + "] = " + ano[i]); } }

Sada do programa:
ano[0] = 0 ano[1] = 0 ... ano[98] = 0 ano[99] = 0
218

Inicializao de variveis de instncia

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

Inicializao de variveis locais

O programador obrigado a inicializar a varivel local

Se a varivel no for inicializada, ocorrer erro de compilao na primeira tentativa de uso da varivel

220

Inicializao de variveis locais


Variveis locais como tipos primitivos Exemplo 1: Erro de compilao

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

Inicializao de variveis locais

Variveis locais como variveis de referncia

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"); } }

Variveis de referncia locais nunca so inicializadas com o valor padro null

A linha Date date = null; resolve o erro


222

Passagem de parmetros - Objetos

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

Passagem de parmetros - Objetos


import java.awt.Dimension; class ReferenceTest { public static void main (String [] args) { Dimension d = new Dimension(5,10); ReferenceTest rt = new ReferenceTest(); System.out.println(Antes de altera() d.height = " + d.height); rt.altera(d); System.out.println(Apos altera() d.height = " + d.height); } void altera(Dimension dim) { dim.height = dim.height + 1; System.out.println("dim = " + dim.height); } }

Sada do programa:

Antes de altera()
d.height = 10 dim = 11

Apos altera()
d.height = 11
224

Passagem de parmetros - Objetos


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

Passagem de parmetros - Objetos

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

Passagem de parmetros - Primitivos


class ReferenceTest { public static void main (String [] args) {

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) {

number = number + 1; System.out.println("number = " + number);


} }

Sada do programa:
Antes de altera() a = 1 number = 2 Apos altera() a = 1
227

Arrays

Conceitos

Declarao Construo Inicializao

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

Efeitos da instanciao de arrays

Quantos objetos so criados na memria depois que as linhas de cdigo a seguir executarem?

int[] teste = new int[10]; Thread[] threads = new Thread[5];

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

Inicializando o array em um loop

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

Construindo e Inicializando em um nico comando (tipo 1)


Dog puppy = new Dog("Frodo"); Dog[] myDogs = {puppy, new Dog("Clover"), new Dog("Aiko")};

236

Arrays

Construindo e Inicializando em um nico comando (tipo 2)

Array annimo Exemplo de uso: Passar um array para um mtodo

int[] teste; teste = new int[] {4,7,2}; // nunca especificar o tamanho!

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

Atribuindo valores aos elementos do array


Array de primitivos int[] lista = new int[5]; byte b = 4; char c = 'c'; short s = 7; lista[0] = b; // OK, byte eh menor que int lista[1] = c; // OK, char eh menor que int lista[2] = s; // OK, short eh menor que int

238

Arrays

Atribuindo valores aos elementos do array

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

Atribuindo valores a variveis de referncia para 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

Atribuindo valores a variveis de referncia para 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

O cdigo de uma classe pode estar em:


Mtodos Construtores 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

Servem basicamente a dois propsitos:

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

Como criar um objeto Wrapper


Trs formas so cobradas no exame:
Integer i1 = new Integer(42);//recebe um int (primitivo associado) Integer i2 = new Integer("42");//recebe uma representacao do primitivo em forma de String Integer i3 = new Integer(tres"); // Runtime Exception: // NumberFormatException Integer i2 = Integer.valueOf("101011", 2); // converte 101011 // para 43 e atribui o valor 43 ao objeto Integer Float f1 = new Float(3.14f); // recebe um float (primitivo associado) Float f2 = new Float("3.14f"); Float f2 = Float.valueOf("3.14f");

245

Wrappers

Principais mtodos

xxxValue() obtm o valor do primitivo armazenado dentro do objeto Wrapper


Integer i2 = new Integer(42); int iPrimitivo = i2.intValue();

parseXxx() retorna um primitivo a partir de uma String que o representa


double d4 = Double.parseDouble("3.14");

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

Permite manipular os Wrappers de forma mais conveniente No Java 1.4:


Integer y = new Integer(567); int x = y.intValue(); x++; y = new Integer(x); System.out.println("y = " + y); // y = 568

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

Sobrecarga de mtodos Parte 2

Exemplo 1 - Sobrecarga com Autoboxing

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

Sobrecarga de mtodos Parte 2

Exemplo 3 - Sobrecarga com Var-args

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

Sobrecarga de mtodos Parte 2

Exemplo 4 - Sobrecarga com Autoboxing e Varargs

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? } }

Sada do programa: Byte, Byte


251

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

Trs significados para collection em Java

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

Os quatro tipos de colees cobrados no exame so:


Listas (List) Conjuntos (Set) Mapeamentos chave-valor (Map) Filas (Queue)

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

Usando List Exemplo com ArrayList

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

Iterao com iterator

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");

import java.util.*; class SetTest { public static void main(String[] args) {

for(Object o : s) System.out.print(o + " ");


} }
262

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

Classes que implementam Map cobradas no exame HashMap


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

Usando Map (continuao)


Map<Object, Object> m = new HashMap<Object, Object>(); m.put("k1", new Dog("aiko")); m.put("k2", Pets.DOG); m.put(Pets.CAT, "CAT key"); Dog d1 = new Dog("clover"); m.put(d1, "Dog key"); m.put(new Cat(), "Cat key"); System.out.println(m.get("k1")); String k2 = "k2"; System.out.println(m.get(k2)); Pets p = Pets.CAT; System.out.println(m.get(p)); System.out.println(m.get(d1)); System.out.println(m.get(new Cat())); System.out.println(m.size());
}

class MapTest { public static void main(String[] args) {

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

import java.util.*; class TestSort1 { public static void main(String[] args) {

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

Ordenao utilizando Collections.sort() Forma 1


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

Implementando a interface Comparable

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; } }

O mtodo compareTo() retorna um inteiro:


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

Problemas com a forma 1

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

Ordenao utilizando Collections.sort() Forma 2

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

import java.util.*; class SearchObjArray { public static void main(String [] args) {

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( )

um mtodo pblico da classe java.lang.Object public boolean equals(Object obj)

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));
}

public class TesteEquals{ public static void main(String[] args){

} 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)))

return true; return false;


} }
281

Mtodo equals( )

Resultado p1.equals(p2)? true p1 == p2? false

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

equals() tem hashCode()

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( )

Uso de hashCode Exemplo

287

Mtodo hashCode( )

Passos para a adio de um novo elemento


1. 2.

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

Passos para a busca de um elemento


1. 2.

288

Mtodo hashCode

Exemplo: Valor do hashCode dos objetos da classe Pessoa


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)); System.out.println("p1.hashCode() == p2.hashCode()? "+ (p1.hashCode() == p2.hashCode())); System.out.println("p1.hashCode() == "+ p1.hashCode()); System.out.println("p2.hashCode() == "+ p2.hashCode());
}

public class TesteHashCode0{ public static void main(String[] args){

} 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))) return true;


return false;

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

Misturando colees genricas com no-genricas Exemplo 1

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

Misturando colees genricas com no-genricas Exemplo 2

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) {

list.add(new Integer(42)); // OK list.add(new String(42)); // Tambem OK!


} }

297

Generics

Ao compilarmos o Exemplo 2, o compilador exibe a seguinte mensagem de warning:


Note: TestBadLegacy.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

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)

List<Animal> aList = new ArrayList<Animal>(); // ok List<Animal> aList = new ArrayList<Dog>(); // erro

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)

List<Animal> animals = new ArrayList<Animal>(); animals.add(new Cat()); // OK animals.add(new Dog()); // OK

300

Generics

Polimorfismo e Generics Exemplo 1

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

Polimorfismo e Generics Exemplo 1 : Erro de compilao

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

Declaraes de tipos genricos

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

Declaraes de tipos genricos Exemplo

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

O tipo declarado na classe pode ser utilizado de vrias maneiras:

public class TestGenerics<T> { T anInstance; T [] anArrayOfTs; TestGenerics(T anInstance) { this.anInstance = anInstance; } T getT() { return anInstance; } }

310

Generics

permitido declarar um mtodo genrico usando um tipo no definido na classe:


public <T> void makeList(T t) { }

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!

} } public <T extends Number> void makeArrayList(T t)

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

String, StringBuilder e StringBuffer


Criando uma nova String Exemplo 1


String s = new String(); s = "abcdef";

Exemplo 2
String s = new String("abcdef");

Exemplo 3
String s = "abcdef";

314

String, StringBuilder e StringBuffer

Depois que um objeto String criado, ele nunca mais pode ser alterado

Variveis de referncia para objetos String no so imutveis

Se um novo objeto String for criado e no for atribudo a nenhuma varivel, ele ser perdido

315

String, StringBuilder e StringBuffer

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

String, StringBuilder e StringBuffer

Exemplo 2

String s = "Fred"; String t = s; t.toUpperCase(); System.out.println(s); System.out.println(t);

Resultado
Fred Fred

317

String, StringBuilder e StringBuffer

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

String, StringBuilder e StringBuffer

Mtodos importantes da classe String


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

String, StringBuilder e StringBuffer

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

String, StringBuilder e StringBuffer

Cdigo que usa String

String x = "abc"; x = x.concat("def"); System.out.println("x = " + x); // x = abcdef

Cdigo que usa StringBuffer

StringBuffer sb = new StringBuffer("abc"); sb.append("def"); System.out.println("sb = " + sb); // sb = abcdef

321

String, StringBuilder e StringBuffer

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!

Os seguintes pontos aplicam-se tanto a StringBuffer quanto a StringBuilder:

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

String, StringBuilder e StringBuffer

Mtodos importantes das classes StringBuffer/ StringBuilder:


append() delete() insert() reverse() toString()

323

Java I/O

As classes do pacote java.io cobradas pelo exame so:


File FileReader BufferedReader FileWriter BufferedWriter PrintWriter

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

Os mtodos createNewFile() e mkDir() criam novos itens no sistema de arquivos

326

Java I/O

Leitura e escrita com FileReader e FileWriter Exemplo

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

Combinando as classes de java.io

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

Combinando as classes de java.io Exemplo Escrita


File file = new File("fileWrite2.txt"); FileWriter fw = new FileWriter(file); PrintWriter pw = new PrintWriter(fw); pw.println("howdy"); pw.println("folks");

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

Mecanismo fornecido pela persistir o estado dos 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

ObjectOutputStream.writeObject() // serializa ObjectInputStream.readObject() // deserializa

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

A interface Serializable apenas de marcao; no existem mtodos para serem implementados

FileOutputStream e FileInputStream so usadas para criar as streams de baixo nvel que as classes ObjectXxxStream utilizam

336

Serializao de objetos

Na serializao de Dog, seu objeto Collar tambm ser salvo?

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

O mecanismo de serializao de Java salva e restaura automaticamente todo o grafo de objetos

338

Serializao de objetos

E se a classe Collar no puder ser Serializable?

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) {

theCollar = collar; dogSize = size;


} public Collar getCollar() { return theCollar; } private void writeObject(ObjectOutputStream os) { try { os.defaultWriteObject(); os.writeInt(theCollar.getCollarSize()); } catch (Exception e) { e.printStackTrace(); } } private void readObject(ObjectInputStream is) { try { is.defaultReadObject(); theCollar = new Collar(is.readInt()); } catch (Exception e) { e.printStackTrace(); } } } 340

Datas, nmeros e valores monetrios

As classes cobradas pelo exame so:


java.util.Date java.util.Calendar java.text.DateFormat java.text.NumberFormat java.util.Locale

341

Datas, nmeros e valores monetrios

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

Datas, nmeros e valores monetrios

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

Datas, nmeros e valores monetrios

A classe java.util.Calendar Exemplo


Date d1 = new Date(1000000000000L); System.out.println("1st date " + d1.toString()); Calendar c = Calendar.getInstance(); c.setTime(d1); if(c.SUNDAY == c.getFirstDayOfWeek()) System.out.println("Sunday is the first day of the week"); System.out.println("trillionth milli day of week is " + c.get(c.DAY_OF_WEEK)); c.add(Calendar.MONTH, 1); Date d2 = c.getTime(); System.out.println("new date " + d2.toString() );
}

import java.util.*; class Dates2 { public static void main(String[] args) {

344

Datas, nmeros e valores monetrios

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

Datas, nmeros e valores monetrios

A classe java.text.DateFormat Exemplo

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

Datas, nmeros e valores monetrios

A classe java.util.Locale

Representa uma regio definida politica, cultural e geograficamente Construtores


Locale(String language) Locale(String language, String country)

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

Datas, nmeros e valores monetrios

A classe java.util.Locale Exemplo

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

Datas, nmeros e valores monetrios

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

Expresses Regulares (ER ou regex)

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

Expresses Regulares com as classes Pattern e Matcher

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:

Buscar ocorrncias de dgitos na String a12c3e456f

352

Parsing e formatao

Busca com metacaracteres Exemplo 1

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

So cobrados no exame os seguintes metacaracteres


\d : Dgito \s : Espao em branco \w : Palavra (letras, dgitos ou underscore)

354

Parsing e formatao

Busca com metacaracteres Exemplo 2

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

Especificando conjuntos de caracteres na ER


[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

\d\d\d([-\s])?\d\d\d\d Casa com 1234567, 123 4567 e 123-4567


357

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

Tokenizao com Scanner

import java.util.Scanner; class ScanNext { public static void main(String [] args) {

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"; }}

System.out.println("hits " + hits);}}


361

Parsing e formatao

Formatao com format() e printf()

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:

Flags: -, +, 0, , e ( Conversores: b (boolean), c (char), d (integer), f (float) e s (string)

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

Iniciando novas threads

Em Java, uma thread representa:


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

Uma thread pode ser definida de duas formas:


365

Iniciando novas threads

Estendendo a classe java.lang.Thread

class MyThread extends Thread { public void run() { System.out.println("job rodando na thread MyThread"); } }

366

Iniciando novas threads


Implementando a interface Runnable class MyRunnable implements Runnable { public void run() { System.out.println("job executando"); } }

367

Iniciando novas threads

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

Iniciando novas threads

Instanciando uma thread Forma 1

MyThread t = new MyThread();

Forma 2
MyRunnable r = new MyRunnable();// onde e defindo o job Thread t = new Thread (r); // onde o job e executado

369

Iniciando novas threads

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

Iniciando novas threads

Iniciando uma thread

MyRunnable r = new MyRunnable(); Thread t = new Thread (r); t.start();

1.

Quando o mtodo start() chamado:


2. 3.

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

Iniciando novas threads

372

Iniciando novas threads

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

Iniciando novas threads

O Escalonador da JVM (Thread Scheduler)

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

Transio para SLEEPING

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:

try { Thread.sleep(5*60*1000); // Dorme por 5 minutos } catch (InterruptedException ex) { }

381

Diagrama de estados

Transio para RUNNABLE com o mtodo yield()

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

Transio para BLOCKING com o mtodo join()

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

Uma thread sai do estado RUNNING quando:


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

possvel sincronizar um mtodo inteiro ou apenas um bloco de cdigo Exemplo

public synchronized void doStuff() { System.out.println("synchronized"); } // Forma equivalente public void doStuff() { synchronized(this) { System.out.println("synchronized"); } }

Variveis ou classes no podem ser declaradas com a palavra reservada synchronized


386

Sincronizao

Exemplo: Condio de corrida

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

Exemplo: Condio de corrida

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() {

for (int x = 0; x < 5; x++) { saca(10); // faz um saque de $10,00


if (cc.getSaldo() < 0) { System.out.println("limite estourou!");}} }

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

Comunicao entre threads

realizada utilizando os mtodos da classe Object:


wait() notify() notifyAll()

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

Comunicao entre threads

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

Comunicao entre threads

Chamando o mtodo wait()

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

Comunicao entre threads

Chamando o mtodo notify()


synchronized(this) { notify(); }

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

Comunicao entre threads

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

Comunicao entre threads


class Reader extends Thread { Calculator c; public Reader(Calculator calc) { c = calc; } public void run() { synchronized(c) { try { c.wait(); } catch (InterruptedException e) {} System.out.println("Total = " + c.total); }} public static void main(String [] args) { Calculator calculator = new Calculator(); new Reader(calculator).start(); new Reader(calculator).start(); new Reader(calculator).start(); calculator.start(); }} class Calculator extends Thread { int total; public void run() { synchronized(this) { for(int i=0;i<100;i++) total += i; System.out.println("Fim do calculo"); notifyAll(); System.out.println("Notificacoes enviadas"); }}} 395

Objetivos

Utilizar classes internas

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

Classes Internas padro


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

Classes Internas padro

Instanciando uma classe interna de dentro da classe que a contm

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

Classes Internas padro

Instanciando uma classe interna de fora da classe que a contm

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

Classes Internas padro

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:

final abstract public private protected static strictfp

401

Classe interna local de mtodo


declarada dentro de um mtodo Sintaxe bsica

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

Classe interna local de mtodo

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

Classe interna annima

Exemplos

class Popcorn { public void pop() { System.out.println("popcorn");} } class Food { Popcorn p = new Popcorn() { // declara uma classe que e subclasse de Popcorn

public void pop() { System.out.println("anonymous popcorn"); }


}; } interface Cookable { public void cook(); } class Food { Cookable c = new Cookable() { // declara uma classe que implementa a interface

public void cook() { System.out.println("anonymous cookable implementer"); }


}; }
404

Classe interna annima

Classes internas annima definida no argumento de um


mtodo

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

Classe interna Esttica

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

Classe interna Esttica

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