Livro SCJP - Dúvida em Questões

Pessoal, não sei se esse tipo de tópico deve ser criado nesse subfórum. Caso seja outro, por favor movam para o correto.

Estou estudando para a Certificação OCJP6 pelo livro Certificação Sun para Programador Java 6, SCJP da Kathy Sierra… Estou ainda no capítulo 2, e fiquei com algumas dúvidas em algumas questões, que não consegui tirá-las pela explicação do livro… Algumas me parecem obviamente erros de digitação, mas gostaria de confirmar com vocês…

[quote]CAPITULO 2 - QUESTÃO 9

Dado o código a seguir:

public class Redwood extends Tree { public static void main(String[] args) { new Redwood().go(); } void go() { go2 (new Tree() , new Redwood()); go2((Redwood) new Tree() , new Redwood()); } void go2 (Tree t1, Redwood r1) { Redwood r2 = (redwood)t1; Tree t2 = (Tree)r1; } } class Tree{}

Qual é o resultado? (Marque todas as alternativas corretas)

A. Uma exceção é lançada no momento da execução
B. O código compila e roda, sem mostrar qualquer resultado
C. Ocorre falha na compilação com um erro na linha 6
D. Ocorre falha na compilação com um erro na linha 7
E. Ocorre falha na compilação com um erro na linha 10
F. Ocorre falha na compilação com um erro na linha 11[/quote]

Respondi a E, pois o cast está sendo feito com o nome da classe todo em minúsculo, e o Java é Case Sensitive:

Redwood r2 = ([color=red]redwood[/color])t1;

Porém o livro diz que a resposta certa é A. Neste caso, o cast pode ser feito com o nome da classe em letras minúsculas ou foi erro de digitação?

[quote]CAPITULO 2 - QUESTÃO 10

Dado o código a seguir:

[code]public class Tenor extends Singer {
public static String sing() { return “fa”; }
public static void main(String[] args){
Tenor t = new Tenor();
Singer s = new Tenor();
System.ou.println(t.sign() + " " + s.sing());
}
}

class Singer { public static String sing() { return “la”; }}[/code]

Qual é o resultado?

A. fa fa
B. fa la
C. la la
D. Ocorre falha na compilação
E. Uma exceção é lançada em tempo de execução[/quote]

Nesta pergunta, respondi a opção D, pois a sintaxe do System.out.println na linha 6 está incorreta, além do método sign() não existir:

System.[color=red]ou[/color].println(t.[color=red]sign()[/color] + " " + s.sing());

O livro diz que a resposta certa é a B. Neste caso, foi erro de digitação, não? Minha resposta pode ser considerada como válida?

E agora a que me deixou mais intrigado…

[quote]CAPITULO 2 - QUESTÃO 15

Dado o código a seguir:

class A{} class B extends A{} public class ComingThru{ static String s = "-"; public static void main(String[] args){ A[] aa = new A[2]; B[] ba = new B[2]; sifter(aa); sifter(ba); sifter(7); System.out.println(s); } static void sifter(A[]... a2) { s += "1"; } static void sifter(B[]... b1) { s += "2"; } static void sifter(B[] b1) { s += "3"; } static void sifter(Object o) { s += "4"; } }

Qual é o resultado?

A. -124
B. -134
C. -424
D. -434
E. -444
F. Ocorre uma falha na compilação[/quote]

Eu respondi a F, por que a chamada do método sifter(7) na linha 10 envia um tipo primitivo (int) como argumento, mas não tem nenhum método que tem int como parâmetro, somente objetos. No livro, diz que a resposta correta é a D. Nesse caso, qual método é usando ao chamar sifter(7), e por quê? Ele é tratado como do tipo Object, mesmo sendo um tipo primitivo? Não entendi…

Quem puder me ajudar com essas dúvidas, ficarei muito agradecido!

e aí chetspop, beleza cara !!!, eu passei por isso tb, fica tranquilo…, uma dica não marque as respostas na livro, nem certas, nem erradas, assim qdo acabar o livro, refaça o teste…, vamos ás dúvidas…

Questão 09 - com certeza foi erro de digitação, este é um problema clássico de cast que vc verá nos testes, exame etc, …, o compilador aceita esse cast pois verifica a árvore de herança e deixa passar, porém em tempo de execução a JVM realmente “vê” que se trata de um objeto Tree…(o que vale para a JVM é o que é criado realmente, após o “new”).

Questão 10 - o método println está correto(erro de digitação rsrs) e o método sing() existe em ambas as classes esta é uma das pegadinhas que vc vai ver e muito durante os estudos, parece estar te testando com relação ao polimorfismo, porém o teste é sobre métodos estáticos.

Questão 15 - chatinha hein…, o Java tem recursos chamados de auto-boxing e auto-unboxing , são executados por debaixo do “pano”, antigamente cabia ao programador realizar esse trabalho. Esta técnica consiste em transformar tipos primitivos em objetos Wrapper e vice-versa (mais pra frente verá e muito). Na questão 15 o Java entende o parâmetro do método sifter(7) linha 10 como se fosse um objeto do tipo Integer, que no caso passa no teste “é um” com relação ao parâmetro Object (todos objetos passam).

