Apostila de Java - Certificacao

download Apostila de Java - Certificacao

If you can't read please download the document

Transcript of Apostila de Java - Certificacao

Captulo 1 - Fundamentos da LinguagemEsse captulo bastante significativo para a assimilao dos demais contedos, pois ataca todos os conceitos iniciais da linguagem Java, portanto estude-o com bastante cuidado e ateno !

Palavras-ChaveNa linguagem Java, 49 so as palavras chaves e voc dever memoriz-las. No tente fazer como fazamos no ensino fundamental para decorar a tabuada (como era difcio a do 9, lembra?), essa assimilao ser com o tempo, mesmo assim, d uma olha na lista a seguir, e observe que TODAS as palavras chaves so definidas em letras minsculas: byte double static synchronized implements default assert new this while short float abstract native extends switch const catch package for int public final void if case goto try import volatile long private strictfp class else break throws finally instaceof super char protected transient interface do continue throw return boolean

No tente decorar todas elas, tente entender o que elas fazem, isso ser possvel com o desenvolver dos captulos. LEMBRE-SE: null, false, true (No so palavras chaves, so valores literais!)

Tipos primitivos:byte short int long char float double boolean Inteiro de 8 bits com sinal Inteiro de 16 bits com sinal Inteiro de 32 bits com sinal Inteiro de 64 bits com sinal Carcter Unicode (16 bits sem sinal) Ponto flutuante de 32 bits com sinal Ponto flutuante de 64 bits com sinal Valor indicando true ou false

Modificadores de acesso:private protected public - Define que um mtodo ou variavel seja acessada somente pela prpria classe - Faz com que uma subclasse acesse um membro da superclasse, mesmo estando em pacotes diferentes - Faz com que um identificador possa ser acessado de qualquer outra classe.

Modificadores de classe, mtodos e varivel:abstract - Define uma classe abstrata class - Define a implementao de uma classe extends - Define qual a hierarquia de classes, quem a superclasse final - Faz com que um identificador no possa ser alterado implements - Faz com que uma classe implemente todos os mtodos de uma interface interface - Define uma interface native - Define que o mtodo ser escrito em linguagem nativa como C, C++ new - Instancia um novo objeto na pilha static - Defina um identificado de classe e no de instncia strictfp - Define que o mtodo esta segundo o padrao IEE754 synchronized - Define que um mtodo s poder ser acessado por uma nica thread por vez transient - Faz com que uma varivel no seja serializada volatile - Indica que uma varivel pode no ficar sincronizada ao ser usada por threads

Controle de Fluxo:break continue if else default switch case for do while return instanceof - Faz com que o fluxo seja desviado para o fim do bloco - Muda o curso do fluxo para a proxima iteracao do loop - Testa o valor lgico de uma condio - Indica qual o bloco que dever ser executado caso o teste feito pelo if seja falso - Bloco que ser executado caso nenhuma condio case satisfaa o swicth - Iniciar uma sequencia de testes para uma variavel a ser testada pelo case - Testa o valor de uma variavel indicada pelo switch - Usado para executar um bloco quantas vezes forem necessrias para satisfazer sua condio - Executa um bloco quantas vezes a condio se fizer verdadeira. A condio testada depois do bloco - Executa um bloco quantas vezes a condio se fizer verdadeira. A condio testada antes do bloco - Finaliza a execuo de um mtodo, podendo opcionalmente retornar um valor - Testa se um objeto instancia de uma classe qualquer

Tratamento de erros:catch finally throw throws try assert - Define o bloco de deciso que executar se por acaso ocorrer no bloco try uma exceo pr-definida - Bloco que sempre ser executado, mesmo que uma exceo seja lanada - Lana uma exceo - Indica que um mtodo pode lanar algum tipo de exceo - Iniciar um bloco com auditoria - Usado no projeto, testa uma expresso para verificar alternativas para o programador.

Controle de pacotes:import package - Importa uma ou todas as classes de um pacote - Define que a(s) classes faro parte de um pacote;

Variveis/Herana:super this - Refere-se a superclasse imediata - Refere-se a instncia do objeto

Retorno:void - Define que um mtodo no retorna nada

Reservadas mas no utilizadas:const goto - No use para definir uma varivel, use final - No serve para nada

Tipo primitivos:Voc precisar saber "tudo" sobre os tipos primitivos, suas faixas de valores, valores padres, converses implcitas e explcitas, e muito mais. Por isso, prepare-se o seu pesadelo comeou! Mas no se preocupe, com um pouco de f e perseverana, tudo se resolve!

A Java composta por 8 (oito) tipos primitivos, e como voc j deve ter percebido, todos comeam com letras minsculas (pois tambm so palavras chaves), portanto se voc for tiver que responder uma pergunta onde aparece perguntando por exemplo se String um tipo primitivo, no hesite em responder que NO! Outro conceito importante sobres os tipos primitivos em Java que todos os tipos numricos tem sinal. Mas o que isso significa? - deve ter vindo sua mente! Significa que podem ser negativos ( - ) ou positivos ( + ), ou seja, o tipo int pode ter o numero -1 como tambem o numero +1. Observe a tabela de valores abaixo: tipo bits 1. byte 2. short 3. int 4. long frmula -2^7 16 -2^31 -2^63 faixa 2^7 -1 -128 ~ +127 -2^15 2^15 -1 -32768 a +32767 2^31 -1 -2147483648 a +2147483647 2^63 -1 -922337203685... a +922337203685...

8 32 64

Dica sem nus: Lembre-se da palavrinha bsil (j est no Aurlio), que indica os tipos b-byte, s-short, i-int, l-long ! Pois "1 byte representado por 8 bits", isso at Hitler morreu sabendo! Entendendo essa frmula maluca... Voc deve estar se perguntando, porque deve elevar a 7 (sete) no caso do byte e no a 8 (oito), certo ? 1 Bit usado para guardar o sinal. E porque s subtrai -1 da faixa positiva ? Porque o zero includo no intervalo tambm. Se ainda ficou confuso, vamos fazer um teste. Um regra ns sabemos: o tipo byte em Java representado por oito bits. Se 1 bit usado para guardar o sinal (+) ou (-), ento sobrou 7 bits para representar um nmero. Se convertermos o nmero +125 em bits teremos 1111101 e ficaria representado da seguinte forma: 01111101 (observe que o zero inicial indica que um numero positivo, estranho mas se o primeiro digito fosse um 1, seria um numero negativo). Agora se convertermos o numero +128 em bits, teremos 10000000, como esse numero composto por oito bits no possvel adicionar o bit do sinal portanto o numero 128 positivo no est no intervalo do tipo byte, e est na faixa negativa pois o bit mais significativo a esquerda 1 que indica sinal negativo. Quais os bits representam o numero 127 ? Tipos primitivos (no acabou): Os demais tipos primitivos so: char, float, double, boolean ! char - representado por caracter Unicode de 16 bits (sem sinal). Tambem pode ser representado por um numero inteiro de 16 bits sem sinal, ou seja, pode-se atribuir uma variavel char o valor 100 ou 14555 ou 65535, mas no 65536 ! Pois essa a faixa de valores da tabela Unicode para representao de caracteres de qualquer idioma. Mas a unica coisa que voc precisa saber a faixa de valores do tipo char. 2 ^ 16 - 1 = 65535 (valores possveis). float - um tipo numrico ponto flutuante de 32 bits (COM SINAL) !! Apesar de ter um tamanho definido por 32 bits, no necessrio saber a faixa de valores. double - um tipo numrico ponto flutuante de 64 bits (COM SINAL) ! Apesar de ter um tamanho definido por 64 bits, no necessrio saber a faixa de valores. boolean - Um valor que indicado pelos valores literais: true ou false.

