Sun
ser de Bo
um lso
SCJ
P
CERTIFIED
Java Programmer
Guia do Exame
FOCANDO
NO
EXAME
Sumário XVII
Sumário
Capítulo 1
Fundamentos – declaração de níveis do pacote e acesso. ............. 1
Capítulo 2
Herança, polimorfismo, retorno covariantes ................................ 21
Capítulo 3
Atributos ......................................................................................... 37
Wrapper ...................................................................................................... 46
Quando usar? ........................................................................................ 46
Wrappers no Java 5/superior ...................................................................... 46
Diferenciar um Wrapper de Tipos primitivos .............................................. 47
Capítulo 4
Operadores .................................................................................... 57
Capítulo 5
Tratamentos de exceções ............................................................... 69
Capítulo 6
API .................................................................................................. 83
Capítulo 7
Expressões regulares - REGEX ..................................................... 105
Capítulo 8
Genéricos e Conjuntos ................................................................. 111
Capítulo 9
Classes Internas ........................................................................... 187
Capítulo 10
Threads ........................................................................................ 203
Capítulo 11
Desenvolvimento ......................................................................... 227
Modificadores de Acesso
public, protected, default e private
package cap1.x;
class Casa {
}
package cap1.y;
import cap1.x.Casa;
public class Zona {
//esse código não 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;
package cap1.y;
import cap1.x.Jarro;
class Jar {
/* observe que minha class Jarro é public, então posso
importá-la para outros pacotes*/
public static void main(String[] args) { }
}
Capítulo 1 - Fundamentos - declaração de níveis do pacote e acesso 3
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)
package cap1.x;
}
class filho extends Pai{}
/* isso não compila; a class Pai não pode ter filho
* questão de genética */
package cap1.x;
class Papi {
final void setNum(){System.out.println(“final”);}
}
/* aqui estou subscrevendo meu método final, isso não é
válido para um código que não 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{
package cap1.x;
}}
package cap1.x;
public abstract class Jogo {
abstract void nome();
}
abstract class start extends Jogo{
/* a class abstract não tem obrigação de implementar
* os métodos da superclass abstract */}
Não compila
package cap1.x;
public abstract class Notcomp {
void setName(); // não compila, o modificador abstract
foi omitido
public static void main(String[] args) {
/* não compila; a class concreta não implementa o
método abstract da class abstract */
Notcomp nt = new Notcomp();
System.out.println(“zomm”); }}
package cap1.x;
package cap1.x;
package cap1.x;
package cap1.x;
abstract class ProFin {
/* também não compila
*
*/
final abstract void setnn();
public static void main(String[] args) {
}}
As interfaces:
mais implementar.
Uma interface não pode implementar uma class.
package cap1.y;
package cap1.y;
interface Corp {
void seta(){}
/* não posso ter métodos com chaves em uma interface,
* pois os métodos são implicitamente abstract aqui
*/}
10 Sun Certified Java Programmer – Guia do Exame SCJP
Modificador de Acesso
Este conceito é tão 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.
package cap1.f;
package cap1.g;
import cap1.f.Fog;
class Ge{
/* válida a class Fog public e o método cor também
* só não posso chamar a variável private aqui
*/
public static void main(String arg){
new Fog().cor();
}}
Capítulo 1 - Fundamentos - declaração de níveis do pacote e acesso 11
package cap1.g;
class Refrig {
public void marca(){}
}
package cap1.f;
import cap1.g.Refrig;
package cap1.f;
package cap1.f;
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 método 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 não compila; não posso usar o nome da superclasse
para chamar o método protected */
public static void main(String[] args) {
new Zer().zar();
Capítulo 1 - Fundamentos - declaração de níveis do pacote e acesso 13
}
}
Exception in thread “main” java.lang.Error: Unresolved
compilation problem:
The method zar() from the type Zer is not visible
Variável Local
Uma variável local só pode ser marcada com o modificador FI-
NAL; qualquer outro o código nem compila.
class Foo {
void f(){
/* não compila; modificador inválido para esse
tipo de variavel*/
private int z=0;
}}
class Fac {
void setN(){
/* modificador válido para a variável local
* o código compila tranquilamente */
final int a=0;
}
}
Regras:
class Fac {
void setN(){
int z;
System.out.println(10);
/* compila normalmente; não usei a variável local,
apenas declarei */
}}
class Foo {
void f(){
/* não compila; tentei usar uma variável local sem
valor; elas não recebem um valor padrão como as variá-
veis de instância */
int num;
System.out.println(num);
}}
Construtores
Refere-se à construção de objetos da classe. Posso usar qualquer
um dos modificadores: public, protected, default e private.
public Ball(int a) { }
}
/* a class filha é obrigada a chamar o construtor da
superclass, senão o código nem compila */
class Player extends Ball{
Player(){
super(2);
}}
}
class Pee extends Peek{
Pee(){}
/* chamada implícita para super()*/
}
}
class Al extends Nota{
Al(){}
/* o código não compila; a superclass não tem nenhum
construtor sem argumento.
* então sou obrigado a chamar o construtor criado expli-
citamente */
}}
/* o código não compila a subclass que está chamando o
construtor da superclass, que é private e ela nem deve-
ria saber que ele existe*/
class Cont extends ConstPriv{
Cont(){}
}
Modificador Static
Permite acessar um membro sem precisar criar uma instância da
classe(new class()).
Enum
É um tipo de class especial, o objetivo aqui é criar constantes.
Pode ser declarado fora de uma class ou dentro de uma class.
Modificadores válidos:
Public e default
Inválidos:
final
abstract
static
private
protected
class Brasil {
/* enum fora da class é válido */
public static void main(String[] args) {
Cidade c = Cidade.CURITIBA;
System.out.println(c);
}
}
20 Sun Certified Java Programmer – Guia do Exame SCJP
package cap1.f;
interface Som{}
/* Vectra é um carro que implementa um Som implements -
É-UM. */
Válidos:
Inválidos:
class Mundo {}
public class Terra extends Mundo{}
public class Galatix {
void chama(Mundo m){
System.out.println(“mundo chamando”);
}
//método 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);
}}
EXIBI:
mundo chamando
terra chamando
mundo chamando
Regras do sobrecarregado:
Regras do subscrito:
Inválido:
interface roda{}
/* válida a relação entre as interfaces */
interface modelo extends roda{}
30 Sun Certified Java Programmer – Guia do Exame SCJP
interface roupa{}
/* não compila; uma class não aplica extends em nada que
seja uma class e roupa é uma interface */
class fab extends roupa{}
}
class Bar extends Foo{
/* String é-um Object; o código compila
tranquilamente */
String go(){return null;}
}
Capítulo 2 - Herança, polimorfismo, retorno covariantes 31
class Numbr {
Number go(){return null;}
}
class numb extends Numbr{
Integer go(){return null;}
/* o código compila normalmente; objeto Integer é-
um Number */
}
public class Wv {
static void num(){System.out.println(“static”);}
void num(){System.out.println(“non-stati”);}
public static void main(String[] args) {}
/* o código não compila dois métodos com tipos de
argumentos iguais, com o mesmo nome e retorno também.
O fato de ser static não muda a regra Static não é um
tipo de retorno e sim um modificador */
}
public class Kv {
static int num;
public static void main(String[] args) {
System.out.println(num);
}
/* variável static; posso chamar diretamente e não
precisa de uma instância de class */
}
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 indesejável */
class B{
public int num=50;
void met(){
num = new A().r;
}}
class Relatorio{}
class Bd_connectar{}
Atributos
Variável de Instância
- Os seus valores são iniciados automati-
camente e são declaradas fora de qualquer método ou bloco.
38 Sun Certified Java Programmer – Guia do Exame SCJP
resultado:
null
0
I@18d107f
boolean b = true;
if(b = false); // ele recebe false não compara
Enums
Enum: é um tipo especial de class.
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 Sun Certified Java Programmer – Guia do Exame SCJP
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);
}
}
Não 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));
}
}
//não 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);
Capítulo 4 - Operadores 61
Pu p = Pu.FUTEBOL;
Pu p2 = Pu.FUTEBOL;
System.out.println(p.equals(p2));
}
}
//não compila olha o modificar de acesso de enum
Instanceof
Este operador é usado apenas para variáveis de referencia de obje-
to 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);
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;//implementação indiretamente
class Cat{}
class Dog{
public static void main(String[] args){
Dog d = new Dog();// novo objeto de dog
System.out.println(d instanceof Cat);
}
}
/* aqui dar pau ja q d nem conhece Cat*/
/* para ser verdadeiro teria que usar É-UM.*/
Concatenação de Strings
O operador de + pode concatenar String e somar int, porém de-
pende do valor a sua esquerda ou nível de precedência.