Ok???, qualquer coisa posta de novo…(tô achando estranho tantos erros de digitação, fica sussa que no teste final não rola essas coisas…)

Olá amigo, vou tentar responder algumas questões…

  1. Realmente o livro tras algumas respostar corretas porém com erros de digitação (e não sintaxe da linguagem java, eu tb passei por isso ao resolver algumas questões dele).
    quando esses erros ocorrer analise o contexto do problema, esqueça os erros de digitação.

Respostas das questões.

questão 1.
Nâo me lembro.

questão 2.
Como eu disse antes, analisando o contexto do problema e ignorando os erros mencionados acima…
realmente a resposta correta é a letra B.
2.1 So lembrando que não é necessario utilizar um tipo de referencia para acessar um membro static.
Então a resposta correta é a letra B. Pois t chama o sing() de Tenor imprimindo ‘fa’, e em seguida chama o sing() de Singer, pois se não me engano um membro static não pode ser sobrescrito prevalecendo o método do tipo da variável de referencia s (no caso Singer).

questão 3. (muito boa)
Se me lembro bem, e concordando com o livro, a resposta correta é realmente a D.
Breve Lembrete: se não me engano o compilador escolherá primeiro em ordem crescente: mesmo tipo > apliação > autoboxing > var-args
3.1. ao executar sifter(aa) - ele não encontra o mesmo tipo, entao como um array é um objeto oque o compilador faz é ampliar para um Object concatenando com '-4’
sifter(ba) - ao executar essa o mesmo tipo é encontrado concatenando com '-43’
E finalmente executando sifter(7) o mesmo tipo nao é encontrado, em seguida não faz a ampliação, e sim ocorre o autoboxing para o tipo Integer que por sua vez não encontra um tipo semelhante, e sim amplia para um Object concatenando com ‘-434’.

Por favor pessoal, não exitem em me corrigir, pois estou enferrujado nesses tipos de questões. Se falei algo errado ja sabem…
Um abraço

Agora que estou em casa, consegui jogar os códigos no Eclipse e analisar… Realmente na primeira, o Cast não pode ser feito com letra minúscula… Ao mudar para letra maiúscula, ele dá erro em tempo de execução na linha 7, porque está tentando fazer o Cast de uma classe mais genérica (Tree) para uma classe mais específica (Redwood), e só o contrário é permitido…

A segunda é erro de digitação mesmo, se não fosse o erro, o conceito que o exercício quer passar eu entendi, de método estático que não é sobrescrito…

A terceira então eu não soube resolver porque ainda não foi falado nada sobre autoboxing nos dois primeiros capitulos no livro, então é estranho colocarem uma pergunta dessas, quem ta lendo do começo não vai saber fazer a não ser que já tenha visto isso em algum outro lugar… mas realmente, compilando, a saida é -434…

Muito obrigado por esclarecer essas dúvidas… Só fiquei meio atento nos erros de digitação, porque sintaxe tbm pode cair no teste né… como o teste é cheio dessas pegadinhas, se faltar um único ponto-e-virgula já da erro, então tô olhando o código com toda a atenção…

Valeu ae! Muito obrigado pelo esclarecimento :wink:

Olá pessoal, aproveitando que o tópico já esta aberto, gostaria uma ajuda sobre questões do livro SCJP.

Simulado Cap 1 - Questão 6

dado o código a seguir:

1. public class Eletronic implements Device
       {public void doIt() { }}
2.
3. abstract class Phone1 extends Eletronic { }
4.
5. abstract class Phone2 extends Eletronic 
       { public void doIt(int x) { }}
6.
7. class Phone3 extends Eletronic implements Device
       { public void doStuff() { }}
8.
9. interface Device { public void doIt(); }

Qual o resultado (Marque todas as corretas).

A. A compilação é bem-sucedida.
B. Ocorre falha na compilação com um erro na linha 1
C. Ocorre falha na compilação com um erro na linha 3
D. Ocorre falha na compilação com um erro na linha 5
E. Ocorre falha na compilação com um erro na linha 7
F. Ocorre falha na compilação com um erro na linha 9

eu marquei a letra E, mas o livro diz que a correta está a letra A.

a classe Phone3 extends Eletronic implements Device. a duvida é a seguinte. eu estendi uma classe e estou implementando uma interface. A classe q eu estou estendendo já fez a implementação da interface, com isso não preciso implementar os métodos da interface na classe Phone3?

questão 8

dado o código a seguir:

[/code]
3. public class TestDays {
4. public enum Days { MON, TUE, WED } ;
5. public static void man (String [] args) { ; // DÚVIDA 1 - pode ter um ponto e virgula aqui ou é erro de digitação?
6. for (Days d : Days.values()) //DÚVIDA 2 - o for não tem q ter um corpo?
7. ; //DÚVIDA 3 - ponto e virgula está correto??
8. Days [] d2 = Days.values();
9. System.out.println (d2[2]));
10. }
11.}

[code]

Qual é o resultado (marque todas as corretas.)

