Várias dúvidas que tive ao estudar para SCJP / OCJP 6

 

Vamos às dúvidas:

Class abstrata tem construtor?

R: Sim!

(livro SCJP pag 5)

abstract class A{

A(int i){System.out.println(i);}

}

class B extends A{

B(){super(1);}

}

Variáveis declaradas em uma interface (constantes) quando implementadas e se a classe que a implementa também declara uma variável de instância com o mesmo nome qual será o resultado?

(livro SCJP pag 9)

public class Teste implements MyInterface {

public static final int valor = 8;

static public void main(String [] args){

System.out.println(valor);

}

}

interface MyInterface {

int valor = 7;

}

Output:

8

public class Teste {

public static void main(String[] args){

Cavalheiro c = new Homem();

System.out.println(c.i);

System.out.println(c);

}

}

interface Cavalheiro {

int i = 7;

}

class Homem implements Cavalheiro {

public static final int i = 8;

public String toString(){

return new Integer(i).toString();

}

}

Output:

7

8

Classe com construtor privado pode ser extendida?

R: Sim, apenas por uma classe interna (inner class)

(livro SCJP pag 17)

class Pai {

private Pai(){}

}

class Filha extends Pai{}

javac:

Teste.java:14: Pai() has private access in Pai

class Filha extends Pai{}

^

1 error

—————————————————————–

public abstract class Clown {

private Clown(){};

public abstract void toLaugh();

// List of Clown Types

static private class Bozo extends Clown {

@Override

public void toLaugh() {}

}

// Factory Methods for Clown Types

public static Clown getClownFactoryMethod(String type) {

if (type.equals(“BOZO”)) return new Bozo();

return null;

}

}

—————————————————————–

abstract class Clown{

private Clown(){}

public abstract void toLaugh();

public static void main(String[] args){

Clown c = new Clown(){

public void toLaugh(){

System.out.println(“LOL”);

}

};

c.toLaugh();

}

}

Veja discussão no forum: http://www.coderanch.com/t/518233/java-programmer-SCJP/certification/Abstract-class-private-constructor-why#2346328

É possivel utilizar junto ‘protected’ e ‘abstract’?

R. Sim, pode ser acessado pela herança.

(livro SCJP pag 24)

abstract class Palhaco {

protected abstract void fazerRir();

}

class Bozo extends Palhaco {

protected void fazerRir(){System.out.println(“hahahah”);}

}

É possível uma classe abstrata declarar um construtor privado?