Converses implicitas/explcitas: Voc pode sempre que precisar, fazer converses entre os tipos numricos, mas uma regra no pode ser quebrada: nunca voc poder convertar um tipo de maior valor (bits) em um nmero de menos valor. Por exemplo: 1. public class Conversao { 2. public static void main(String[] args) { 3. int x = 10; 4. long y = 20; 5. y = x; // perfeitamente possvel 6. x = y; // no possvel 7. x = (int)y; // quero correr o risco e deixa eu queto ! 8. } 9. }

Na linha 5 houve um converso implicita perfeitamente possvel pois o tipo da variavel y long, ou seja, maior que o tipo da variavel x. Na linha 6 houve um tentativa de converso, mas o compilador no permitira essa operao, pois o tipo long maior que int. Na linha 7,uma converso explcita foi realizada e o compilador gentilmente atendeu a solicitao do programador.

Literais Inteiros:Um valor literal em Java um valor escrito no cdigo fonte e identificado como um tipo primitivo como por exemplo: 1. 2. 3. 4. int x = 10; char u = 'k'; boolean b = false; double d = 9832.11; // // // // literal literal literal literal inteiro char boolean double

H trs maneiras de representar valores inteiros em Java: octal (base 8), decimal (base 10) e hexadecimal (base 16) ! Ser bom voc estudar um pouco sobre esses sistemas de numerao, pode-se que os sacanas dos caras que fazem a prova, possa testar voc em alguma questo! Mas observe o cdigo abaixo e veja como se representam valores literais em octal e hexadecimal (pois decimal voc viu acima): 1. public class Octal { 2. public static void 3. int seis = 06; // 4. int sete = 07; // 5. int oito = 010; // 6. int nove = 011; // 1. } 7. } main(String[] args) { idem ao decimal 6 idem ao decimal 7 idem ao decimal 8 idem ao decimal 9

Ou seja, se voc ver o numero 0 antes de um nmero, saiba que est representando um nmero octal. 1. public class Hexadecimal { 2. public static void main(String[] args) { 3. int quinze = 0xF; // 15 (decimal) 4. int vinte_e_nove = 0x1D; // 29 (decimal) 5. int vinte_e_nove = 0x1D; // 29 (decimal) 6. int valor = 0xBAFAFA; // 12253946 (decimal) 7. int valor = 0XBaFaFa; // 12253946 (decimal) 8. } 9. } Deve vir precedido do sufixo (0x) ! um dos poucos casos na linguagem em que no importa se as letras forem maisculas ou minsculas. Todos os tipos inteiros literais (tanto octal quanto hexa) so por padro definidos como int, portanto se ver no exame um questo que atribui a uma variavel menor que int (em bits) isso dar erro de compilao. Veja o cdigo a seguir: 1. public class ConversaoHexa { 2. public static void main(String[] args) { 3. int a = 0xbafa; // ok, sem converso 4. long b = 0xfff; // ok, converso implicita 5. long c = 0xfffL; // ok, converso explcita 6. byte d = 0xf; // ok, converso implcita 7. byte e = 0xff; // erro! - 255 no comportado 8. byte f = (int)0xff; // erro! - 255 no comportado 9. } 10.} Na linha 6 o compilador sabe que F em hexa equivale a 15, o que pode ser perfeitamente suportado no tipo byte, ento ele realiza a converso. Na linha 7 o compilador sabe que FF em hexa equivale a +255 o que no pode ser suportado, por isso, erro! Na linha 8 o compilador s no chinga o programador por conflito de drivers entre seu sistema operacional com sua placa de som, ou seja, mas intimamente ele fala: CARA OLHA O QUE VOC EST QUERENDO ME FORAR A FAZER !!! (%# %$!#%)

Literais de ponto flutuante:Um valor literal de ponto flutuante por padro em Java definido com double de 64 bits, portanto de voc quiser atribuir um valor literal float voc dever adicionar o sufixo f no final do valor como o exemplo:

1. public class Teste { 2. public static void main(String[] args) { 3. double a = 9223372036854775807.0; // 4. float b = 2147483647; // 5. float c = 2147483647.0; // 6. float d = (float)2147483647.0; // 7. float e = 2147483647.0f; // 8. } 9. }

ok tipo double ok tipo int para float conv implicita erro! double -> float ok - converso ok

Na linha 4, funciona pois 2147483647 um literal int e no double! No tem decimal ! Na linha 5, o compilador reclamar pois 2147483647.0 um tipo double (o padro dos literais de ponto flutuante) no pode ser atribudo a uma varivel float. Na linha 6 feito uma converso explcita. Na linha 7 atribudo um valor float por causa do sufixo f Literais booleanos: Os valores literais booleanos so compreendidos entre true ou false e s ! 1. public class LitBoo { 2. public static void main(String[] args) { 3. boolean a = true; // ok 4. boolean b = false; // ok 5. boolean c = 1; // erro de compilacao 6. } 7. }

Cuidado que em Java diferentemente de C e outras linguagens no se pode atribuir o valor 0 ou 1 para literais booleanos. Literais Caracteres: Os valores literais caracteres so compreendidos com um nico caracter entre apstrofo - se voc no sabe o que apstrofo, o mesmo que aspas simples ' 1. public class Carac { 2. public static void main(String[] args) { 3. char a = 'a'; // ok 4. char b = '@'; // ok 5. char c = '\u004E'; // refere-se a letra N 6. } 7. } Como foi falado, o tipo char nada mais do que um tipo inteiro sem sinal de 16 bits, portanto voc poder atribuir 2 ^ 16 - 1 = 65535. Veja no cdigo abaixo: 1. public class A { 2. public static void main(String[] args) { 3. char a = 65; 4. char b = (char)-65; // fora do intervalo, precisa de converso 5. char c = (char)70000; // fora do intervalo, precisa de converso 6. } 7. }

O tipo char pode aceitar valores fora de sua faixa, desde haja uma converso explcita.

ARRAY Um array em Java um objeto criado na pilha (mmoria), usado para armazenar e trabalhar com elementos semelhantes por seu tipo. Para que se possa utilizar um array voc dever: Declarar - Especificar um nome e o tipo do array. Construir - Informar o tamanho do array, ou seja, numero de elementos. Inicializar - Atribuir valores aos elementos do array.

Declarando um arrayint[] a; // Recomendado Thread b[]; String []c; Observe que ainda no se sabe quantos elementos esses array armazenar, ou seja, no sabe qual ser o custo para a memria desse array. Nunca coloque a quantidade de elementos do array no passo de declarao, a no ser que voc faa tudo em uma nica linha (isso ser mostrado posteriormente). Se voc ver uma questo onde aparece algo como no trecho a seguir, marque sempre erro de compilao. int[3] a; // s pode mencionar a quantidade de elementos, na construo :shock:

Construindo um arrayint[] a = new int[3]; // Recomendado :o Thread b[] = new Thread[1]; String []c = new String[19]; Usa-se a palavra new conjugada com o tipo do array. Nunca se esquea, em Java a contagem dos elementos SEMPRE COMEAR EM 0 (ZERO), portando uma referncia ao elemento a[3] (no array a acima) causar um erro, pois s existem os elementos 0, 1, 2 -> com um total de 3 elementos. Esse passo reserva espao na memria para os elementos do objeto array, pois somente na construo que a JVM saber quantos elementos sero composto o array, com isso cria-se um objeto na pilha com espao necessrio para armazenar os elementos do objeto. No passo de construo, todos os elementos so inicializados com seus valores padro. Veja a tabela a seguir: TIPO VALOR PADRO byte 0 short 0 int 0 long 0 float 0.0 double 0.0 boolean false char '\u0000' Object null

Inicializando um arrayAtribuir valores aos elementos de um objeto array. Quando um array contrudo, seus elementos so automaticamente inicializados com seus valores padro. int[] x; x = new int[2]; x[0] = 10; x[1] = 20; // // // // declarado construindo inicializando inicializando

Observe o seguinte cdigo:

1. public class ArrayInicia { 2. public static void main(String[] args) { 3. float[] f; 4. f = new float[1]; 5. System.out.println("valor antes "+f[0] ); 6. f[0] = 9.0; 7. System.out.println("valor depois "+f[0] ); 8. } 9. }

O que ser impresso na linha 5 e 7 ??? ( Feche os olhos e responda !!, No vale olhar...) Se voc respondeu 0.0 e 9.0, parabns por voc ser uma pessoa de opnio! Mas infelizmente voc errou !!! Lembra-se que todo valor literal ponto flutuante em Java por padro double, portanto esse cdigo no compila. Se alterarmos esse cdigo e adicionar o sufixo f na linha 6 => f[0] = 9.0f;, o resultado seria 0.0 e 9.0, por isso: PRESTE MAIS ATENO !!! :x Os trs passos para a utilizao de um array: declarao, construo e inicializao podem ser realizados em uma nica linha de cdigo. EUREKA !!! :!: boolean[] c = { false, true, false }; int[] a = {0,1,1,1}; char[] b = {'a','b','c'}; Observe que a palavra chave new no foi utilizada, visto que est implcito o tipo no incio, o nmero de elementos entre as chaves { }. Caso voc se depare com uma questo (como o cdigo abaixo) que especifica o nmero de elementos juntamente com a inicializao na mesma linha, no hesite em marcar a resposta: Erro de compilao !!! int[3] a = {1, 2, 1}; // erro de compilao :x

Array MultidimensionalUm array multidimensional um array com mais de uma dimenso (isso ridculo de dizer!), ou seja, uma coleo de objetos array dentro de um objeto array. Portanto um array definido como: int[][] i = new int[3][]; nada mais do que um objeto array i que contm trs objeto array (ainda no construdo) dentro. (Complicado?) int[][] i = new int[2][]; O que isso significa ? O que so os elementos de i ?? Significa que foi criado um objeto na pilha chamado a, e seus elementos ainda no foram contrudos. Para utilizar seus elementos, voc dever constru-los como mostra o cdigo a seguir: i[0] = new int[2]; // construdo o elemento 0 do array i i[1] = new int[3]; // construdo o elemento 1 do array i Quantos objetos foram criados na pilha ? 1 referenciado por a 2 referenciados por a[0] e a[1] Total de objetos criados: 3 (trs) Agora observe o seguinte cdigo:

1. public class TestArray { 2. public static void main(String[] args) { 3. String s = new String("Kuesley"); 4. String[] nomes = { s, null, new String("Kuesley") }; 5. } 6. } Quantos objetos foram criados na pilha ?? :shock: 1 obj String referencido por s 1 obj array de String referenciado por nomes 1 obj String referenciado por nomes[2]

Observe que o elemento 0 apenas uma referncia para s portanto no criado um novo objeto. O elemento 1 no tem um objeto referenciado, j o elemento 2 um objeto String.

Array Annimo

Como o prprio nome j diz, um objeto array criado sem a definio de um nome. Imagine que voc precise passar um objeto array como parmetro para um mtodo, e voc no queira criar um array, basta passar anonimamente. Veja como no cdigo abaixo: 1. public class A { 2. public static void main(String[] args) { 3. A obj_a = new A(); 4. int soma = obj_a.somarArray( new int[] { 0,1,2,3 } ); 5. System.out.println("Soma do array : "+soma); 6. } 7. public int somarArray( int[] a ) { 8. int rc = 0; 9. for ( int i=0; i < a.length; i++) { 10. rc += a[i]; 11. } 12. return rc; 13. } 14.}

Observe que no foi criado um objeto array com um identificador especfico e passado como parmetro, foi criado no momento em que se passar o argumento. Outro exemplo: int[][] numeros = new int[3][]; numeros[0] = new int[10]; numeros[1] = numeros[0]; numeros[2] = new int[] { 0,1,2,3 };

LEMBRE-SE: NUNCA ESPECIFIQUE O TAMANHO ENTRE OS COLCHETES, ISSO SER DEDUZIDO DOS ELEMENTOS ENTRE O PAR DE CHAVES !!!

Array - ObservaesAlgumas regras devem ser consideradas no uso de array que referenciam objetos! Dado as classes:

1. class Car implements CarMove { } 2. class Mazda extends Car { } 3. class Fusca extends Car { } 4. class VMax { } 5. interface CarMove { } 6. 7. public class Test { 8. public static void main(String[] args) { 9. Car[] cars = new Car[3]; 10. Fusca f = new Fusca(); // instanciando um obj do tipo Fusca 11. cars[0] = f; 12. } 13.}

Observe que na linha 5, um objeto Fusca foi armazenado em um array do tipo Car. Por que isto possivel ? Existe um pergunta que voc sempre dever fazer, para saber se uma classe X pode ser armazenada em um array do tipo Y. X membro de Y Em nosso contexto: Fusca membro de Car ? Em outras palavras, Fusca uma subclasse de Car ?

Se a resposta for positiva, essa atribuio perfeitamente possvel ! Agora observe o seguinte cdigo (baseando-se nas mesmas classes Car, Fusca ): 1. public class Test { 2. public static void main(String[] args) { 3. Fusca[] fuscas = new Fusca[3]; 4. Car c = new Car(); 5. fuscas[0] = c; 6. } 7. }

Isso possvel ?? Se tem dvida, faa voc mesmo e faa o teste e sem preguia !!! Aproveite e teste o seguinte: 1. public class Test { 2. public static void main(String[] args) { 3. Car[] c = new Fusca[1]; 4. Fusca[] f = new Car[1]; 5. } 6. }

O que acontecer com o cdigo acima ? Mudando um pouco de assunto! Um objeto array de uma interface, pode receber referencias de instncias de classes que implementem essa interface.

1. public class Test { 2. public static void main(String[] args) { 3. CarMove[] cm = new CarMove[4]; 4. cm[0] = new Car(); // ok! Car implementa CarMov 5. cm[1] = new Fusca(); // ok! Fusca implementa CarMov 6. cm[2] = new Mazda(); // ok! Mazda implementa CarMov 7. cm[3] = new VMax(); // erro de compilao 8. } 9. }

LEMBRE-SE: Vmax membro de CarMove ??? Cuidado com detalhes de atribuies tais como:

int[] n = new int[10]; int[] m = new int[] {8,2,1,2,0}; n = m; // ok! mesmo tipo int[][] n = new int[3][]; int[] m = new int[] {1,2,3}; n = m; // erro! objetos diferentes

A JVM no elimina o objeto n da pilha e subtitui pelo valor de m! Observe tambm que o array n tem 2 dimenses, enquanto que m tem apenas uma! Porm o seguinte cdigo seria perfeitamente possvel: n[0] = m; // ok!

As questes relacionadas com array multidimensionais so esdrxulas, portanto ESTUDE! :D

Se achas que estou brincando imagine a seguinte questo ?

1. public class Test { 2. public static void main(String[] args) { 3. int[][][] nums = new int[2][][]; 4. int[] simple = new int[] {1,2,3,4,5}; 5. nums[0] = new int[1][]; 6. nums[0][0] = new int[10]; 7. nums[1] = new int[3][]; 8. nums[1][0] = simple; 9. nums[1][1] = new int[] { 3,3,3 }; 10. nums[1][2] = new int[] { 1,2,3 }; 11. ???? 12. } 13.}

1) Qual das linhas abaixo podero ser colocadas na linha 11 do cdigo acima sem que d erro de compilao ?? (marque mais de uma) :shock:

a) b) c) d) e) f)

nums[1][0] = nums[0][0]; nums[1][0] = 10; nums[1][0][3] = 9; nums[1][0][2] = 9; nums[0][0][3] = 9; nums[0][0] = nums[2][1]

Resposta no final do captulo !!! No sacanagem, os caras do questes da pra pior !!!

Variveis de InstnciaDeclarada no escopo da classe, e tem um valor padro conforme o seu tipo. (Mesmos valores atribudos na inicializao de um array estudado anteriormente):

1. public class Book { 2. String title; 3. public static void main(String[] args) { 4. Book b = new Book(); // instanciando a classe 5. System.out.println("O titulo "+b.title); 6. } 7. } Resultado: O titulo null ! String um objeto e no um tipo primitivo! Para utilizar um varivel primitiva, voc SEMPRE ter que inicializ-la, caso contrrio o compilador lhe tratar de forma inescrupulosa ! 1. public class TheBookonTheTable { 2. public static void main(String[] args) { 3. int i; 4. System.out.println("o valor de i "+i); 5. } 6. }

O cdigo acima gerar um conflito entre o programador e o compilador! No tente ! irreparvel!!!

Objeto LocalUm Objeto locai (varivel declarada dentro de um mtodo) tem comportamento distinto de uma varivel de instncia.

Quando um objeto declarado como membro de uma classe, e uma instncia dessa classe criada, esse membro inicializado com null (pois em Java null um valor) e quando declarado no escopo de um mtodo, o objeto no inicializado, portanto qualquer ousadia de uso, relaes cortadas com o compilador! 1. import java.util.*; 2. public class Test { 3. public static void main(String[] args) { 4. Date data; 5. Periodo p = new Periodo(); 6. if (data == null) System.out.print("inicio nulo"); // erro de compilao 7. if (p.inicio == null) System.out.print("inicio nulo"); // ok-membro nulo 8. if (p.fim == null) System.out.print("fim nulo"); // ok - membro nulo 9. } 10. } 11. class Periodo { 12. Date inicio; 13. Date fim; 14.}

O compilador mostrar um erro na linha 6, pois o objeto local data no foi inicializado !

Mtodo mainVoc j deve estar cansado de ver as declaraes public static void main(String[] args), porm saiba que essa a chave para a JVM executar uma aplicao em Java. Maiores detalhes sobre modificadores sero vistos no captulo 2, mas algumas observaes devem ser ressaltadas nesse captulo. Observe: public static public public public public public static public static static static static static void void void void void void void main(String[] args) { ... } // vlido - recomendado main(String[] args) { ... } // vlido main(String[] a) { ... } // vlido main(String [] a) { ... } // vlido main(String a[]) { ... } // vlido main(String a []) { ... } // vlido main([]String args) { ... } // no vlido

Mas o que esse array de String que o mtodo main recebe ? Esse array usado para receber parmetros da linha de comando, quando um programa Java est sendo executado.

c:\>java Test Kuesley Fernandes

Nesse caso, dois parmetros esto sendo passados: Kuesley Fernandes Portanto com o seguinte cdigo:

1. public class Test { 2. public static void main(String[] args) { 3. System.out.println("Meu nome : "+args[0]+args[1]); 4. } 5. }

O Resultado seria: Meu nome Kuesley Fernandes :o E se fosse executado: c:\>java Test Kuesley Qual seria o resultado ?? TESTE !!! :o

QUESTO:

2) O que far o seguinte cdigo ?

1. public class Array { 2. int[] a; 3. public static void main(String[] args) { 4. Array obj = new Array(); 5. if (obj == null) { 6. System.out.println("ERRO"); 7. } else { 8. System.out.println("OK"); 9. } 10. } 11.} a) Mostrar ERRO na tela b) Mostrar OK na tela c) Programa no ir compilar d) Uma exceo ser lanada e) Mostrar null na tela

Resposta no final do captulo !!! Bom acho que chagamos ao final do captulo 1, esse captulo fundamental para o entendimento dos seguintes !!! :!: :!: Respostas dos exerccios propostos: 1) a, c, d, e, f Lembre-se compilar at compila, porm a resposta f gerar um exceo em tempo de execuo. 2) b

Captulo 2 - Modificadores e Controle de AcessoComo em todas as linguagens de programao, a acessibilidade a uma classe/mtodo deve seguir algumas regras, e de

extrema necessidade que voc as saiba para no vacilar na hora do exame!

Modificadorespublic private protected abstract static final transient strictfp synchronized volative native padro LEMBRE-SE: com exceo do modificador PADRO, todas as demais so palavras chaves em Java. 1 - MODIFICADORES PARA CLASSES:

1.1 - padroUm modificador de acesso determina como ser a visibilidade de uma classe/mtodo a partir de outras classes ou mtodos. Dado o arquivo Car.java: 1. class Car { 2. // cdigo da classe 3. }

Observe que no foi definido nenhum modificador para a classe, portanto o modificador de acesso nesse caso padro (default ou friendly)! O modificador padro define que a classe s poder ser acessada por outra classes dentro do mesmo pacote. Uma tentativa de acesso a classe Car a partir de uma classe de outro pacote resultar em um erro de compilao. Dada as classes: 1. Car.java 2. package carros; 3. class Car { ... } 4. 5. Oficina.java 6. package oficina; 7. import carros.*; 8. class Oficina extends Car { ... } // Erro de compilao 9. 10.Conserto.java 11.package conserto; 12.import carros.*; 13.class Conserto { 14. public static void main(String[] args) { 15. Car c = new Car(); // Erro de compilacao 16. } 17.} Observe que na classe Oficina houve uma tentativa de acesso por herana, mas como a classe Car tem acesso padro e a classe Oficina est em um pacote diferente do pacote da classe Car, causou erro de compilao. Semelhantemente o erro ocorreu na classe Conserto, apesar de que a forma de tentativa de acesso classe Car foi atravs de referencia. Agora observe: 1. 2. 3. Car.java package carros; class Car { ... }

4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

Oficina.java package carros; class Oficina extends Car { ... } // ok Conserto.java package carros; class Conserto { public static void main(String[] args) { Car c = new Car(); // ok } }

Observe que uma classe com modificar padro pode ser acessada somente por classes/mtodos do mesmo pacote.

1.2 - publicO modificador public o mais liberal, ou seja, faz com que a classe possa ser acessada por qualquer classe independente de estarem ou no no mesmo pacote.

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

Car.java package carros; public class Car { String getColor() { return "yellow"; } } Oficina.java package oficina; import carros.*; public class Oficina { public static void main(String[] args) { Car c = new Car(); // ok } }

Observe que a classe Car publica e visvel por qualquer classe, portanto muito cuidado ao definir uma classe como pblica, pode cair na vista do inimigo. 1) O que acontecer com o seguinte cdigo: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Car.java package carros; public class Car { String getColor() { return "yellow"; } } Oficina.java package oficina; import carros.*; public class Oficina { public static void main(String[] args) { Car c = new Car(); System.out.println("A cor e "+c.getColor()); } }

a) Mostrar: A cor e yellow b) Erro de compilao c) Exceo na hora da execuo d) Mostrar: A cor e null