A. TUE
B. WED
C. Não é possivel prever o resultado(a sída é inalcançável)
D. Ocorre falha na compilação com um erro na linha 4
E. Ocorre falha na compilação com um erro na linha 6
F. Ocorre falha na compilação com um erro na linha 8
G. Ocorre falha na compilação com um erro na linha 9

marquei como certo a letra E, porem no livro a resposta certa é a letra B dizendo o seguinte Cada enum tem um metodo static values() que retorna um array dos valores do enum na ordem em que foram declarados no enum.

obrigado.

Salve!

É o seguinte com respeito a primeira questão, o que está acontecendo é que o método foi “Sobrescrito” na classe que erda Eletronic,
sendo assim um Phone tem comportamentos específicos para este método, coloquei no código abaixo uma mensagem para vc ver o que
está acontecendo, Quando as questões, como você pode ver o for vai iterar mas nada vai acontecer pois não existe um bloco ou uma linha
para ser executada, porém vai compilar e executar normalmente. Quanto ao ponto e virgula será também uma linha que não vai fazer diferença
no resultado do progama, mas também vai compilar e executar normalmente…

Segue abaixo o código com a mensagem e também o trecho do código da questão, e a saída que resultou aqui quando rodei o mesmo:

package Colecoes;

interface Device {
	public void doIt();
}

public class Eletronic implements Device {
	
	public enum Days { MON, TUE, WED } ; 

	
	public static void main(String[] args) {
		;
			
		 for (Days d : Days.values())
	    ;
		 Days[] d2 = Days.values();
		 System.out.println(d2[2]);
		 

		
		Phone2 p2 = new Phone2() {
		};
		p2.doIt();
	}
	public void doIt() {
		System.out.println("Eletronic...");
	}
	
}

 abstract class Phone1 extends Eletronic {

}

 abstract class Phone2 extends Eletronic {
	public void doIt() {
		System.out.println("Fone Dois sobresrevendo o método");
	}
}

class Phone3 extends Eletronic implements Device {
	public void doStuff() {
	}
}

Olha eu aqui de novo rs

Estou com dúvida na questão sobre equals() e hashCode()… Na questão 2 do capítulo 7, ele diz que a afirmação abaixo está incorreta, porque negam o contrato de equals() e hashCode():

“Se o método equals() retornar true, o operador == de comparação de hashCode() pode retornar true”.

Não está correto? Se dois objetos são considerados iguais pelo método equals(), o hashCode() também não tem que ser igual?

E aí chetspop, eu tenho a versão desse livro para SCJP 5 e ele compartilha do mesmo raciocínio que nós:

Neste caso, acabei de consultar aqui, afinal estou um pouco enferrujado de SCJP rsrs, ele diz que se x.equals(y) == true então o código hash dos objetos devem ser iguais, partindo do princípio que foram sobrescritos corretamente e usando as mesmas var.instâncias na implementação de ambos;

Sim, foi da forma q aprendi e que também está em uma apostila que tenho da Globalcode e no preparatório para SCJP 05, porém pode ocorrer dos métodos hashCode() serem iguais e o método equals() ser false, que por alguma "coincidência " objetos diferentes terem gerado um mesmo código de Hash, isso realmente pode ocorrer, por isso temos que sobrescrever ambos em nossas classes, hashCode para encontrar o “slot” certo e equals para determinar se são iguais perante os critérios que estabelecemos .

Galera, escuto muito sobre os erros de traduções do livro.
Alguém sabe se os erros estão presente nos dois anos de edição do livro (2008 e 2009) ou se na versão 2009 foram corrigidos?

Então sylvioneto, pelo q tenho visto o colega chetspop andou errando algumas questões por erros do próprio livro, como palavras erradas, dando a entender que eram “erros de sintaxe”, sendo que foi cagada na digitação da própria editora, vou lhe dar uma dica, busque sempre pelas últimas edições e como de Java 5 para Java 6 tem pouquíssimas diferenças, eu aconselho pegar o livro preparatório para Java 5 2ª Edição, eu tenho ele e não me recordo de grandes erros na em sua publicação, mas não tem como fugir neh, sempre tem alguns errinhos…, ou então esperar por uma 2ª Edição revisada para Java 06.

[quote=chetspop]Olha eu aqui de novo rs

Estou com dúvida na questão sobre equals() e hashCode()… Na questão 2 do capítulo 7, ele diz que a afirmação abaixo está incorreta, porque negam o contrato de equals() e hashCode():

“Se o método equals() retornar true, o operador == de comparação de hashCode() pode retornar true”.

Não está correto? Se dois objetos são considerados iguais pelo método equals(), o hashCode() também não tem que ser igual?[/quote]

Ola amigos, sobre esta questao a resposta do livro esta correta, pois a afirmacao que se adequa neste caso seria:

“Se o método equals() retornar true, o operador == de comparação de hashCode() DEVE retornar true”.

Ou seja, sempre que equals() for true, a comparacao com == de hashCode sera true, porem quando equals() retornar false ainda assim a omparacao == de hashCode podera ser true.