R. Sim, isso compila. (veja logo acima item 3:

(não é do livro)

abstract class Clown {

private Clown(){}

public abstract void toLaugh();

}

Os elementos de uma array são sempre inicializados pelo valor padrão, independente desta array ter sido declarada como local ou como de instância:

(livro SCJP pag 40)

public class Teste {

public static void main(String[] args){

int[] i = new int[3];

for(int n:i) System.out.print(n + ” “);

}

}

Output:

0 0 0

Inicializar uma array com um valor negativo compila?

(livro SCJP pag 42)

public class Teste {

public static void main(String[] args){

int[] i = new int[-3];

for(int n:i) System.out.println(n);

}

}

javac: Ok – compila

java Teste:

Exception in thread “main” java.lang.NegativeArraySizeException

at Teste.main(Teste.java:8)

É possível declarar: Animal[ ] a = new Zebra[3]; e utilizar, visto que Zebra extende de Animal?

(livro SCJP pag 43)

Exemplo 1 – armazenando valores em arrays:

class Animal{}

class Zebra extends Animal{}

public class Teste {

public static void main(String[] args){

Animal[] a = new Zebra[4];

a[0] = new Zebra(); // ok, estamos inserindo uma Zebra em um array de Zebra referenciada por uma array de Animal

a[1] = new Animal(); // não é possível, pois não se pode inserir um Animal em uma array de Zebras

}

}

javac: ok

java

Exception in thread “main” java.lang.ArrayStoreException: Animal

at Teste.main(Teste.java:11)

Exemplo 2 – passando arrays em métodos:

class Teste {

public static void main(String[] args){

A[] a1 = new A[3];

A[] a2 = new B[3];

B[] b1 = new B[3];

doStuff(a1);

doStuff(a2);

doStuff(b1);

}

static void doStuff(A[] a){System.out.println(“ok”);}

}

class A{}

class B extends A{}

Output:

ok

ok

ok

Erro equivalente ao exemplo 1:

public class Teste {

public static void main(String[] args){

Animal a = new Animal();

Zebra z = (Zebra)a; // erro em tempo de execução

}

}

javac: ok

java:

Exception in thread “main” java.lang.ClassCastException: Animal cannot be cast to Zebra

at Teste.main(Teste.java:8)

Posso colocar um int dentro de um long?

(livro SCJP pag 48)

public class Teste {

public static void main(String[] args){

int i = 10;

long l = i;

float f = l;

double d = f;

System.out.printf(“int = %1$d, long = %2$d, float = %3$f, double = %4$f”,i,l,f,d);

}

}

Output:

int = 10, long = 10, float = 10,000000, double = 10,000000

Qual o resultado da declaração: Boolean b = new Boolean(“TruE”); ?

(livro SCJP pag 55)

R: true

Comparando-se ‘int i = 4’ com ‘double d = 4.0’ o resultado é true?

  1. Sim

    (livro SCJP pag 58)

    int a = 4;

    double d = 4.0;

    System.out.println(a==d);

    Output:

    true

Pode-se usar ‘= =’ ou equals para comparação de enuns? O resultado é o mesmo?

(livro SCJP pag 59)

public class Teste {

public enum Cores{AZUL, VERMELHO};

static public void main(String[] args) {

Cores c1 = Cores.AZUL;

Cores c2 = Cores.VERMELHO;

System.out.println(c1 == c2);

System.out.println(c1.equals(c2));

Cores c3 = Cores.VERMELHO;

System.out.println(c2 == c3);

System.out.println(c2.equals(c3));

}

}

Output:

false

false

true

true

Variáveis de instancia e final recebem valor padrão?

(livro SCJP pag 64)

R: Toda variável de instância e estática se for FINAL deverá receber um valor inicial, caso contrário a aplicação não compila.

public class Teste {

// sendo ou não estática

public (static)
final int i;

static public void main(String[] args) {

}

}

javac:

Teste.java:1: variable i might not have been initialized

public class Teste {

^

1 error

———————————————————————

// Se for só final poderá receber até o término do construtor.

class Teste {

final int i;

Teste(){i = 11;}

public static void main(String[] args){

}

}

javac: ok

———————————————————————

// Se for estática e final deverá receber um valor no seu carregamento com blocos estáticos.

class Teste {

static final int i;

static{i = 11;}

public static void main(String[] args){

}

}

javac: ok

———————————————————————

public class Teste {

public int i;

static public void main(String[] args) {

System.out.println(new Teste().i);

}

}

Output:

0

———————————————————————

public class Teste {

static public void main(String[] args) {

final int i;

}

}

javac:

ok

Dada a declaração abaixo quem será final?

final int i = 7, n = 8, g = i + n;

Quem é FINAL? Todas?

R: Sim, se tentarmos mudar o valor de alguma delas dá erro de compilação:

public class Teste {

static public void main(String[] args) {

final int i = 7, n = 8, g = i + n;

i = 2;

n = 5;

g = 16;

}

}

javac:

Teste.java:4: cannot assign a value to final variable i

i = 2;

^

Teste.java:5: cannot assign a value to final variable n

n = 5;

^

Teste.java:6: cannot assign a value to final variable g

g = 16;

^

3 errors

Pegadinha do exame

(livro SCJP pag 75)

public class Teste {

static public void main(String[] args) {

if (false && true | true) System.out.println(true); // não imprime nada

if ((false && true) | true) System.out.println(true + “2”); // imprime true2

}

}

Onde a instrução switch pode usar wrapper?

(livro SCJP pag 77)

Os códigos em azul representam o uso correto (aceito) e os códigos em vermelho representam os usos incorretos (não aceitos).

public class Teste {

static public void main(String[] args) {

// declarações que funcionam:

byte i = 2 ou Byte i = 2;

short i = 2 ou Short i = 2;

int i = 2 ou Integer i = 2;

char i = 2 ou Character i = 2;

// declarações que não funcionam

// long, double e float (e seus respectivos wrappers)

// primitivos inteiros ou wrappers

switch(i) {

case 2: {

System.out.println(i);

}

default: {

System.out.println(“default”);

}

}

}

}

Output:

2

default (fall through)

———————————————————————

public class Teste {

static public void main(String[] args) {

// declarações que funcionam (tem que ser constante em tempo de compilação):

final int i = 2;

final char i = 2;

final short i = 2;

final byte i = 2;

// declarações que não funcionam:

int i = 2;

Integer i = 2;

final Byte i = 2;

final Short i = 2;

final Integer i = 2;

switch(2) {

// final primitivos inteiros

case i: {

System.out.println(i);

}

default: {

System.out.println(“default”);

}

}

}

}

javac

Teste.java:5: constant expression required

case i: {

^

1 error

Uma interface pode declarar uma classe interna?

(não é do livro)

R.: Sim, toda classe interna declarada em uma interface será por padrão estática. Haja visto a classe Entry declarada dentro da interface Map do pacote ‘java.util’ (olhe exemplo Wz 30/11/2010 – Q16)

Olhe exemplo desenvolvido por mim:

public class Teste {

public static void main(String[] args){

MyCalc mc = new MyCalc();

Calc.Result result = mc.doCalc(51);

System.out.println(result);

}

}

Output:

51

———————————————————————

interface Calc{

// classe declarada dentro de uma interface é estática por padrão.

class Result {

private int i;

public Result(int i){

this.i = i;

}

public String toString(){

return new Integer(i).toString();

}

}

public abstract Result doCalc(int i);

}

class MyCalc implements Calc {

public Result doCalc(int i){

return new Result(i);

}

}

StringBuilder e StringBuffer

(livro SCJP pag 85 a 88)

public class Teste {

public static void main(String[] args){

StringBuilder sb = new StringBuilder(1234);

System.out.println(sb);

}

}

Output

{nada}

———————————————————————

public class Teste {

public static void main(String[] args){

StringBuilder sb = new StringBuilder(“1234”);

System.out.println(sb);

}

}

Output

1234

———————————————————————

public class Teste {

public static void main(String[] args){

StringBuilder sb = new StringBuilder(1234);

sb.insert(2, “abc”);

System.out.println(sb);

}

}

javac ok

Output:

Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range

———————————————————————

public class Teste {

public static void main(String[] args){

StringBuilder sb = new StringBuilder(“1234”);

sb.insert(2, “abc”);

System.out.println(sb);

}

}

Output:

12abc34

Serialização – Pode-se serializar primitivos?

(livro SCJP pag 94)

R. Sim, usado o recurso de autoboxing

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

public class Teste {

public static void main(String[] args){

try {

int i = 7;

// persistindo no disco

FileOutputStream fos = new FileOutputStream(“numb.obj”); // throws FileNotFoundException

ObjectOutputStream oos = new ObjectOutputStream(fos); // throws IOException

oos.writeObject(i);
// throws IOException

oos.close();

i = 20;

System.out.println(i);

// recuperando do disco

FileInputStream fis = new FileInputStream(“numb.obj”);

ObjectInputStream ois = new ObjectInputStream(fis);

i = (Integer)ois.readObject();

ois.close();

System.out.println(i);

} catch (ClassNotFoundException e) {

// devida a tentativa de conversão para (Integer)

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e){

e.printStackTrace();

}

}

}

Output:

20

7

NumberFormat

(livro SCJP pag 102)

import java.text.NumberFormat;

import java.util.Locale;

public class Teste {

public static void main(String[] args){

NumberFormat[] nfs = new NumberFormat[4];

nfs[0] = NumberFormat.getCurrencyInstance(new Locale(“es”, “ES”));

nfs[1] = NumberFormat.getCurrencyInstance();

nfs[2] = NumberFormat.getInstance(new Locale(“es”, “ES”));

nfs[3] = NumberFormat.getInstance();

float f = 10.0F;

for(NumberFormat nf: nfs) System.out.println(nf.format(f));

}

}

Output:

10,00 Ç

R$ 10,00

10

10

printf(“%b”, “sss”);

(livro SCJP pag 109)

public class Teste {

public static void main(String[] args){

System.out.printf(“%b”,”string”);

System.out.printf(“%b”,456);

System.out.printf(“%b”,false);

System.out.printf(“%b”,”false”);

}

}

Truetruefalsetrue

Serialização – static pode com transient? (serialização)

O fato da propriedade A.nome ser estática e transiente não significa que ela é serializada. A propriedade pertence a classe e não a instância.

Repare também nas exceções que são disparadas pelo uso dos métodos.

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.io.File;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

public class Teste {

public static void main(String[] args){

File f = new File(“objeto.obj”);

A a = new A();

a.nome = “juliane abs”;

a.idade = 32;

System.out.println(a);

FileOutputStream fos = null;

ObjectOutputStream oos = null;

FileInputStream fis = null;

ObjectInputStream ois = null;

// escreve para o arquivo

try {

fos = new FileOutputStream(f);

} catch (FileNotFoundException e){}

try {

oos = new ObjectOutputStream(fos);

oos.writeObject(a);

} catch (IOException e){}

// le do arquivo

A a2 = null;

try {

fis = new FileInputStream(f);

} catch (FileNotFoundException e){}

try {

ois = new ObjectInputStream(fis);

try {

a2 = (A)ois.readObject();

} catch (ClassNotFoundException e){}

} catch (IOException e) {}

System.out.println(a2);

}

}

class A implements Serializable{

public static transient String nome = “pedro abs”;

public int idade = 34;

public String toString(){

return nome + ” ” + this.idade;

}

}

Output:

juliane abs 32

juliane abs 32

java.util.Scanner para ler do console:

(livro SCJP pag 127)

import java.util.Scanner;

public class Teste {

public static void main(String[] args){

Scanner sc = new Scanner(System.in);

System.out.println(“Qual e a sua idade?”);

System.out.println(“Voce respondeu: ” + sc.nextInt());

System.out.println(“Qual o nome da sua mae?”);

System.out.println(“Voce respondeu: ” + sc.next());

}

}

Output:

Qual e a sua idade? {pausa}

33 {escrevi}

Voce respondeu: 33 {resposta do computador}

Qual o nome da sua mae? {pausa}

lucia {escrevi}

Voce respondeu: lucia {resposta do computador}

mudando o hashcode após ter inserido o objeto em uma HashMap

(livro SCJP pag 129)

import java.util.Map;

import java.util.HashMap;

public class Teste {

public static void main(String[] args){

Map<Pessoa, String> map = new HashMap<Pessoa, String>();

Pessoa p1 = new Pessoa(“pedro”);

map.put(p1,”pedro”);

System.out.println(map);

p1.nome = “mafalda”; // altera o tamanho do nome altera o hashcode usado pela HashMap

System.out.println(map.get(p1));

System.out.println(map);

}

}

Output:

{PESSOA:pedro=pedro}

null

{PESSOA:mafalda=pedro}

class Pessoa {

public String nome;

Pessoa(String nome){

this.nome = nome;

}

public boolean equals(Object p){

return (p instanceof Pessoa && ((Pessoa)p).nome.equals(this.nome));

}

public int hashCode(){

return this.nome.length();

}

public String toString(){return “PESSOA:”+this.nome;}

}

PriorityQueue tem que ser sempre ordenada ou classificada. Isso não ocorre com LinkedList.

(livro SCJP pag 130)

O objeto inserido na PriorityQueue tem que implementar Comparable

import java.util.Queue;

import java.util.PriorityQueue;

public class Teste {

public static void main(String[] args){

Queue q = new PriorityQueue();

q.offer(new Pessoa(“pedro”));

q.offer(new Pessoa(“henrique”));

q.offer(new Pessoa(“lorena”));

q.offer(new Pessoa(“juliane”));

while (q.size() > 0) System.out.println(q.poll());

}

}

class Pessoa implements Comparable<Pessoa>{

public String nome;

Pessoa(String nome){

this.nome = nome;

}

public int compareTo(Pessoa p){

return this.nome.compareTo(p.nome);

}

public String toString(){return this.nome;}

}

Já com a LinkedList e interface Queue podemos implementar FIFO sem se preocupar se o item é ordenavel ou classificavel.

import java.util.Queue;

import java.util.LinkedList;

public class Teste {

public static void main(String[] args){

Queue<Pessoa> qu = new LinkedList<Pessoa>();

// first in

qu.add(new Pessoa(“pedro”));

qu.add(new Pessoa(“juliane”));

qu.add(new Pessoa(“kike”));

qu.add(new Pessoa(“lolo”));

// first out

System.out.println(qu.poll()); // pedro

System.out.println(qu.poll()); // juliane

}

}

class Pessoa {

String nome;

Pessoa(String nome){

this.nome = nome;

}

public String toString(){return this.nome;}

}

Arrays – Arrays.fill({array a ser preenchida}, {valor})

(livro SCJP pag 141)

import java.util.Arrays;

public class Teste {

public static void main(String[] args){

int[] intarr = new int[5];

Arrays.fill(intarr,7);

String[] strarr = new String[5];

Arrays.fill(strarr,”pedro”);

A[] aarr = new A[5];

Arrays.fill(aarr,new A());

for(int i:intarr)System.out.print(i + ” “);

System.out.println();

for(String s:strarr)System.out.print(s + ” “);

System.out.println();

for(A a:aarr)System.out.print(a + ” “);

}

}

class A {}

Output:

7 7 7 7 7

pedro pedro pedro pedro pedro

A@1a758cb A@1a758cb A@1a758cb A@1a758cb A@1a758cb

Arrays – System.arraycopy

(livro SCJP pag 141)

public class Teste {

public static void main(String[] args){

int[] intarr = {13,20,15,10};

// como toda variável local a array precisa ser inicializada

int[] copy = new int[intarr.length];

System.arraycopy(intarr,0,copy,0,intarr.length);

for(int i:copy)System.out.print(i + ” “);

}

}

Output:

13 20 15 10

Arrays – Arrays.equals

(livro SCJP pag 142)

TESTANDO COM PRIMITIVOS

import java.util.Arrays;

public class Teste {

public static void main(String[] args){

int[] intarr = {13,20,15,10};

int[] copy = new int[intarr.length];

System.arraycopy(intarr,0,copy,0,intarr.length);

int[] other = {20,13,15,10};

boolean b1 = Arrays.equals(intarr,copy);

boolean b2 = Arrays.equals(intarr,other);

System.out.format(“intarr == copy = %1s, intarr == other = %2s”,b1,b2);

}

}

Output:

intarr == copy = true, intarr == other = false

TESTANDO COM REFERÊNCIA

import java.util.Arrays;

public class Teste {

public static void main(String[] args){

Pessoa[] pessoa1 = {new Pessoa(“pedro”),new Pessoa(“juliane”),

new Pessoa(“henrique”), new Pessoa(“lorena”)};

Pessoa[] copy = new Pessoa[pessoa1.length];

System.arraycopy(pessoa1,0,copy,0,pessoa1.length);

Pessoa[] pessoa2 = {new Pessoa(“peDro”),new Pessoa(“juliane”),

new Pessoa(“henrique”), new Pessoa(“lorena”)};

boolean b1 = Arrays.equals(pessoa1, copy);

boolean b2 = Arrays.equals(pessoa1, pessoa2);

System.out.format(“pessoa1 == copy = %1s, pessoa1 == pessoa2 = %2s”,b1,b2);

}

}

class Pessoa {

public String nome;

Pessoa(String nome){

this.nome = nome;

}

public boolean equals(Object p){

return (p instanceof Pessoa && ((Pessoa)p).nome.equals(this.nome));

}

public int hashCode(){

return this.nome.length();

}

public String toString(){return “PESSOA:”+this.nome;}

}

Output:

pessoa1 == copy = true, pessoa1 == pessoa2 = false

Preenchendo uma HashSet com os dados de uma Collection

(livro SCJP pag 152)

import java.util.Set;

import java.util.HashSet;

import java.util.Collection;

import java.util.LinkedList;

public class Teste {

public static void main(String[] args){

Collection<String> col = new LinkedList<String>();

col.add(“pedro”);

col.add(“juliane”);

col.add(“kike”);

col.add(“lolo”);

Set<String> set = new HashSet<String>(col);

System.out.println(set);

}

}

Output:

[pedro, lolo, kike, juliane]

List<String> lst … lst.toArray(new String[0])

(livro SCJP pag 159)

import java.util.List;

import java.util.ArrayList;

import java.util.Arrays;

public class Teste {

public static void main(String[] args){

List<String> lst = new ArrayList<String>();

lst.add(“pedro”);

lst.add(“juliane”);

lst.add(“kike”);

lst.add(“lolo”);

String[] str = lst.toArray(new String[0]); // se new String[1] o resultado é o mesmo.

System.out.println(Arrays.toString(str));

}

}

Output:

[pedro, juliane, kike, lolo]

———————————————————————

import java.util.List;

import java.util.ArrayList;

import java.util.Arrays;

public class Teste {

public static void main(String[] args){

List<String> lst = new ArrayList<String>();

lst.add(“pedro”);

lst.add(“juliane”);

lst.add(“kike”);

lst.add(“lolo”);

String[] str = new String[lst.size()]; // o que está em cinza é dispensável

str = lst.toArray(new String[100]);

System.out.println(Arrays.toString(str));

}

}

Output:

[pedro, juliane, kike, lolo, null, null, … , null]

Generics

(livro SCJP pag 175)

veja também: Questão 8

import java.util.List;

import java.util.ArrayList;

public class Teste {

public static void main(String[] args){

List<Filha> lst1 = new ArrayList<Filha>();

lst1.add(new Filha());

List lst = lst1; // misturando código genérico com não genérico

cham(lst); // passando uma lista não genérica para um parâmetro genérico

System.out.println(lst1);

}

static void cham(List<Pai> lst){

lst.add(new Pai());

}

}

class Pai{}

class Filha extends Pai{}

javac:

Note: Teste.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

Output:

[Filha@173a10f, Pai@530daa]

———————————————————————

import java.util.List;

import java.util.ArrayList;

public class Teste {

public static void main(String[] args){

List<Pai> lst1 = new ArrayList<Pai>();

lst1.add(new Pai());

lst1.add(new Filha());

List<? super Filha> lst2 = lst1;

lst2.add(new Filha());

// lst2.add(new Pai()); // não compila

System.out.println(lst2);

}

}

class Pai{}

class Filha extends Pai{}

Varargs significa 0 ou mais argumentos

public class Teste {

public static void main(String[] args){

meth();

}

public static void meth(int … s){

System.out.println(“meth”);

}

}

Output:

meth

Metodo estático pode ser Final? Quais as consequências?

public class Teste {

public static void main(String[] args){

doStuff();

}

public final static void doStuff(){System.out.println(“teste”);}

}

class Teste2 extends Teste{

public static void doStuff(){}

}

javac:

Teste.java:9: doStuff() in Teste2 cannot override doStuff() in Teste

public static void doStuff(){}

^

overridden method is static,final

Se tirar o final o output será: teste

Uma classe abstrata pode extender uma classe comum?

(R. Sim)

class A {}

abstract class B extends A{}

javac: Ok

Outro exemplo mais completo:

public class Teste {

public static void main(String[] args){

A a1 = new A();

a1.doStuff();

A a2 = new C();

a2.doStuff();

B b = new C();

b.doStuff();

}

}

class A {

void doStuff(){System.out.println(“A”);}

}

abstract class B extends A {

abstract void doStuff();

}

class C extends B {

void doStuff(){System.out.println(“C”);}

}

Output:

A

C

C

O que significa int[] i[];

import java.util.Arrays;

class Teste{

public static void main(String[] args){

int[] i[]; // declaração de array de arrays.

i = new int[4][3];

System.out.println(Arrays.toString(i));

}

}

Output:

[[I@3e25a5, [I@19821f, [I@addbf1, [I@42e816]

Qual é a restrição em tentarmos “sobrescrever” um método privado na superclasse que seja final?

R: nenhuma, o método não é acessado via herança. (veja a resposta do livro pag 210)

class Teste {

public static void main(String[] args){

B b = new B();

b.doStuff();

}

}

class A{

private final void doStuff(){System.out.println(“A”);}

}

class B extends A{

public void doStuff(){System.out.println(“B”);}

}

Output:

B

Membros estaticos são herdados?

  1. Sim

    class Teste {

    public static void main(String[] args){

    System.out.println(B.nome);

    }

    }

    class A{

    static String nome = “pedro”;

    }

    class B extends A{}

    Output:

    Pedro

Inner Class – pode declará-la dentro de um método?

class Teste {

public static void main(String[] args){

go();

}

static void go(){

class Inner {

public String toString(){

return “Inner”;

}

}

Object o = new Inner();

System.out.println(o);

abstract class Inner2{

public abstract String toString();

}

Object o2 = new Inner2(){

public String toString(){

return “Inner2”;

}

};

System.out.println(o2);

}

}

Output:

Inner

Inner2

Inner Class – pode se criar uma classe anonima sendo que ao instanciá-la passamos parâmetros em seu construtor?

class Teste {

public static void main(String[] args){

Teste.Inner in = new Teste().new Inner(34){

void doSomething(){System.out.println(“anonymous”);}

};

in.doSomething();

}

class Inner {

Inner(Integer i){System.out.println(i);}

void doSomething(){System.out.println(“Inner”);}

}

}

Output:

34

anonymous

Inner Class – maneira de se construir:

class Teste {

public static void main(String[] args){

Teste t = new Teste();

Teste.Inner i = t.new Inner();

t.Inner i = t.new Inner(); // não complila

}

class Inner {}

}

Inner Class – maneira de chamar a outer class

Interessante destacar a maneira como se chama a Outer Class bem como a maneira como foi chamada o membro “i” da Outer class conforme destacado em amarelo.

class Teste {

public static void main(String[] args){

Outer o = new Outer();

System.out.println(o);

Outer.Inner i = o.new Inner();

System.out.println(i);

}

}

class Outer {

int i = 1;

class Inner{

int i = 2;

public String toString(){

return new Integer(this.i).toString() + ” ” + new Integer(Outer.this.i).toString();

}

}

public String toString(){

// veja que interessante a maneira como foi chamado o membro ‘i’ da classe Outer

return new Integer(this.i).toString() + ” ” + new Integer(Outer.this.i).toString();

}

}

Output:

1 1

2 1

for loop

Exemplo 1:

public class Teste {

public static void main(String[] args){

for(int i = 0; i < 10; i++) System.out.println(i);

}

}

Output:

0 1 2 3 4 5 6 7 8 9

Exemplo 2:

public class Teste {

public static void main(String[] args){

for(int i = 0; ++i < 10;) System.out.print(i + ” “);

}

}

Output:

1 2 3 4 5 6 7 8 9

primeiro soma +1 depois valida se i<10 e se true, entra no sout.

Exemplo 3:

public class Teste {

public static void main(String[] args){

for(int i = 0; i++ < 10;) System.out.print(i + ” “);

}

}

Output:

1 2 3 4 5 6 7 8 9 10

primeiro valida se i<10 depois soma +1 e ai sim, entra no sout.


Esta entrada foi publicada em Java com as etiquetas , , , , , , . ligação permanente.

Uma resposta a Várias dúvidas que tive ao estudar para SCJP / OCJP 6

  1. Pingback: certificado SCJP / OCJP | Pedro Abs

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s