Escolar Documentos
Profissional Documentos
Cultura Documentos
Guia Do Exame SCJP
Guia Do Exame SCJP
CERTIFIED
Java Programmer
Sun
Guia do Exame
FOCANDO NO EXAME
Sumrio
XVII
Sumrio
XVIII
Sumrio
XIX
XX
Sets ............................................................................................................ 150 PriorityQueue ............................................................................................ 154 Reviso ...................................................................................................... 157 Genricos ................................................................................................... 160 Pr-Java 5 .................................................................................................. 161 Polimorfismo e Genricos .......................................................................... 167 Coringa <?> ........................................................................................... 173 Supertipo <?> ......................................................................................... 174 Criando suas prprias classes genricas .................................................... 180 Criando mtodos genricos ....................................................................... 181
Sumrio
XXI
Quando sincronizar? ..................................................................... 217 Iterao entre as Threads .......................................................................... 223 Quando usar? ...................................................................................... 223
Captulo 1
Modificadores de Acesso
public, protected, default e private Uma classe s pode ser PUBLIC ou DEFAULT.
Default quando uma classe tem o acesso default, o nvel de acesso restrito aos pacotes package, ou seja, apenas as classes dentro daquele package tm acesso aos mesmos disponveis naquela classe. Em outras palavras no podemos importar uma classe default a partir de outro package.
package cap1.x; class Casa { } package cap1.y; import cap1.x.Casa; public class Zona { //esse cdigo no compila; Casa tem o acesso default //s pode ser vista dentro do package cap1.x } package cap1.x; public class Zar { /* observe que tenho um objeto de minha class Casa * devido a ela estar no mesmo package*/ Casa c; }
package cap1.x; public class Jarro {} package cap1.y; import cap1.x.Jarro; class Jar { /* observe que minha class Jarro public, ento posso import-la para outros pacotes*/ public static void main(String[] args) { } }
private class no existem classes private, protected, todas as classes s podem ser public ou default. Private e protected so aplicados aos membros. Veja a seguir as possiveis pegadinhas que podem aparecer no exame.
Uma classe final quebra o conceito de extensibilidade do Java e principalmente do polimorfismo. Dica: Lembre-se desse conceito, pode-se deparar com uma questo terica no exame
package cap1.y; private class Priv { public static void main(String[] args) { }} Exception in thread main java.lang.Error: Unresolved compilation problem: at cap1.y.Priv.main(Priv.java:3)
classes Abstract e final - so dois tipos de modificadores no referentes ao nvel de acesso que podemos utilizar em uma classe de topo do nvel. final class uma classe marcada como final o mesmo que dizer: essa classe no pode ter filhos, ela nasceu com problemas no ovrio. Mas exatamente isso que acontece quando se tem uma classe como final e no pode ter o relacionamento -UM. O fato de criar uma classe final dizer que a classe j disse tudo a respeito de seus mtodos e no precisa da minha opinio ou de algum para dizer que tem algo de errado. Uma classe final quebra o conceito de extensibilidade do Java e principalmente do polimorfismo.
package cap1.x; public final class Pai { } class filho extends Pai{} /* isso no compila; a class Pai no pode ter filho * questo de gentica */
final aplicado a um mtodo significa que o mtodo herdado por uma subclasse, porm a subclasse NO pode subscrever esse mtodo, na tentativa do cdigo no compilar. O modificador final uma segurana onde se torna classe, mtodos e variveis inalterveis.
package cap1.x;
class Papi { final void setNum(){System.out.println(final);} } /* aqui estou subscrevendo meu mtodo final, isso no vlido para um cdigo que no compila */ class fifi extends Papi{ public void setNum(){} }
package cap1.x; class Al{ final void setName(){System.out.println(final herdado);} } class Est extends Al{ public static void main(String[] args) { new Est().setName(); }} Imprime: final herdado
Classes abstract completamente o oposto de uma declarao de final class. Em uma abstract class, obrigatrio haver uma class extends para ela fornecer implementaes dos mtodos abstract. Regras de abstract: Nunca usar abstract com: final e private. Uma class abstract pode ter mtodos abstract ou no. Os mtodos abstract terminam com ponto-e-vrgula e tm o modificador (abstract) que os acompanham Um mtodo abstract na class, a mesma deve ser abstract, seno o cdigo nem compila. No se instancia algo abstract (new class()) isso nem compila. Possuem construtores das classes abstract.
package cap1.x; public abstract class Bike { public void cor(){} //mtodo no abstract sem modificador e com chaves {} abstract void marca();//mtodo abstract com modificador e ponto-e-vrgula } package cap1.x; public class Guri extends Bike{ /* com mtodo da class abstract implementado * corretamente, o cdigo compila */ public void marca(){System.out.println(caloi);} public static void main(String[] args) { }}
Uma class concreta deve fornecer implementaes para todos os mtodos abstract da class no concreta. Isso uma REGRA, porm uma class filha abstract no tem obrigao de fornecer implementaes de nenhum mtodo abstract da class pai abstract.
package cap1.x; public abstract class Jogo { abstract void nome(); } abstract class start extends Jogo{ /* a class abstract no tem obrigao de implementar * os mtodos da superclass abstract */}
No compila
package cap1.x; public abstract class Notcomp { void setName(); // no compila, o modificador abstract foi omitido public static void main(String[] args) { /* no compila; a class concreta no implementa o mtodo abstract da class abstract */ Notcomp nt = new Notcomp(); System.out.println(zomm); }} package cap1.x; public abstract class Zz { abstract void ordem(); } package cap1.x; class Zazz extends Zz{ /* no compila; a class concreta no implementa o mtodo abstract da class abstract */ public static void main(String[] args) { }}
O mtodo abstract obrigado a ser implementado por uma class concreta. O uso do modificador private com abstract no combina muito bem, devido o uso do modificador ser restrito a class. Veja o problema:
package cap1.x; public abstract class Problem { private abstract void setNN(); /* o cdigo no compila abstract and private jamais, abstract e final tambm no*/ }
package cap1.x; abstract class ProFin { /* tambm no compila * */ final abstract void setnn(); public static void main(String[] args) { }}
O uso dos modificadores: public e default class, mtodos e variveis abstract, native somente mtodos private, protected, final mtodos e variveis stricfp classes e mtodos
Interface apenas um contrato que a classe deve cumprir com a interface que a implementa. As interfaces: No fazem parte da herana Java. Todos os mtodos de uma interface so public e abstract implicitamente. As variveis so implicitamente public static final. Uma interface pode aplicar extends em outra, porm jamais implementar. Uma interface no pode implementar uma class. Uma class pode implementar varias interfaces. No se podem ter mtodos com chaves{} em uma interface. As variveis/mtodos no tm outro modificador alm de public.
package cap1.y; public interface Dados { int z =10; void num(); } package cap1.y; class joga implements Dados { /* o cdigo compila normalmente; implementei meu mtodo e imprimi o valor da interface*/ public void num() { } //mtodo implementado public static void main(String[] args) { System.out.println(z); }}
public interface Dados { int z =10; void num(); } public class Jhg implements Dados { static int z=8; public void num() { } public static void main(String[] args) { /*refere-se ao static da class * */ z=9; //no compila; tentei alterar o valor de uma varivel final da interface }} Dados.z=20; public class Nointer implements Dados{ void num(){} /* no compila onde est o public? No posso converter de public para default */}
No posso combinar nenhum destes modificadores com os mtodos da INTERFACE: final o mtodo no pode ser subscrito private o mtodo no pode ser herdado native somente a mtodos stricfp classes e mtodos synchronized somente a mtodos concretos e blocos de cdigo. (interface mtodos abstract)
interface Corp { void seta(){} /* no posso ter mtodos com chaves em uma interface, * pois os mtodos so implicitamente abstract aqui */}
10
Modificador de Acesso
Este conceito to importante quanto qualquer outro assunto e no exame, a Sun lida com eles em todos os assuntos. s vezes, o escopo da pergunta sobre Threads, mas, na verdade, o objetivo testar o uso dos modificadores de acesso.
Public funciona da seguinte forma: se a class public, voc pode ter acesso aos membros public e protected dessa classe.
Agora, se sua class no public, ou seja, default e se os membros forem public (mtodos e variveis), o acesso ainda por pacote. Tudo depende do modificador da class para depois verificar se o membro visvel ou no.
package cap1.f; public class Fog { private int z; public void cor(){} } package cap1.g; import cap1.f.Fog; class Ge{ /* vlida a class Fog public e o mtodo cor tambm * s no posso chamar a varivel private aqui */ public static void main(String arg){ new Fog().cor(); }}
11
package cap1.g; class Refrig { public void marca(){} } package cap1.f; import cap1.g.Refrig; /* no compila; a class Refrig s vista dentro do package cap1.g se a tentativa de importar para outro o cdigo no compilado */ public class Ben { public static void main(String[] args) { }
package cap1.f; public class Aviao { private int num=10; } package cap1.f; public class Opera { public static void main(String arg[]){ System.out.println(new Aviao().num); } /*no compila; a varivel num private da class aviao; ningum pode saber que ela existe */ }
12
Protected tem apenas um objetivo acessar, um membro da class atravs de um pacote diferente. Porm, somente funciona atravs da herana.
package cap1.g; /* observe o package dessa class */ public class Zer { protected void zar(){System.out.println(membro protected);} } package cap1.f; import cap1.g.Zer; class Zr extends Zer{ /* o mtodo com o modificado protected foi herdado e estou chamando-o */ public static void main(String[] args) { new Zr().zar(); }} package cap1.g; /* observe o package dessa class */ public class Zer { protected void zar(){System.out.println(membro protected);} } package cap1.f; import cap1.g.Zer; class Zarra extends Zer{ /* isso no compila; no posso usar o nome da superclasse para chamar o mtodo protected */ public static void main(String[] args) { new Zer().zar();
13
} } Exception in thread main java.lang.Error: Unresolved compilation problem: The method zar() from the type Zer is not visible
Varivel Local
Uma varivel local s pode ser marcada com o modificador FINAL; qualquer outro o cdigo nem compila.
class Foo { void f(){ /* no compila; modificador invlido para esse tipo de variavel*/ private int z=0; }} class Fac { void setN(){ /* modificador vlido para a varivel local * o cdigo compila tranquilamente */ final int a=0; } }
Regras: As variveis locais antes do uso devem possuir um valor, caso contrrio, um erro de compilao ocorre ao tentar usar uma varivel local sem valor. Elas no recebem valor padro como as variveis de instncia. So destrudas aps a concluso do seu escopo.
14
class Fac { void setN(){ int z; System.out.println(10); /* compila normalmente; no usei a varivel local, apenas declarei */ }} class Foo { void f(){ /* no compila; tentei usar uma varivel local sem valor; elas no recebem um valor padro como as variveis de instncia */ int num; System.out.println(num); }}
Construtores
Refere-se construo de objetos da classe. Posso usar qualquer um dos modificadores: public, protected, default e private. Um construtor jamais pode ter: final aplica-se somente a mtodos, classes e variveis static somente a variveis e mtodos abstract somente a classes e mtodos synchronized somente a mtodos e blocos native somente a mtodos stricfp classes e mtodos
Um construtor tem o mesmo nome da classe sem o tipo de retorno e sempre sobrecarregado. Se houver um tipo de retorno, ele ser
15
um construtor s pode chamar outro construtor. No pode chamar um construtor dentro de um mtodo ou um bloco. Sempre dentro de outro construtor. ISSO UMA REGRA.
public class Ball { public Ball(int a) { } } /* a class filha obrigada a chamar o construtor da superclass, seno o cdigo nem compila */ class Player extends Ball{ Player(){ super(2); }}
Se o programador no fornecer nenhum construtor, o compilador fornecer um sem argumentos. O compilador sempre faz uma chamada implcita para super(). Dica: No se esquea que o construtor padro somente fornecido quando no declaramos nenhum construtor.
16
public class Peek { } class Pee extends Peek{ Pee(){} /* chamada implcita para super()*/ } public class Nota { Nota(int n){} } class Al extends Nota{ Al(){} /* o cdigo no compila; a superclass no tem nenhum construtor sem argumento. * ento sou obrigado a chamar o construtor criado explicitamente */ } public class Nota { Nota(int n){} Nota(){} } class Al extends Nota{ Al(){} /* agora compila uma chamada implcita para super() - voc no obrigado a chamar todos os construtores */ }
this sempre chama algo sendo executando no momento e no caso do construtor, chama o da prpria class.
17
public class ConstPriv { private ConstPriv(){} public static void main(String[] args) { }} /* o cdigo no compila a subclass que est chamando o construtor da superclass, que private e ela nem deveria saber que ele existe*/ class Cont extends ConstPriv{ Cont(){} }
Modificador Static
Permite acessar um membro sem precisar criar uma instncia da classe(new class()).
mtodos, variveis, blocos e class(aninhada). Esses podem ser marcados com o modificador static.
Isso nao pode ser usado com o modificador static: variveis locais apenas final construtores usado para criar a instncia class public e default interface public e default enum public e default.
public class Zorra { static int n=9; public void run(){ int n1=n; } /* aqui no h problemas, nenhum membro no static pode chamar os membros static. observe que o acesso direto*/}
18
public class Member { int z=10; static void setNum(){ int z1 = z; /* no compila; mtodo static chamando um membro no static isso no vlido o membro no static precisa de uma instncia de class */ }}
o valor de um membro static compartilhado por todos. Static s visualiza outro static.
public class Full { static int z=20; public static void main(String[] args) { System.out.println(z); } /* no h problemas aqui, o cdigo compila tranquilamente */ } import static java.lang.System.out; public class FullProb { int num=0; public static void main(String[] args) {
out.println(num);
} /* no compila o membro no static sendo chamado dentro de um contexto static */ }
19
Enum
um tipo de class especial, o objetivo aqui criar constantes. Pode ser declarado fora de uma class ou dentro de uma class. Modificadores vlidos:
Public e default
public class Flor { enum floresta{LEAO, LEOA, TRIGRE} public static void main(String[] args) { floresta f = floresta.LEAO; System.out.println(f.toString()); } /* imprime LEAO */ }
20
public class EnumNo { public static void main(String[] args) { enum time{Flamengo,Palmeiras}; /*no compila enum dentro de um mtodo */ } } private enum Veiculos { /* no aceita nenhum modificador alm de public e default*/ } package cap1.f; public enum Map { BIG(8),HUGE(10); Map(int z){ id=z; } int id; /* declarao vlida; construtor enum sobrecarregado*/ }
Captulo 2
22
Polimorfismo - permite a criao de muitas formas e tem o relacionamento semelhante herana. A reutilizao est inserida no conceito de polimorfismo.
Quando se passa no teste -UM, temos o polimorfismo. aplicado tambm com INTERFACE pela palavra-chave implements e pela herana com a palavra-chave extends.
public class Veiculo {} class Carro extends Veiculo{} // carro -UM veiculo interface Som{} /* Vectra um carro que implementa um Som implements -UM. */ class Vectra extends Carro implements Som{}
Varivel de referncia determina qual mtodo ser chamado e durante a execuo, o seu tipo no pode ser modificado. Mas... pode referir-se ou apontar para qualquer objeto que passe no teste -UM. A varivel de referncia fica antes do = (sinal de igualdade). Vlidos:
Carro car = new Carro(); Object o = car;//Object super de car Veiculo v = car;//Veiculo super de car carro
Invlidos:
Veiculo v = new Veiculo();//aqui vlido Som s = v; //Som sub de Vectra Carro c = v;//Carro sub de Veiculo e no super
23
O tipo da varivel de referncia s pode chamar aquilo que a superclass conhece, caso contrrio, o cdigo nem compila.
public class Concorrencia { void setTel(){} } class Voip extends Concorrencia{ void setTel(){System.out.println(subcsrito);} void setCusto(){System.out.println(custo);} } public class Principal { public static void main(String[] args) { Concorrencia c = new Voip(); c.setTel();//chama o mtodo subscrito; /* a linha abaixo no deixa o cdigo compilar a superclass no tem esse mtodo */ c.setCusto(); }} Exception in thread main java.lang.Error: Unresolved compilation problem: The method setCusto() is undefined for the type Concorrencia
O tipo do objeto s chamado com mtodos de instncia. E quando deseja chamar o mtodo subscrito, usa o tipo do objeto. Static e variveis so chamados por variveis de referncia. Superclass s = new Subclass(); s.mtodo(); //chama o mtodo subscrito
24
Caso o mtodo no seja subscrito, chamado o da superclass. Porm, isso no funciona com os mtodos static, j que nem eles so subscritos e sim, redefinidos, e as variveis tambm no so herdadas. Veja:
public class Casa { static void cor(){System.out.println(azul);} } class Ap extends Casa{ static void cor(){System.out.println(amarelo);} } public class CaPrin { public static void main(String[] args) { Casa c } /* imprime a cor azul */ } = new Ap(); c.cor();
Dica: Combinar ABSTRACT com: - private no herdado; - final no pode ser subscrito; - static no herdado = O CDIGO NO COMPILA
Sobrecarga de mtodos o fato de ter vrios mtodos com o mesmo nome, porm com uma lista de argumentos com tipos diferentes. No mtodo sobrecarregado, o tipo de varivel de referncia diz qual mtodo vai ser chamado, ao contrrio do tipo do objeto que chama o mtodo subscrito pela subclasse.
25
class Mundo {} public class Terra extends Mundo{} public class Galatix { void chama(Mundo m){ System.out.println(mundo chamando); } //mtodo sobrecarregado void chama(Terra t){ System.out.println(terra chamando); } public static void main(String[] args) { Galatix g = new Galatix(); Mundo m = new Mundo(); Terra t = new Terra(); /* aqui ele chama mundo e depois terra, de acordo com o tipo passado em args */ g.chama(m); g.chama(t); /*neste aqui, chama o tipo de referncia e no o tipo do objeto Terra. */ Mundo m2 = new Terra(); g.chama(m2); }} EXIBI: mundo chamando terra chamando mundo chamando
Regras do sobrecarregado: Deve alterar a lista args Pode lanar excees novas e mais abrangentes Pode alterar o tipo de retorno
26
Regras do subscrito: no pode alterar a lista args no pode alterar o tipo de retorno (exceto com o retorno de covariantes Java 1.5). Vlido somente para os objetos. pode lanar excees novas e menos restritivas.
Para entender, basta lembrar dos recursos de herana como UM. A partir do Java 1.5 permitido que o mtodo subscrito retorne um valor que passe no teste -UM, desde que esse seja um objeto e no um tipo primitivo.
public class Super { void soma(){} public static void main(String[] args) { } } /* no compila o mtodo subscrito lanando uma exceo mais abrangente que o mtodo da superclass */ class Sub extends Super{ void soma() throws Exception {} /* dica- quando no declaro uma exceo, implicitamente meu mtodo lana uma exceo no verificada RuntimeException*/ } public class Sitio { void mum() throws Exception{} public static void main(String[] args) {} } class Cad extends Sitio{ void mum(){} /* aqui no h problemas, minha subclasse subscreve; o mtodo no tem obrigao de lanar uma exceo ou tratar */ }
27
public class Cobra { void cor(){} public static void main(String[] args) {} } class Minhoca extends Cobra{ void cor() throws NumberFormatException{} /* o cdigo compila sem problemas ja que a subclass lana uma exceo menos abrangente que da superclass */ } public class Tarta { void casco(){} public static void main(String[] args) {} } class Cagado extends Tarta{ void casco() throws Exception{} /* o cdigo no compila a subclass est lanando uma exceo mais abrangente que da superclass */ }
Converso de variveis de referncia tenha muita ateno ao se deparar com este assunto no exame. Aparece por todo o exame e as questes no so as mais simples de responder.
28
public class Tranpor {} class Onibus extends Tranpor{} public class Conducao { public static void main(String[] args) { Tranpor t = new Tranpor(); Onibus o =(Onibus)t; /* o cdigo compila devido s classes envolvidas Tranpor e Onibus fazerem parte da mesma herana, porm uma exceo lanada e no posso dizer que todo Transporte um nibus */ }} Exception in thread main java.lang.ClassCastException: public class Esport {} class Boxe extends Esport{} public class Quadro { public static void main(String[] args) { Esport e = new Boxe(); Boxe b =(Boxe)e;//compila e roda sem problemas Esport es=b;//boxe um esport }
public class Esport {} class Capoeira extends Esport{} public class CapBa { public static void main(String[] args) { Esport t = new Esport(); Capoeira ca=(String)t; } /* nem compila; String no faz parte da herana entre essas classes, o compilador no permite a compilao*/ }
29
Invlido:
Esport p = new Esport(); // no posso converter o objeto //Esport em Boxe: Boxe bh = (Boxe)p;
Implementando uma interface um pouco mais de regras a serem seguidas. Uma classe concreta deve implementar todos os mtodos de uma interface. Caso exista uma subinterface, os mtodos dela tambm devem ser implementados.
interface luz extends cor{ void marca(); } interface cor{ void ss(); } class carr implements luz{ /*deve implementar todos os mtodos de luz e cor */ public void marca(){} public void ss(){} }
uma interface no implementa nada, somente estende com extends a outra interface.
interface roda{} /* vlida a relao entre as interfaces */ interface modelo extends roda{}
30
interface moda implements loja{} /* nem compila; a interface no implementa nada*/ interface loja{}
interface roupa{} /* no compila; uma class no aplica extends em nada que seja uma class e roupa uma interface */ class fab extends roupa{}
Retorno de covariantes Este no um assunto complicado. Porm, no exame ele apareceu a todo o momento, sempre quando envolvia herana e a subscrio estava no retorno de covariantes marcando presena. Para entender, basta lembrar dos recursos de herana. -UM, no Java 1.5, permite que o mtodo subscrito retorne um valor um.(Desde que seja um objeto e no tipos primitivos)
public class Foo { Object go(){return null;} } class Bar extends Foo{ /* String -um Object; tranquilamente */ String go(){return null;} }
cdigo
compila
31
public class Primit { int go(){ return 1;} } class Prim extends Primit{ char go(){return d;} /* o cdigo no compila, alterei o tipo, porm no args char no passa no teste -um para o tipo primitivo; isso s funciona com objetos.*/ } class Numbr { Number go(){return null;} } class numb extends Numbr{ Integer go(){return null;} /* o cdigo compila normalmente; objeto Integer um Number */ } public class Numeros { int go(){ float f=10.0f; return (int)f; } /* compilar normalmente se remover ( ); o f de 10.0 no compila */ } public class Varia { int go(){ return 10.0; /*no compila o tipo de retorno; int e no double */ } }
32
public class Floa { float go(){ return 1; /* compila normalmente no h problema retornar um int para um float */ } public static void main(String ar[]){ System.out.println(new Floa().go()); } } Exibe 1.0
public class SupStatic { static void set(){System.out.println(super);} public static void main(String[] args) { SupStatic sp = new substati(); sp.set(); } /* o mtodo que chamado foi da varivel de referncia, j que os mtodos static no so subscritos */ } class substati extends SupStatic{ static void set(){System.out.println(sub);} }/* imprime super*/
33
public class Wv { static void num(){System.out.println(static);} void num(){System.out.println(non-stati);} public static void main(String[] args) {} /* o cdigo no compila dois mtodos com tipos de argumentos iguais, com o mesmo nome e retorno tambm. O fato de ser static no muda a regra Static no um tipo de retorno e sim um modificador */ } public class Kv { static int num; public static void main(String[] args) { System.out.println(num); } /* varivel static; posso chamar diretamente e no precisa de uma instncia de class */ } public class StaticMet { void mtodo(){} public static void main(String[] args) { mtodo(); } /* no compila o mtodo no static sendo chamado dentro de um mtodo static*/ }
Quando uma classe mal encapsulada, temos a o acoplamento forte e suas variveis public um exemplo. Quando a class A
34
sabe mais do que devia da class B e uma alterao em uma das classes danifica a outra, isto um acoplamento forte.
public class A { int r =10; void met(){ B b = new B(); r=b.num; }} /* observe que a class B e a class A sabem demais uma sobre a outra e isso um estado indesejvel */ class B{ public int num=50; void met(){ num = new A().r; }}
Coeso o grau, o objetivo ou o foco de uma classe. Quando desenvolvemos uma class e ela faz tudo como, por exemplo, gerar relatrio, conectar um banco de dados etc., isso uma baixa coeso porque no tem nenhum foco. A partir do momento em que defino o objetivo, o foco de minha classe, tenho alta coeso. A coeso est relacionada classe estar focada ou no.
35
public class Cad_cli { void dados(){} void endereco(){} } /* tenho aqui alta coeso entre as classes */ class Relatorio{} class Bd_connectar{} public class Usuario { void relat(){} void savearq(){} void exportar(){} /* tenho aqui a baixa coeso, pois uma class que faz tudo. Aqui, tenho o problema de que ter que digitar o cdigo novamente, caso precise de um dos recursos dos mtodos em outra classe*/}
Captulo 3
Atributos
Tenha cuidado com as questes com fluxo de controle, pois elas tendem a ser mais difceis por necessitarem de mais ateno do candidato. As variveis aparecem em qualquer lugar de uma classe java e conhecer como ela se comporta, tendo como base onde foi declarada, essencial para acertar as questes no exame. O uso de uma varivel local permitido aps ser atribudo o valor e somente vista naquele contexto onde foi declarada. Lembre-se que as variveis locais no recebem um valor padro quando so declaradas. Uma varivel de instncia de objetos recebe o valor null, como padro. Uma tentativa de manipular esse valor lanando uma exceo no verificada: NullPointerException.
Varivel de Instncia
38
Um detalhe importante o uso do modificador final em uma varivel; esta deve ter um valor inicial, caso contrrio, o cdigo no compila. Vejamos no nvel do cdigo.
public class Varva { int z; void mtodo(){ int z; System.out.println(z); /* o cdigo no compila; tentei usar uma varivel local sem inicializar*/ } public static void main(String[] args) {}}
public class Var { int z; void mtodo(){ int z; System.out.println(this.z); /* aqui no temos problema nenhum, a varivel da instncia chamada e no o cdigo local, e imprime 0 */ } public static void main(String[] args) { new Var().mtodo(); }}
Variveis de instncia do array - no se pode esquecer que no fundo, um array um objeto e isso fundamental ter em mente. Na declarao, um array null, mas quando este instaciado os elementos contidos nele sero do tipo declarado.
Captulo 3 - Atributos
39
public class Array { int[] array;// aqui recebe null porque apenas declarei int [] ar = new int[2];// aqui recebe o valor padro cada elemento public static void main(String[] args) { /* vlido; os cdigos abaixo compilam normalmente */ System.out.println(new Array().array); System.out.println(new Array().ar[1]); System.out.println(new Array().ar);//imprime a referncia do objeto(j que instanciei) } resultado: null 0 I@18d107f
Varivel local se inicializar uma varivel local dentro de um bloco condicional (if/while), o compilador ir reclamar.
public class Cond { void met(){ int n; while(true){ n=4; } System.out.println(n); } /* esse cdigo no compila porque estou inicializando minha varivel local dentro de um bloco de instruo e isso no ser vlido se o cdigo for false. Ento, o que o compilador faz? Para evitar transtorno, ele no aceita, mesmo sendo true */}
Captulo 4 - Operadores
59
boolean b = true; if(b = false); // ele recebe false no compara //invalido o codigo abaixo int x=1; if(x = 0)// x inteiro e no booleano.
Enums
Enum: um tipo especial de class. Os membros de uma enum so constantes. Pode ser declarado tanto fora quanto dentro da class No valido declarar uma enum dentro de um mtodo.
Os enums so static e final. Para enums pode usar o = = ou equals() para comparao das duas variveis.
class EnumEqua2l{ enum Color{RED, BLUE} public static void main(String args[]){ Color c1 = Color.RED; Color c2 = Color.BLUE; if(c1= =c2){ System.out.println(= =); } if(c1.equals(c2)){System.out.println(dot equals);} }}
60
enum Fest{CARNAVAL,SAOJOAO,NATAL} class Em{ public static void main(String args[]){ Fest f = Fest.NATAL; System.out.println(f.toString()); } } class Festa{ enum zorra{TIRADENTES,SOLDADO}; //static,public,protected. default - valido //abstract, final - invalido public static void main(String args[]){ System.out.println(zorra.SOLDADO); } }
No compila
class Enum{ final enum Pu {FUTEBOL, VOLEI,BOXE}; public static void main(String args[]){ System.out.println(Pu.BOXE==Pu.BOXE); Pu p = Pu.FUTEBOL; Pu p2 = Pu.FUTEBOL; System.out.println(p.equals(p2)); } } //no compila olha o modificar de acesso de enum class Enum{ abstract enum Pu {FUTEBOL, VOLEI,BOXE}; public static void main(String args[]){ System.out.println(Pu.BOXE==Pu.BOXE);
Captulo 4 - Operadores
61
Instanceof
Este operador usado apenas para variveis de referencia de objeto para verificar se um objeto especifico de outro.
class A{} class B extends A{ public static void main(String args[]){ A meuA = new B(); // um objeto de b do tipo A B meuB = new B(); m2(meuA); } public static void m2(A a){//esse mtodo so recebe argumento que seja da classe pai if(a instanceof B) ((B)a).doStuf(); // converto o objeto a em b } public static void doStuf(){ System.out.println( a refere to a B); }}
62
Um objeto s vai ser especifico do outro se passar no teste -UM. bom lembrar que se uma class implementa uma interface ela faz parte do teste -UM ento temos ai um instanceof valido:
interface foo{} class a implements foo{} class b extends a{} a a = new a(); b b = new b(); a instanceof Foo b instanceof a b instanceof Foo;//implementao indiretamente
Concatenao de Strings
O operador de + pode concatenar String e somar int, porm depende do valor a sua esquerda ou nvel de precedncia.