e) Mostrar: A cor e Resposta no final do captulo !!! Caso vc tenha errado, no se preocupe, pois os modificadores aplicados a membros sero discutidos posteriormente.

1.3 - abstractUma classe definida como abstract no permite criar instncias dessa classe, ou seja, no podemos ter objetos de uma classe abstrata. O modificador abstract aplica o mesmo conceito de abstrao que conhecemos no mundo real, ou seja, parta do pressuposto que uma classe abstrata no sabe qual seja o seu "inteiro" comportamento. Voc deve estar se perguntando, por que ento eu usaria uma classe abstrata se no posso instanci-la ? Esse e um recurso interessantssimo das linguagens orientadas a objetos, a extensibilidade, voc pode definir uma classe Car com comportamentos (mtodos) abstratos e deixar que as subclasses definam esses comportamentos de forma diferente, mesmo porque a forma de acelerao de um Mazda RX7 bem diferente de um Fusca 1300 (putz que comparao mais esdrxula!) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Car.java package carros; public abstract class Car { ... } Oficina.java package carros; public class Oficina { public static void main(String[] args) { Car c = new Car(); // Erro de compilao } }

Erro de compilao: // carros.Car is abstract; cannot be instantiated No se preocupe se voc ver uma declarao: abstract public class Car No erro de sintaxe colocar o modificar abstract antes do public. Podemos concluir que uma classe abstrata no est pronta para ser usada como uma classe concreta, ou seja, ainda no sabe "coisas" sobre a classe, que muito provavelmento ser implementado em subclasses (a no ser que algum programador resolva criar uma classe abstrata e no us-la - puro capricho!)

1.3 - finalUm classe final no permite que se tenha subclasses, ou seja, no se pode aplicar a herana em uma classe que seja final. Novamente voc como curioso quer saber porque usaria uma classe final ? Pense em um contexto que se tenha uma classe "perfeita" que faz tudo exatamente como voc definiu, e no precise que sua classe seja herdada por ningum, para evitar que Programadores Juniores faam cacas !!! Tem mais um detalhe tcnico mais importante que o citado anteriormente: uma classe final, mais rpida que classes no final, isso porque a mquina virtual sabe que no haver nenhuma herana (nem pelos prprios caras da Sun) por isso o processo de execuo mais rpido. Um exemplo disso a classe String ! Porque deveramos mexer nessa classe ? Se voc ja achou alguma implementao para ela, mande seu currculo para a Sun, o endereo : [email protected] (no sei porque est em portugus, sendo que so americanos): 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Car.java package carros; public final class Car { ... } Oficina.java package carros; public class Oficina extends Car { // erro de compilao public static void main(String[] args) { Car c = new Car(); } }

Erro de compilao: cannot inherit from final carros.Car Se voc um cara esperto, j deve ter percebido que o modificador final no deve ser usado com o modificador abstract, visto porque no faz sentido temos uma classe final e abstrata ! Como faramos a herana sendo que a classe final !

1. Car.java

2. package carros; 3. public abstract final class Car { ... } // erro de compilao

Erro de compilao: illegal combination of modifiers: abstract and final

1.4 - strictfpDefine que membros/variveis da classe sigam as normas do padro IEE754 de ponto flutuante. Se voc no tiver o que fazer, poder estudar esse padro, mas saiba que para o exame no ser necessrio saber nada sobre o padro, simplesmente o que o modificador faz. Como seu escopo a classe, todos os mtodos seguiram o mesmo padro. Voc tambem poder definir esse modificador para um mtodo especifico, mas isso ser discutido posteriormente.

1. Car.java 2. package carros; 3. public strictfp class Car { ... } // ok

Todos os mtodos seguiram o padro IEE754 2 - MODIFICADORES PARA MTODOS:

2.1 - padroNo ser necessrio falar muito, pois semelhante ao conceito de classe, ou seja, um mtodo definido como padro s poder ser acessado por classes dentro do mesmo pacote.

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

Car.java package carros; public class Car { String getColor() { mtodo com acesso padro return "red"; } } Oficina.java package carros; public class Oficina { public static void main(String[] args) { Car c = new Car(); System.out.println("a cor do carro e "+c.getColor()); // ok } }

Nenhum problema de acesso pois as classes esto no mesmo pacote Se definirmos a classe Oficina da seguinte forma: 1. 2. 3. 4. 5. 6. 7. 8. package oficina; import carros.*; public class Oficina { public static void main(String[] args) { Car c = new Car(); System.out.println("a cor do carro e "+c.getColor()); // erro de compilao } }

Erro de compilao: getColor() is not public in carros.Car; cannot be accessed from outside package

2.2 - publicUm mtodo pblico pode ser acessado por qualquer classe em qualquer pacote. bvio que o acesso a um mtodo s permitido se voc tiver primeiro acesso classe, portanto uma tentativa de acesso a um mtodo pblico de uma classe com acesso padro no ser possvel a classes pertencentes a pacotes diferentes da classe que est se desejando o

acesso! Se ficou confuso, no se preocupe, vai piorar !! 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Car.java package carros; class Car { public String getColor() { return "red"; } } Oficina.java package oficina; import carros.*; class Oficina { public static void main(String[] args) { Car c = new Car(); System.out.println("a cor e "+c.getColor()); } }

// erro de compilao

Erro de compilao: carros.Car is not public in carros; cannot be accessed from outside package Portanto, mesmo que o mtodo seja pblico (como o caso de getColor()), a classe (nesse caso Car) tambm dever ser visvel ao mtodo que est chamando !

2.3 - privateUm mtodo private restringe o acesso do mtodo somente classe que o definiu, ou seja, um mtodo privado s poder ser acesso dentro da classe que o definiu e ponto final!

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

Car.java package carros; class Car { private String getColor() { // Nota 1 return "red"; } public void imprimirCor() { System.out.println( "a cor do carro e "+getColor()); // Nota 2 } } Oficina.java package carros; class Oficina { public static void main(String[] args) { Car c = new Car(); System.out.println("a cor e "+c.getColor()); c.imprimirCor(); // Nota 4 } }

// Nota 3

Nota 1: O mtodo foi definido como private Nota 2: O acesso ao mtodo getColor est sendo feito dentro da prpria classe. Isso no ocasiona erro de compilao! Nota 3: Uma tentativa de acesso a um mtodo private - erro de compilao! Nota 4: Acesso a um mtodo pblico que acesso um mtodo private, funciona como uma interface entre o mtodo getColor e a classe Oficina, isso perfeitamente possvel. Esse modificador o mais restringvel, os inimigos tremem quando ele usado!

2.4 - protectedEle um pouco mais liberal que o modificador padro, pois ele permite que um mtodo de uma classe X definida em um pacote PX possa ser acessado por uma classe Y de um pacote PY desde que a classe Y estenda da classe X ( que confuso !!!) No esquenta isso bem fcil!

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

Car.java package carros; public class Car { protected String getColor() { // Nota 1 return "red"; } } Oficina.java package oficina; import carros.*; class Oficina extends Car { // Nota 2 public void imprimirCor() { System.out.println("a cor e "+getColor()); // Nota 3 } }

Nota 1: O mtodo foi definido com protected Nota 2: A classe Oficina estende de Car - por isso os mtodos protegidos podem ser acessados. Nota 3: O mtodo est sendo acessado por herana, mesmo que a classe Oficina esteja definido em pacotes diferentes! Observe agora: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Car.java package carros; public class Car { protected String getColor() { return "red"; } } Oficina.java package oficina; import carros.*; class Oficina { // Nota 1 public void imprimirCor() { Car c = new Car(); System.out.println("a cor e "+c.getColor()); // Nota 2 } }

Nota 1: A classe Oficina no estende de nenhuma superclasse. Nota 2: H um tentativa de acesso por referncia ao mtodo getColor que protegido, o que causar um erro de compilao: getColor()has protected access in carros.Car Uma classe que herda um mtodo protegido torna-o private para suas subclasses. Complicou ? 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 1. 2. 3. 4. 5. Car.java package carros; public class Car { protected String getColor() { return "red"; } } Passeio.java package passeio; import carros.*; class Passeio extends Car { public void imprimirCor() { System.out.println("a cor e "+getColor()); // Nota 1 } } Mazda.java package esportivo; import carros.*; class Mazda extends Passeio { public void mostrarCor() {

6. System.out.println("a cor e "+getColor()); // Nota 2 7. } 8. } Nota 1: O mtodo pode ser acesso, pois herda de uma classe que o definiu como protegido. Nota 2: Erro de compilao, nessa hierarquia, o direito de acesso da classe Passeio ao mtodo protegido da classe Car, no outorgado a classe Mazda pois essa herda de Passeio, ou seja, um mtodo protected se torna private para suas subclasses quando h herana, no permitindo que as subclasses de Passeio herdem os mtodos protegidos que herdou.

2.5 - abstractUm mtodo abstrato no implementa nenhuma funcionalidade, somente assina o mtodo e faz com que a primeira subclasse concreta seja obrigada a implementar o mtodo. Uma classe que possua um mtodo abstrato deve obrigatoriamente ser abstrata! 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Car.java package carros; public abstract class Car { // Nota 1 public abstract String getColor(); // Nota 2 } Oficina.java package oficina; import carros.*; public class Oficina extends Car { // Nota 3 public String getColor() { return "red"; } }

Nota 1: A classe Car tambm teve que ser definida com abstract, uma vez que uma classe contenha um mtodo abstract Nota 2: A definio de um mtodo abstrato no pode ter implementao, veja que nem as chaves foram colocadas, e assim que deve ser! Nota 3: A classe Oficina uma classe concreta (no abstrata) portanto deve implementar todos os mtodos abstratos da sua superclasse, se no fizer, o compilador insultar o programador, melhor no brincar! Erros comuns 1 - Tentar implementar um mtodo abstrato: 1. 2. 3. 4. 5. Car.java package carros; public abstract class Car { public abstract String getColor() { ... } // Erro }

Erro de compilao: abstract methods cannot have a body LEMBRE-SE: Um mtodo abstrato deve terminar com ";" e no ter as chaves ! No definir a classe como abstrata 1. 2. 3. 4. 5. Car.java package carros; public class Car { public abstract String getColor(); // Nota 1 }

Erro de compilao: carros.Car should be declared abstract; it does not define getColor() in carros.Car No implementar os mtodos abstratos na primeira subclasse concreta

1. Car.java 2. package carros;

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

public public public public return } }

abstract class Car { abstract String getColor(); abstract String getSize(); double getPrice() { 24000.00;

Passeio.java package carros; public class Passeio extends Car { // Nota 1 public String getColor() { // Nota 2 return "red"; }

Nota 1: A classe Passeio estende de Car (classe abstrata) por isso, deve implementar todos os mtodos abstratos, o que no est acontecendo, se tertarmos compilar essa classe: carros.Passeio should be declared abstract; it does not define getSize() in carros.Car Nota 2: O mtodo foi implementado. A regra simples: todos os mtodos abstratos devem ser implementados na primeira subclasse concreta, se definssemos a classe Passeio como abstract no caso anterior, no teria problemas de compilao, pois o mtodo abstratos (getSize, getColor) no precisavam ser implementados na classe Passeio e sim na primeira subclasse concreta. O modificador abstract no pode ser conjugado com modificador private, visto porque um mtodo abstrato deve ser implementado em uma subclasse e um mtodo private no visvel a nenhuma outra classe.

2.6 - finalUm mtodo final define que no pode ser sobreposto, estudaremos mais afundo o que sobreposio de mtodos no captulo 8.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

Car.java package carros; public class Car { public final String getColor() { return "red"; } }

// Nota 1

class Mazda extends Car { public String getColor() { // Nota 2 return "yellow"; } }

Nota 1: Mtodo definido com final no pode ser sobreposto. Nota 2: Tentativa de sobrepor um mtodo final - o que ocasiona um erro de compilao: getColor() in carros.Mazda cannot override getColor()in carros.Car; overridden method is final

2.7 staticUm mtodo esttico define que esse pode ser executado ser que exista uma instncia da classe - um objeto. Voc s deve us-lo se tiver certeza do que est fazendo.

1. 2. 3. 4. 5.

Car.java package carros; public class Car { public static String getColor() { return "red";

// Nota 1

6. } 7. }

1. 2. 3. 4. 5. 6. 7. 8.

Oficina.java package oficina; import carros.*; class Oficina { public static void main(String[] args) { System.out.println("a cor e "+Car.getColor()); // Nota 2 } }

Nota 1: Mtodo definido com static, no h necessidade de um objeto para acess-lo. Nota 2: Note que no foi preciso criar um objeto para acessar o mtodo getColor

2.8 - nativeDefine que a implementao do mtodo foi escrita em uma linguagem nativa com por exemplo C ou C++.

2.9 - strictfpDefine que os valores de ponto flutuante do mtodo devem seguir o padro I33754, no se preocupe com esse padro agora - saiba somente o que o modificar faz.

2.10 - synchronizedFaz com o mtodo seja acessado por uma thread de cada vez, esse estudo ser discutido no captulo 9, ou seja, quando um mtodo sincronizado estiver sendo executado por uma thread as demais devero aguardar para iniciar a sua execuo.

3 - Modificadores para variveis de instncia:Apesar de muitos acharem que atributos, varivel de instncia e propriedades so as mesmas coisas, gostaria de deixar bem claro que existem diferenas sutis, mas que no sero relevantes nesse estudo. Por conveno chameremos de varivel de instncia por achar que o termo mais correto que define esse conceito.

3.1 - padroSegue as mesmas regras de um mtodo, ou seja, o acesso s permitido a classes dentro do mesmo pacote.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Car.java package carros; public class Car { double preco; // Nota 1 } Oficina.java package carros; class Oficina { public static void main(String[] args) { Car c = new Car(); c.preco = 13990.00; // Nota 2 } }

Nota 1: No foi definido nenhum modificado, portanto assume o modificador padro Nota 2: Acesso a varivel de instncia (VI) de uma classe dentro do mesmo pacote Observe agora: 1. 2. 3. 4. Car.java package carros; public class Car { double preco; // Nota 1

5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

} Oficina.java package oficina; import carros.*; class Oficina { public static void main(String[] args) { Car c = new Car(); c.preco = 13990.00; // Nota 2 } }

Nota 1: No foi definido nenhum modificado, portanto assume o modificador padro Nota 2: Acesso no permitido para classes de pacotes diferentes. Erro de compilao: preco is not public in carros.Car; cannot be accessed from outside package 3.2 - public O acesso a uma varivel de instncia pblica, segue as mesmas regras de um mtodo. S uma dica ( sem nenhum nus) cuidado ao definir um VI pblica, pois com isso voc estar liberando o acesso a todo o mundo, e isso pode enfraquecer sua classe, essa deciso deve ser bem estudada, e no podemos esquecer do encapsulamento. dentro do mesmo pacote. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Car.java package carros; public class Car { public double preco; // Nota 1 } Oficina.java package oficina; import carros.*; class Oficina { public static void main(String[] args) { Car c = new Car(); c.preco = 13990.00; // Nota 2 } }

Nota 1: Varivel definida como pblica, todo mundo pode acessar. Nota 2: Acesso a uma VI pblica, compilao sem nenhum contratempo. 3.3 - private Um varivel private restringe o acesso somente a prpria classe, o modificador que mais limita o acesso a um membro de classe. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Car.java package carros; class Oficina { private String endereco; }

// Nota 1

public class Car { public static void main(String[] args) { Oficina o = new Oficina(); System.out.println("o endereco "+o.endereco); // Nota 2 } }

Nota 1: Varivel definida como private, acesso somente dentro da prpria classe Nota 2: Tentativa de acesso a uma membro privado, erro de compilao: endereco has private access in carros.Oficina O modificador private usado para proteger uma classe do acesso direito a seus membros, com isso podemos garantir uma classe bem segura, e deve ser usado para implementao do conceito: encapsulamento. 3.4 - protected

Semelhante aos mtodos protegidos, uma varivel de instncia com esse modificador, limita o acesso subclasses para classes de outros pacotes.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Pessoa.java package p1; public class Pessoa { protected String nome = "Kuesley"; }

// nota 1

Diretor.java package p2; import p1.*; public class Diretor extends Pessoa { // subclasse de Pessoa public String getNome() { return nome; // nota 2 } }

Nota 1: Membro protegido, pode ser acessador por uma subclasse, ou seja, herana. Nota 2: Acesso ao membro herdado, apesar da classe Diretor estar em outro pacote, note que nome foi definido como protected. Vamos mudar um pouco a classe Diretor (definida logo acima) para:

1. 2. 3. 4. 5. 6. 7. 8. 9.

Diretor.java package p2; import p1.*; public class Diretor { // classe sem herana public String getNome() { Pessoa p = new Pessoa(); return p.nome; // nota 1 } }

Nota 1: Se tentarmos compilar a classe Diretor o compilador mostrar a mensagem: nome has protected access in p1.Pessoa 3.5 - final Uma varivel de instncia do tipo final usada para armazenar valores constantes que no sero e nem podem ser alterados (caso algum resolva cair em tentao) durante o escopo de utilizao da classe. Voc deve estar se perguntando, porque usar variveis que nunca sero alteradas ? E se no meio do contexto da classe eu precisar alterar o valor de uma variavel final ? ESQUEA !! Uma vez inicializada uma varivel com esse modificador nunca mais poder ser alterada. Imagine que voc tenha uma classe chamada Pessoa e resolva arbitrariamente definir uma altura e peso ideal - para qualquer pessoa os valores so idnticos e no podem ser alterados, pronto, ta uma utilizao para uma varivel final. Talvez no tenha sido muito feliz no exemplo, mas vamos v-lo na prtica.

1. 2. 3. 4. 5. 6.

Modelo.java package p1; public class Modelo { public final int ALTURA_IDEAL_CM = 175; public final int PESO_IDEAL_KG = 75; }

Como os valores de ALTURA_IDEAL_CM e PESO_IDEAL_KG so finais, voc poder implementar mtodos que usem esses valores para calcular por exemplo se uma pessoa, est ou no fora de forma, sem que algum engraadinho fora de forma aumente o PESO_IDEAL_KG para 100 kilos. Qualquer tentativa de mudana de uma varivel final resultar em alerta do compilador. O cdigo abaixo resultar em um erro de compilao:

1. 2. 3. 4. 5. 6. 7. 8.

package p2; import p1.*; public class Diretor { public static void main(String[] args) { Pessoa p = new Pessoa(); p.PESO_IDEAL_KG = 100; } }

Erro de compilao: cannot assign a value to final variable PESO_IDEAL_KG Como estamos falando de uma variavel de instncia e j discutimos no captulo 1 sobre variveis que so inicializadas automaticamente, saiba que uma VI deve ser inicializada EXPLCITAMENTE pelo programador e no esperar que o compilador faa isso por voc! Voc pode realizar essa inicializao de duas maneiras: a primeira junto com a declarao como em nosso exemplo anterior e a segundo no mtodo constructor! Primeira Forma:

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

package p1; public class Pessoa { public final int ALTURA_IDEAL_CM = 175; public final int PESO_IDEAL_KG = 75; public Pessoa() { ... } // mtodo construtor } Segunda Forma: package p1; public class Pessoa { public final int ALTURA_IDEAL_CM; public final int PESO_IDEAL_KG; public Pessoa() { ALTURA_IDEAL_CM = 75; // definido no mtodo construtor PESO_IDEAL_KG = 75; } }

O compilador paciente e aguarda que voc inicialize at que o mtodo construtor seja concludo, caso voc tenta esquecido ou tentado engan-lo, aguente as conseqencias.

1. 2. 3. 4. 5. 6. 7. 8.

package p1; public class Pessoa { public final int ALTURA_IDEAL_CM; public final int PESO_IDEAL_KG; public Pessoa() { ALTURA_IDEAL_CM = 75; // Nota 1 } }

Nota 1: Observe que somente o membro ALTURA_IDEAL_CM foi inicializado no construtor, e como o membro PESO_IDEAL_KG no foi inicializado explicitamente na declarao, o compilador mostrar a seguinte mensagem: variable PESO_IDEAL_KG might not have been initialized Portanto no conte com a idia de inicializao automtica mesmo que sejam tipos primitivos para variveis com modificador final !

Uma interface tambm pode conter variveis de instncia, e mesmo que no sejam definida explcitamente como final, ele assim ser!

1. 2. 3. 4. 5.

FuncionarioPublico.java package p1; public interface FuncionarioPublico { int tempoEstabilidade = 2; // Nota 1 }

1. 2. 3. 4. 5. 6. 7. 8.

ProcuradorEstado.java package p2; import p1.*; public class ProcuradorEstado implements FuncionarioPublico { public ProcuradorEstado() { tempoEstabilidade = 10; // Nota 2 } }

Nota 1: Membro de uma interface implicitamente public e final, observe que no foi preciso defin-lo como public para se ter o acesso a outra classe mesmo estando em outro pacote! Nota 2: Tentativa de alterar um membro de uma interface, como final, o compilador mostrar a seguinte mensagem de erro: cannot assign a value to final variable tempoEstabilidade

3.6 - static Esse modificador muito simples de se entender! Voc como um cara esperto sabe a diferena de uma classe e um objeto certo ? (Se sua resposta for negativa, procure saber antes de prosseguir!) Uma varivel de instncia com esse modificador compartilhada com todas as instncias (objetos) dessa classe, ou seja, se voc tiver uma classe com um atributo esttico voc no ter uma cpia desse atributo para cada objeto e sim uma nica cpia para todos, portanto uma alterao do valor desse atributo em qualquer dos objetos, causar efeitos sobre esse atributos para todas as instncia. Por isso, um membro esttico um membro da classe e no do objeto!

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Pessoa.java package p1; public class Pessoa { public static int count = 0; // Nota 1 private String nome; // Nota 2 public Pessoa(String n) { // Nota 3 nome = n; // Nota 4 count += 1; // Nota 5 } public static int getCount() { // Nota 6 return count; } }

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

Clientes.java package p2; import p1.*; public class Clientes { public static void main(String[] args) { System.out.println("Antes: "+Pessoa.getCount()); Pessoa p1 = new Pessoa("Kuesley"); Pessoa p2 = new Pessoa("Jose"); System.out.println("Depois: "+Pessoa.getCount()); } }

Nota 1: Observe que foi criado uma variavel de instncia count esttico, ou seja, nico para todas as intncias dessa classe! Nota 2: A VI nome no static portando, cada instncia ter um nome distinto. Nota 3: A classe Pessoa tem um modificador parametrizado! Nota 4: Atribui VI 'nome' o valor informado na instanciao do objeto Nota 5: Cada vez que o construtor chamado, acrescentado 1 variavel count

Nota 6: Mtodo que retorna o valor da varivel count. Talvez voc esteja se perguntando mas porque esse mtodo static ? Imagine que voc precise chamar o mtodo getCount sem ter nenhuma instncia de Pessoa, no h problema algum em nosso exemplo tirarmos o modificador static do mtodo getCount, mas voc no poder cham-lo sem haver pelo menos 1 instncia ! Observe tambm que foi usado o nome da classe para chamar os mtodos e no o objetos ('Pessoa.getCount()' ) , apesar de que no haveria problema pois a JVM saberia que se trata de um modo static e se reportaria a classe para saber as informaes sobre a varivel count. Observe a definio das seguintes classes:

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

Pessoa.java package p1; public class Pessoa { public static int count = 0; private String nome; public Pessoa(String n) { nome = n; count += 1; } public int getCount() { return count; } }

// Removido o modificador static

Clientes.java package p2; import p1.*; public class Clientes { public static void main(String[] args) { Pessoa p1 = new Pessoa("Kuesley"); Pessoa p2 = new Pessoa("Jose"); System.out.println("Depois p1: "+p1.getCount()); // Nota 1 System.out.println("Depois p2: "+p2.getCount()); // Nota 2 System.out.println("Depois Pessoa: "+Pessoa.getCount()); // Nota 3 } }

// Nota 1/2: Ambos retornaro 2 no mtodo getCount() // Nota 3: Erro de compilao: non-static method getCount() cannot be referenced from a static context

OBSERVAO: Voc NUNCA poder referenciar de um contexto esttico, uma varivel ou mtodo no esttico! Apesar de que isso j foi falado anteriormente, no estudo dos mtodos estticos, mas sempre bom lembrarmos, pois os caras das provas de certificao. gostam de pegar no nosso p quando se trata de contexto esttico! Observe:

1. 2. 3. 4. 5. 6. 7.

package p1; public class Clientes { int count = 0; public static void main(String[] args) { System.out.println(""+count); } }

Erro de compilao: non-static variable count cannot be referenced from a static context Se voc quiser enganar o compilar da seguinte forma:

1. package p1; 2. public class Clientes { 3. int count = 0;

4. 5. 6. 7. 8. 9. 10.

public void imprimirLista() { System.out.println(""+count); } public static void main(String[] args) { imprimirLista(); // Nota 1 } }

Nota 1: O compilador saber que est tentando ser enganado e xingar: Erro: non-static variable count cannot be referenced from a static context

3.7 - transientEsse modificador indica a JVM para no esquentar a cabea com as variveis transient quando for realizar a serializao de um objeto! Calma! Calma! Calma! Se voc no sabe o que serializar um objeto, no se preocupe, por enquanto a Sun no est exigindo que voc tenha esse conhecimento - apesar de ser um dos recursos mais brilhantes da linguagem Java, e usado para a programao em ambientes distribudos! Por isso, apresse seus estudos! Mesmo assim, gostaria que voc tivesse uma idia do que serializar um objeto, pois assim acredito que fique mais fcil a compreenso desse modificador. Imagine que voc esteja desenvolvendo uma aplicao em um ambiente de rede e precise que um objeto Pessoa seja enviado para um outra mquina da rede, e l continue o processo com esse objeto, esse processo conhecido como serializao, ou seja, transformar um objeto em uma sequencia de bytes e envi-lo para outra mquina (consequentemente, outra JVM) que deserializar essa seqencia de bytes, obtendo o objeto como na mquina de origem! Quem disse que no h milagres na informtica!!!

1. 2. 3. 4. 5.

public class Pessoa { public String nome; public String endereco. transient public Image Foto; }

// Nota 1

Nota 1: Imagine que sua conexo de rede seja muito ruim! E voc no precise ficar transportanto a foto da pessoa na rede, com o modificador transient o membro Foto no ser serializado!

3.8 - volatileQuando uma variavel de instancia com esse modificador alterada, a threads dever sincronizar sua cpia com a cpia principal.No se preocupe em saber como isso funciona, estudaremos com exatido isso no captulo 9! Uma analogia a esse modificador o caso dos programadores que quando alteram um projeto devem sempre alterar a documentao para que todos os demais membros da equipe estejam atualizados! IMPLEMENTAO DE INTERFACE: Voc ter que saber algumas regras sobre interface para se certificar, e dever saber de "cor e salteado" (nunca tinha citado isso) como funciona a interface Runnable ! Uma interface uma espcie de contrato que uma classe deve fazer e cumprir para que todos fiquem felizes! Veja como a implementao de uma interface:

1. 2. 3. 4.

public interface FuncoesPublicas { void assinarPonto(); void executarResponsabilidade(); }

Uma interface nada mais que uma classe totalmente abstrata, ou seja, s existe as assinaturas de mtodos! Apesar de no terem sidos definidos como abstract e public, convencionalmente os mtodos de uma interface o so. Portanto o compilador os enxerga:

1. 2. 3. 4.

public interface FuncoesPublicas { public abstract void assinarPonto(); public abstract void executarResponsabilidade(); }

Apesar de no existir herana mltipla em Java para classe em Java, as interfaces podem herdar de multiplas interface, veja o cdigo a seguir:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

public interface FuncaoAnimal { void nascer(); } interface FuncaoAve extends FuncaoAnimal { void voar(); } interface FuncaoReptil extends FuncaoAnimal { void rastejar(); } interface FuncaoCobraVoadora extends FuncaoAve, FuncaoReptil { } // Nota 1

Nota 1: Um interface pode herdar mais de uma interface! No pense em fazer isso com uma classe! Apesar de que uma classe pode implementar vrias interfaces: Vejamos:

1. class CobraViva implements FuncaoAnimal, Runnable { ... } Voc deve saber algumas regras quanto declarao de constante de interface:

1. public interface FuncoesPublicas { 2. int tempoServico = 0; 3. } Apesar de no estar explcitamente definido mas a varivel tempoServico : public final static O equivalente a:

1. public interface FuncoesPublicas { 2. public static final int tempoServico = 0; 3. }

CONSIDERAES FINAIS: Modificadores de acesso: - Os modificadores de acesso: (padro, public, private e protected) nunca podero ser combinados !

Mtodos- Nunca poder ser definido como (transient, volative) - Um mtodo nunca poder ser abstract e final

-

Um Um Um Um Um Um Se

mtodo nunca poder ser abstract e strictfp mtodo nunca poder ser abstract e native mtodo nunca poder ser abstract e synchronized mtodo nunca poder ser abstract e private mtodo final nunca poder ser sobreposto mtodo abstrato nunca poder ser implementado um mtodo for abstrato a classe tambm ser

Varivel de Instncia- Pode ter qualquer um dos quatro modificadores de acesso - Podem ser (volative, transient, final, static) - No pode ser (abstract, native, synchronized, strictfp) -

InterfacesUma interface nunca herda uma classe Uma classe nunca herda uma interface Uma interface nunca implementa outra interface Uma classe nunca implementa outra classe Uma interface pode herdar vrias interfaces Uma variavel de uma interface sempre ser implcitamente: (public, final, static) Um mtodo de uma interface sempre ser (public, abstract)

Lembre-se da Interface: java.lang.Runnable Apesar de que veremos ela com mais detalhes no captulo 9 (esse o captulo) ! Ela s tem um mtodo: public void run(); Este o final do captulo 2 !!! Respostas dos exerccios propostos: 1) b

Captulo 3 - Operadores e atribuies3.1 - IntroduoA compreenso desse captulo muito importante pois trata de um assunto essencial em qualquer linguagem de

programao, as diversas formas de se atribuir e manipular valores de uma varivel. Alm de ser um dos elementos fundamentais de uma linguagem de programao, as variveis tem um papel importante na gerao de programas e suas peculiaridades sero abordadas nesse captulo (pelo menos o que esperamos) ! A forma mais elementar de se atribuir um valor a uma varivel : x = 0; Mas no espere que no exame, haja perguntas com esse desprezo de complexidade, muito pelo contrrio, o que normalmente voc no utiliza ou nunca utilizou com certeza estaro l (naquela bendita prova)!!! byte x = 10; Lembra-se do captulo 1 ? Que na linha anterior 10 um valor literal int, composto por 32 bits e que um tipo byte s tem capacidade para armazenar 8 bits. Voc deve estar se perguntando e o que acontece com o resto dos bits ? Calma, para todas essas perguntas em algum lugar no universo haver uma resposta. Nesse caso o compilador generoso e executa a converso implicitamente para voc. Portanto uma varivel nada mais do que um repositrio de bits para a representao de algum valor. O que est armazenado na varivel x ? Se voc respondeu 00001010 est no caminho certo para o sucesso de sua certificao ! Como o compilador realizou a converso de int para byte, os 24 bits de diferena foram desprezados. byte x = 19; // ok byte y = x; // ok byte z = x + y; // deveria aceitar, mas necessita de uma converso explcita. Toda operao envolvendo dois tipos inteiros sejam eles (byte e short, long e byte) retornaram um tipo int

Falando em Objetos:Button b = new Button(); O que b armazena ? Se voc pensou em dizer que b armazena um objeto do tipo Button, sua resposta est errada ! b armazena um conjunto de bits usados para acessar (referenciar) o objeto na memria. Portanto, podemos dizer a rigor que b no um objeto do tipo Button e sim uma forma (atravs de uma sequncia de bits) usada para acessar esse objeto na memria.

Falando um pouco sobre atribuies de nmero primitivosAtribuio Observao byte a = 19; byte a = (byte)19; byte b = 128; // No possvel sem uma converso explcita byte c = (byte)128; // Ok O valor 128 no pode ser atribudo varivel b por ultrapassar a capacidade em bits do tipo byte - uma converso se faz necessria. Mas devemos ressaltar um acontecimento muito interessante nesse caso. Qual o valor da varivel c da atribuio anterior ? Entenda o que acontece: 0000 0000 0000 0000 0000 0000 1000 0000 +128 Como o compilador despreza os primeiros 24 bits (pois o tipo byte s comporta 8 bits) ficamos com: 1000 0000 Se voc um cara esperto sabe que o bits da extrema esquerda dever ser usado para armazenar o sinal (nesse caso negativo), como temos um nmero negativo agora desejamos saber qual ! Existe uma regra que voc dever se familiarizar que usada para decobrir o valor de um nmero negativo em bits: Primeiro inverta todos os bits do nmero, assim temos: 0111 1111 Transforme esse nmero em decimal e acrescente 1 127 + 1 = 128

Aplique o bit do sinal e ter o valor: -128 ! Exercite isso com o nmero 140, 147 ! Voc dever obter: -116, -109

3.2 - Atribuio de Tipos PrimitivosAtribuies elementares no precisam ser discutidas, pois voc j deve est familiarizado, agora um regrinha deve ser lembrada para sempre: toda atribuio que resultada de uma operao (seja ela qual for: soma, diviso, deslocamento de bits....) envolvendo tipos inteiros (byte, short, int, long) SEMPRE RESULTAR EM UM TIPO INT !!! Portanto: byte x = 1; // ok byte y = 2 + 3; // ok byte z = x + y; // deveria aceitar pois 6 cabe perfeitamente em um tipo byte, porm necessrio uma convero explcita byte z = (byte)x + y; // agora sim

3.3 - Deslocamento de BitsDeslocar bits em nmero e alterar sua sequencia de armazenamento e s poder ser feito em TIPOS INTEIROS !! >> deslocamento de bits direita com sinal >> deslocamento de bits direita sem sinal

Deslocamento a direita com sinal ( >> )int x = 16; x = x >> 2; A varivel x estar armazenando ao final da linha de cdigo anterior o valor 4 ! O que o cdigo anterior faz simplesmente descolar dois bits para a direita, assim temos: x antes do deslocamento 0000 0000 0000 0000 0000 0000 0001 0000 (base 2) 16 (base 10) x depois do deslocamento 0000 0000 0000 0000 0000 0000 0000 0100 (base 2) 4 (base 10) O sinal sempre ser mantido com esse operador. Um regra bem simples que quando se desloca direita o mesmo que aplicar a seguinte regra matemtica: Para o caso anterior: Frmula: 16 dividido por 2 elevado a x (onde x a quantidade de bits a deslocar)

Deslocamento a esquerda com sinal ( >>= 2; O valor de x ser 50 aps o deslocamento, veja porque: 0000 0000 0000 0000 0000 0000 1100 1000 equivale a 200 Aps o deslocamento: 0000 0000 0000 0000 0000 0000 0011 0010 equivale a 50 Agora vamos examinar um nmero negativo: int x = -200; x >>>= 2; O valor de x ser aps o deslocamento, veja porque: 1000 0000 0000 0000 0000 0000 1100 1000 equivale a -200 Aps o deslocamento: 0010 0000 0000 0000 0000 0000 0011 0010 equivale a 1073741774 Existe uma particularidade que voc deve estar atento no caso de quando for tentado a deslocar uma quantidade superior a capacidade do tamanho. Por exemplo, o que aconteceria se voc tentar deslocar 35 bits em uma variavel do tipo int que comporta 32 ? Ou at mesmo 9 em uma varivel byte ? Se isso acontecer o compilador far uma clculo nuclear para descobrir como deslocar: int x = 90 >> 35; Veja que no exemplo anterior, h um tentativa de deslocar 35 bits em um tipo int ! O compilador far uma diviso entre a 35 quantidade de bits a deslocar e 32 que a capacitade do tipo em questo e o resto dessa diviso ser a quantidade deslocada, nesse caso: 3 !! byte y = (byte) 8 >> 12; 12 % 8 = 4 (quatro bits a deslocar) Isso nos levanta um caso particular. E se for um mltiplo de 8 (no caso do tipo byte), por exemplo, tente deslocar 16 ou 32 em um tipo byte, quantos bits sero deslocados ? Exatamente nenhum pois o resto da diviso ser 0 (nenhum bit) ser deslocado. Portanto nem sempre o deslocamento de bits com o operador ( >>> ) ser positivo, ou seja, tente deslocar 32

bits ou 64 bits em um tipo int que armazena o valor -300 e ter o mesmo valor -300 !! Talvz voc no esteje lembrado, mas um nmero se diz mltiplo de outro se o resto entre sua diviso for 0, veja o exemplo: 64 multiplo de 32 pois, 64 / 32 = 2 e resta 0 32 mltiplo de 32 pois, 32 / 32 = 1 e resta 0 (evidentemente) No se irrite, foi s pra relembrar!!! Portanto nem sempre o deslocamento com o operador ( >>> ) resulta em um nmero positivo !!!

3.3 - Atribuio de Objetos1) Dado as classes: 1. classCarro{ 2. publicdoublepreco=0; 3. } 4. 5. classAudiextendsCarro{} 6. 7. 1.publicclassTeste{ 8. 2.publicstaticvoidmain(String[]args){ 9. 3.Carroa=newCarro(); 10. 4.Audib=newAudi(); 11. 5.Carroc=newAudi(); 12. 6.Audid=newCarro(); 13. 7.} 14. 8.} Qual das linhas anteriores esto incorretas e no permitiriam que o programa fosse compilado ? a) 1, 3 b) 2, 3 c) 5 d) 6 e) o cdigo ser compilado Resposta no final do captulo !!! No se esquea da regra: X membro de Y ??

3.4 - Passagem de Parmetro em Java por ValorMuito discusso existe quando o assunto a forma como a Java passa um varivel (primitiva ou referncia) para um mtodo, mas acalme-se estamos aqui para descomplicar sua vida e lhe dar um nova oportunidade!! Quando uma varivel passada para um mtodo, SEMPRE SEMPRE E SEMPRE ser passado um cpia dos seus bits!!

3.4.1 - Varivel Primitiva1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. publicclassTeste{ publicstaticvoidmain(String[]args){ bytex=10; System.out.println("Xantes:"+x); altera(x); System.out.println("Xdepois:"+x); } publicstaticvoidaltera(bytea){ a=2; } }

No caso anterior o que passado para o mtodo altera : 00001010 que nada mais que o valor decimal 10, porm observe que no escopo do mtodo altera o valor recebido alterado e quando o fluxo retorna ao mtodo main o valor da varivel x est intacta. Isso fcil de entender, voc deve pensar errneamente que se o mtodo alterar modificasse o valor de x, ento x teria sido passado como referncia ! Essa forma no correta de se pensar, pense simplesmente que o mtodo altera recebeu um cpia dos bits da variavel x que era: 00001010. Portanto o resultado do cdigo acima :

X antes: 10 X depois: 10

3.4.2 - Varivel RefernciaAgora o bicho pega! Uma varivel de referncia nada mais que um repositrio de bits que representam um forma de se acessar um objeto na memria. A varivel uma coisa o objeto que est na memria outra, tente colocar isso na sua cabea! 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. publicclassTeste{ publicstaticvoidmain(String[]args){ Carroc=newCarro(); c.preco=13990.00; System.out.println("preoantes:"+c.preco); anula(c); System.out.println("preodepois:"+c.preco); } publicstaticvoidanula(Carrop){ p=null; } }

Resultado: preo antes: 13990.0 preo depois: 13990.0 No trecho de cdigo anterior acontece um fenmeno muito interessante e que nos d a idia de como funciona toda essa parafernalha: Premissas: - c um varivel de referncia a um objeto do tipo Carro - o mtodo anula, recebe uma varivel p do tipo Carro - o mtodo anula, diz para a varivel p no referenciar nada (null) - se a varivel c fosse passada como referncia, quando o fluxo retornasse ao mtodo main, c estaria referenciando null - se houver uma alterao do objeto que a varivel p est referenciando, essa alterao tambm ser visvel varivel c (quando o fluxo retornar claro) veja o trecho a seguir: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. publicclassTeste{ publicstaticvoidmain(String[]args){ Carroc=newCarro(); c.preco=13990.00; System.out.println("preoantes:"+c.preco); aumento(c); System.out.println("preodepois:"+c.preco); } publicstaticvoidaumento(Carrop){ p.preco*=1.05; } }

Resultado: preo antes: 13990.0 preo depois: 14689.5 Talvz voc esteja se perguntando porque ento que o valor foi alterado se em Java um varivel passada como valor ???? ERRADO, o que passado como valor so os bits que referenciam o objeto, portanto p no mtodo aumento referencia exatamente o mesmo objeto que c referencia no mtodo main, ou voc acha que a Java sai criando objetos na memria assim sem mais nem menos ?

3.5 Operadores Bit a BitExistem trs operadores bit a bit: & e | ou inclusivo

^ u exclusivo

3.5.1 - Aplicando o operador &O operador & compara dois bits e ser um se ambos o forem ! Calma que voce ver um exemplo : int x = 10 & 9; Conventendo para bits os nmeros 10 e nove temos: 1010 1001 -----1000 O Resultado em decimal 8 !

3.5.2 - Aplicando o operador | ou inclusivoint x = 10 | 9; 1010 1001 -----1011 Resultado: 11

3.5.3 - Aplicando o operador ^ ou exclusivoint x = 10 ^ 9; 1010 1001 -----0011 Resultado: 3

3.6 - Operador Bit ComplementarEsse operador unrio, ou seja, envolve somente uma varivel e deve ser usada quando se deseja inverter todos os bits de um nmero use o operador ( ~ ) int x = 8; // 1000 x = ~x; // Passa a valer 0111

3.7 - Operador CondicionalO operador condicional um operador ternrio, ou seja, trs operandos (bvio) e deve ser usado quando se necessita realizar uma condio em uma nica linha. Veja o cdigo abaixo: int tamanho = 19; String texto = (tamanho>=10)?"Maior ou igual a 10":"Menor que 10"; System.out.println(texto); No precisa nem perguntar o que vai sair na tela que todos j sabem !!! Mas para os que ainda ficaram em dvida, l vai: o primeiro operando a condio, ou seja, se ela for verdadeira (true) atribui o valor da segunda variavel texto em sendo falsa (false) atribui o valor da terceira! Mais um exemplo: 1. 2. 3. 4. 5. 6. 7. classTeste{ publicstaticvoidmain(String[]args){ intx=10^8; inty=~x; System.out.println((x>y)?"xmaiorquey":"xmenorquey"); } }

No tente fazer algo do tipo: ( x > y )?System.out.println("x maior que y"): System.out.println("x menor que y"); Um operador condicional s pode ser usado para atribuir valores, ou seja, para ser usado quando se necessite fazer uma atribuio condicional.... Mas algo assim perfeitamente possvel: 2) Dado o cdigo a seguir, o que acontecer ? 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. publicclassTeste{ publicstaticvoidmain(String[]args){ intx=10^8; inty=~x; if(((x>y)?x:y)>10){ System.out.println("xmaiorquebemaiorque10"); }else{ System.out.println("xmaiorquebmasnomaiorque10"); } } }

a) imprimir " x maior que b e maior que 10" b) imprimir "x maior que b mas no maior que 10" c) No imprimir nenhum resultado d) Erro de compilao e) Uma exceo ser lanada Resposta no final do captulo !!!

3.8 - Operador instanceofOperador binrio (dois operandos) que utilizado para saber se um objeto instncia de uma classe. String nome = "kuesley"; if (nome instanceof String) { System.out.println("nome do tipo String"); } else { System.out.println("nome no do tipo String"); } Voc tambm poder compara subclasse veja o exemplo a seguir: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. publicclassVeiculo{} publicclassAudiextendsVeiculo{} publicclassTeste{ publicstaticvoidmain(String[]args){ Audia=newAudi(); Veiculov=newVeiculo(); if(ainstanceofAudi)System.out.println("adotipoAudi"); if(vinstanceofVeiculo)System.out.println("vdotipoVeiculo"); if(vinstanceofAudi)System.out.println("vdotipoAudi"); if(ainstanceofVeiculo)System.out.println("adotipoVeculo"); } }

Nesse cdigo ser exibido: a do tipo Audi // a que instncia da classe Audi membro de Audi (isso bvio) v do tipo Veiculo // v que instncia da classe Veiculo membro de Veiculo (bvio) a do tipo Veiculo // a que uma instncia da classe Audi membro de veculo, pois a

classe Audi uma sub-classe de Veiculo! Isso porque aplica-se sempre aquela regra: x MEMBRO y ??? Esse operador tambm pode ser aplicado as interfaces, ou seja, uma classe membro de uma interface sempre que ela a implementa. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. publicinterfaceAcao{} publicclassVeiculoimplementsAcao{} publicclassAudiextendsVeiculo{} publicclassMoto{} publicclassTeste{ publicstaticvoidmain(String[]args){ Audia=newAudi(); Veiculov=newVeiculo(); Motom=newMoto(); if(ainstanceofAcao)System.out.println("amembrodeAcao"); if(vinstanceofAcao)System.out.println("vmembrodeAcao"); if(minstanceofAcao)System.out.println("mmembrodeAcao"); } }

Resultado do cdigo anterior: a membro de Acao v membro de Acao Lembra-se do primeiro captulo quando estudamos os arrays, e foi dito que um array um objeto, agora comprovaremos essa afirmao para que no fique dvida em sua cabea. 1. 2. 3. 4. 5. 6. publicclassTeste{ publicstaticvoidmain(String[]args){ booleanc=(newint[]{1,2,3}instanceofObject); System.out.println(c); } }

O resultado ser true. Foi criado um array annimo (estudado no captulo 1) e verificado se um tipo Object e atribui-se a varivel c o resultado true Importante: Voc poder se deparar com questes que abordam se um objeto de um tipo de classe que esteja fora da hierarquia, por exemplo: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. classVeiculo{} classAudiextendsVeiculo{} publicclassTeste{ publicstaticvoidmain(String[]args){ Audia=newAudi(); Veiculov=newVeiculo(); booleanb1=(ainstanceofAudi);//ok-b1true booleanb2=(ainstanceofVeiculo);//ok-b2true booleanb3=(vinstanceofAudi);//ok-b3false booleanb4=(ainstanceofString);//errodecompilao } }

3.9 - Sombreando variveisUma rea interessante da Java a forma como trata os sobreamentos de variveis. Talvez voc esteja se perguntando "o que sobrear uma varivel ???", pense em uma classe com um membro inteiro chamado tamanho, imagine ainda que voc crie um mtodo e internamente voc tambm crie um varivel local chamada tamanho, o que acontecer ? A classe pirar ? No a Java esperta e sabe tratar isso, veja como:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

publicclassTeste{ staticinttamanho=0; publicstaticvoidmain(String[]args){ tamanho=9; System.out.println("Antes:"+tamanho); crescer(2); System.out.println("Depois:"+tamanho); } publicstaticvoidcrescer(inttamanho){ tamanho=tamanho+1; } }

O resultado do cdigo anterior ser: Antes: 9 Depois: 9 A varivel tamanho dentro do escopo do mtodo que est sendo usada, no a mesma declarada como membro da classe, agora se alterarmos um pouco o cdigo como segue teremos um resultado diferente: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. publicclassTeste{ inttamanho=0; publicstaticvoidmain(String[]args){ Testet=newTeste(); t.tamanho=9; System.out.println("Antes:"+t.tamanho); t.crescer(2); System.out.println("Depois:"+t.tamanho); } publicvoidcrescer(inttamanho){ this.tamanho=tamanho+1; } }

O resultado ser: Antes: 9 Depois: 3 OBS: VOC NO PODE SIMPLESMENTE COLOCAR A PALAVRINHA this no mtodo crescer, porque uma varivel static nunca poder ser referenciado por um contexto no-esttico, e a palavra this quer dizer que de um objeto !!! O mesmo comportamento tem os objetos, mas preste bastante ateno pois estive conversando com o pessoal da Sun e eles me falaram que para a sua prova eles vo caprichar em questes que tratar esse assunto.

3.10 - Operadores matemticosNo precisa falar muito sobre esse operadores, pois sei que voc bom em matemtica e apesar de ter errados algumas respostas quando a professora da 4 srie lhe perguntava. Uma observao que importante ser ressaltada que toda operao envolvendo nmeros inteiros resultaro em um tipo int, mesmo sendo byte * short, ou byte / int. Como voc sabe no possvel realizar diviso por zero para nmeros inteiros, mas em nmero de pontos flutuantes isso possvel podendo retornar um 0 positivo ou um 0 negativo. Os operadores so: Unrios: -- ++ Binrios: + - / * % int x = 10 + 10; int y = 10 / 0; // Uma exceo ser lanada ! java.lang.ArithmeticException

3.10.1 - Diviso por zeroVeja o cdigo a seguir: 1. publicclassTeste{ 2. publicstaticvoidmain(String[]args){ 3. doublesal=140/0;

4. System.out.println("Salario:"+sal); 5. } 6. } O resultado ser uma exceo java.lang.ArithmeticException Pois observe que 140 um inteiro e no um double, por isso a exceo. Agora observe o cdigo a seguir: 1. 2. 3. 4. 5. 6. publicclassTeste{ publicstaticvoidmain(String[]args){ doublesal=-140.0/0; System.out.println("Salario:"+sal); } }

Resultado: Salario: -infinity (isso mesmo infinito negativo) Olhe o comportamento estranho da Java quando os dois operadores forem zero 1. 2. 3. 4. 5. 6. publicclassTeste{ publicstaticvoidmain(String[]args){ doublesal=-0.0/0; System.out.println("Salario:"+sal); } }

Resultado: Salario: NaN (atenha-se a saber o que resulta e no o porqu)

3.10.2 - Incremento e DecrementoOs operados unrios incremento e decremento so bastante utilizados e devem ser aprendidos para a obteno da to sonhada certificao, veja como funciona: Operador pr-fixado int x = 10; System.out.println("x "+(++x)); No tente fazer em casa esse trecho sem os parenteses " System.out.println("x "+++x);" o compilador pira !!! o equivalente a dizer: "Por favor, incremente 1 a varivel x depois exiba o valor da varivel, continue o seu trabalho" O resultado ser: x 11 Operador ps-fixado int x = 9; System.out.println("x vale: "+x--); System.out.println("o valor final de x "+x); O resultado ser: x vale: 9 o valor final de x 8 Bom acho que chagamos ao final de mais um captulo, e espero ter colaborado para o seu crescimento da linguagem Java !!! Respostas dos exerccios propostos: 1) d 2) b

Captulo 4 - Controle de fluxo, excees e assertivas4.1 - Introduo O controle do fluxo um elemento essencial em qualquer linguagem de programao. Mesmo com os paradigmas da programao orientada a objetos, controlar o fluxo de um algoritmo uma necessidade imprescindvel. Quem j

desenvolveu software em linguagens estruturadas como clipper, cobol, c entre outras, sabe que se esse recurso no existisse, um algoritmo no poderia ser condicionado e testado para prever por exemplo, eventos inerentes a falhas em um recurso ou dispositivo do computador, ou at mesmo se um usurio entrou com um valor correto em um campo de entrada de dados. if Esse comando um dos mais conhecido dentre as linguagens de programao, sua funo testar se uma condio verdadeira, em sendo, executa o bloco seguinte sua escrita, veja o exemplo: if ( 2 > 1) { .... } Fcil isso ? Pode crer que no exame no cair questes que abordem essa complexidade, ou melhor essa simplicidade. Veja agora o trecho a seguir : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 1.bytex=10; 2.if(x -2147483648 Long.MIN_VALUE -> -9223372036854775808 Note que quando o valor informado for igual ao valor de Integer.MIN_VALUE e Long.MIN_VALUE a funo no retorna o valor absoluto, isso s para complicar nossa vida. ceil Retorna o nmero "ponto flutuante inteiro" superior mais prximo. 1. 2. 3. 4. floor Retorna o nmero ponto flutuante inteiro inferior mais prximo. 1. 2. 3. 4. 5. max Esse mtodo retorna o maior nmero entre dois informados, sua assinatura de mtodos : 1. 2. 3. 4. publicstaticintmax(inta,intb) publicstaticlongmax(longa,longb) publicstaticfloatmax(floata,floatb) publicstaticdoublemax(doublea,doubleb) publicstaticfloatfloor(floatvalue) publicstaticdoublefloor(doublevalue) System.out.println(Math.floor(-10.9));//Resultado:-11.0 System.out.println(Math.floor(12.2));//Resultado:12.0 publicstaticfloatceil(floatvalue) publicstaticdoubleceil(doublevalue) System.out.println(Math.ceil(3.8));//Resultado:4.0 System.out.println(Math.ceil(-3.3));//Resultado:-3.0

Observe que no existe assinatura para os tipos byte, short porque esse podem implicitamente ser convertidos para int. 1. System.out.println("Omaiorentre-8e-9:"+Math.max(-8,-9));//Resultado:-8 2. System.out.println("Omaiorentre-8e9:"+Math.max(-8.0,9));//Resultado:9.0 Por mais que no exista um mtodo com as assinaturas (double, int) seguindo as regras de valores literais da Java, o valor 9 convertido implicitamente para double por isso o resultado : 9.0 um tipo double. min Esse mtodo retorna o menor nmero entre dois informados, suas assinaturas so: public public public public static static static static int min(int a, int b ) long min(long a, long b ) float min(float a, float b ) double min(double a, double b )

Observe que no existe assinatura para os tipos byte, short porque esse podem implicitamente ser convertidos para int. 1. System.out.println("Omenorentre-8e-9:"+Math.max(-8,-9));//Resultado:-9 2. System.out.println("Omenorentre8e-9:"+Math.max(8,-9.0));//Resultado:8.0 Por mais que no exista um mtodo com as assinaturas (int, double) seguindo as regras de valores literais da Java, o valor 8 convertido implicitamente para double por isso o resultado : 8.0 um tipo double. round Arredonda um numero ponto flutuante recebido como argumento, veja suas assinaturas: public static int round(float a) public static long round(double a) Note que como sua funo arredondar, deve retornar um tipo inteiro, porm como o argumento pode ser um float (32 bits) ou um double (64 bits) o retorno deve suportar essa quantidade de bits por isso o tipo de retorno muda conforme o argumento de entrada. 1. 2. 3. 4. 5. 6. 7. 8. classTeste{ publicstaticvoidmain(Stringargs[]){ System.out.println(Math.round(9.4));//Resultado:9 System.out.println(Math.round(9.5));//Resultado:10 System.out.println(Math.round(9.9));//Resultado:10 System.out.println(Math.round(-9.9));//Resultado:-10 } }

Para entender, vamos dividir em duas regras: 1) Nmero positivo: Arredondando um nmero positivo: o algoritmo soma ao nmero informado 0.5 e trunca o nmero, como podemos ver a seguir: |3.9| + 0.5 = 4.4 // Resultado: 4 |3.5| + 0.5 = 4.0 // Resutlado: 4 |3.4| + 0.5 = 3.9 // Resultado: 3 Funciona exatamento como os mtodos Math.ceil (se o nmero decimal for maior ou igual a 0.5) e Math.floor (se o nmero decimal for menor que 0.5) ! 2) Nmero negativo: |-3.9| + 0.5 = -4.4 // Resultado: -4 |-3.4| + 0.5 = -3.9 // Resultado: -3 |-3.5| + 0.5 = -4.0 (deveria), mas o resultado : -3 Pode parecer estranho o fato de que no primeiro caso o resultado foi -4 onde o esperado fosse -3, porm nesse caso o round ignora o sinal, ou seja, trabalha com nmeros absolutos - porm como os criados da linguagem java gostam de complicar, existe um exceo no caso de nmero negativo quando o valor decimal do nmero for 0.5 o nmero ser arredondado para cima. Vejamos exemplos: Math.round(-3.5) // Resultado: -3 Math.round(3.5) // Resultado: 4 Math.round(-3.4) // Resultado: -3 Math.round(-3.6) // Resultado: -4 random O mtodo Math.random retorna um nmero aleatrio entre 0.0 e menor que 1.0. public static double random() System.out.println( Math.random() ); // Resultado: qualquer valor entre 0.0 (inclusive) e menor que 1.0

sin Retorna o seno de um ngulo, para o exame voc ter que saber como calcular o sena de qualquer espcie de ngulo, precisar ser um matemtico e fsico (calma, no desista, s estava brincando) ! Voc no precisar saber como se calcula nenhum ngulo, basta saber que recebe um argumento que um valor de um ngulo em radiano. public static double sin(double a) cos Calcula o co-seno de um ngulo. public static double cos(double a) tan Retorna a tangente de um ngulo. public static double tan(double a) Lembre-se que esse trs ltimo mtodos recebe um valor de grau em radiano, no tente passar por exemplo 90" como parmetro que voc poder ser supreendido com um resultado: prdio no cho !!! (os engenheiros que me perdoe) sqrt Retorna a raiz quadrada de um nmero. public static double sqrt(double a) System.out.println(Math.sqrt(9)); // Resultado: 3 Como voc um cara esperto, deve estar se perguntando: "E se tentar passar um nmero negativo para obter a raiz quadrada ? " - aahah, eu sabia que voc questionaria isso. Como todos sabem, pelo menos uma grande maioria, t bom, algumas pessoas, ou melhor um grupo bem seleto, ufa!, sabe que no existe raiz quadrada de um nmero negativo, portanto se voc passar -9 para esse mtodo, voc obter um resultado NaN (Not a Number - ou No um nmero). toDegrees Retorna um valor de um ngulo em graus, para isso voc deve passar um ngulo em radiano. public static double toDegrees(double a) Math.toDegrees(Math.PI * 2.0) // Retorna: 360.0 toRadians Retorna em radiano um ngulo informado em graus. public static double toRadians(double a) Exemplo: Calculando o seno de um ngulo System.out.println("O seno de 90\" : "+Math.sin(Math.toRadians(90.0))); // Resultado: 1.0 Note que usamos dois mtodos encadeados para que o clculo fosse realizado, visto que o mtodo sin recebe um valor em radiano e por isso usamos o mtodo toRadians para converter 90.0 (em graus) para radiano. Algumas observaes sobre a classe Math double x; float p_i = Float.POSITIVE_INFINITY; double n_i = Double.NEGATIVE_INFINITY; double n_a_n = Double.NaN; if ( n_a_n != n_a_n) System.out.println("NaN diferente de NaN"); // Ser ecoada, pois NaN no igual a nada inclusive a NaN

if (Double.isNaN(n_a_n)) System.out.println(" um NaN"); // resultado: um NaN x = Math.sqrt(n_i); // Alerta geral ! ser atribudo NaN para x if (Double.isNaN(x)) System.out.println( "x um NaN"); // Resultado: x um NaN System.out.println( 32 / 0 ); // Resultado: java.lang.ArithmeticException System.out.println( 32.0 / 0.0 ); // Resultado: Infinity System.out.println( -32.0 / 0.0 ); // Resultado: -Infinity System.out.println( 32.0 / -0.0 ); // Resultado: -Infinity System.out.println( -32.0 / -0 ); // Resultado: -Infinity System.out.println( 32.0 / -0 ); // Resultado: Infinity System.out.println( -32.0 / -0.0 ); // Resultado: Infinity (ops! jogo de sinal, vamos entender isso mais abaixo) bom ressaltar uma regra ou melhor exceo quando envolvemos nmeros ponto-flutuante em Java. 3) Dado o cdigo, o que acontecer ?1. publicclassTest{ 2. publicstaticvoidmain(String[]args){ 3. System.out.println("-32.0/-0.0->"+-32.0/-0.0); 4. System.out.println("-32.0/0.0->"+-32.0/0.0); 5. System.out.println("32.0/0.0->"+32.0/0.0); 6. System.out.println("32.0/-0.0->"+32.0/-0.0); 7. System.out.println("-32/-0.0->"+-32/-0.0); 8. System.out.println("32/-0.0->"+32/-0.0); 9. System.out.println("-32/0.0->"+-32/0.0); 10.System.out.println("32/0.0->"+32/0.0); 11.System.out.println("-32.0/0->"+-32.0/0); 12.System.out.println("-32.0/-0->"+-32.0/-0); 13.System.out.println("32.0/0->"+32.0/0); 14.System.out.println("32.0/-0->"+32.0/-0); 15.System.out.println("-32/-0->"+-32/-0); 16.System.out.println("-32/0->"+-32/0); 17.System.out.println("32/-0->"+32/-0); 18.System.out.println("32/0->"+32/0); 19.System.out.println(""); 20.} 21.}

a) Erro de compilao b) java.lang.ArithmeticException na linha 17 c) Mostrar os valores fazendo jogo de sinal para as divises d) Erro de compilao na linha 19 e) java.lang.ArithmeticException na linha 15 Resposta no final do captulo !!! Entendendo como Java trata a diviso por 0 (zero) Para ajudar entender as regras abaixos, voc precisar saber que: | 86 |__2__

43 0 Onde: 86 o divisor 2 o dividendo 43 o quociente 0 o resto Peo desculpas aos que j conhecem essa antiga conveno. ": )" Maiores informaes visite o site: http://educar.sc.usp.br/matematica/m4p1t6.htm Continuando... Quando o divisor e o dividendo forem nmeros inteiros: Se o divisor for 0, ser lanada uma exceo. 1. System.out.println(32/0);//exceo 2. System.out.println(-32/-0);//exceo Quando a operao envolver pelo menor um nmero ponto flutuante: Quando o divisor for 0: NUNCA HAVER A TROC