Socorro !que livro estranho ?scjp 2 edicao sierra!?

40 respostas
F

O livro que comprei para passar njo exame é certificacao sun para programador java 5 scjp 2 edicao sierra ,defato muito que passaram anunciaram ele!!Mas estou encontrando alguns erros e estou preocupado!!pois gastei 130 reais!!

A minha dúvida é a seguinte galera!!
Na pagina 62 esta escrito que um método private de uma superclasse nao pode ser sobrescrito por uma subclasse ,mas nao é vardade!O meu compilador compila e executa!!!

Na pagina 97 exercio de texte numero 7 ,a resposta esta errada!!

Na pagina 116 referente ao assunto de anicializacao de variaveis
tambem o conteudo dessa pagina “a meu ver 116 esta errado”,vejam:
"texto copiado do scjp sierra 2 edicao revisado ctrl-c ctrl - v "
O compilador nao podera informar sempre se uma variavel foi inicilizada antes do uso “ate aki tudo ok”.Por exemplo se vc inicializá-la dentro de um bloco condicional(em outras palvras,um bloco de código que pode ser ou nao executado,como o bloco de uma instrucao if,ou loop for sem um valor literal true ou false como alternativa) " o compilador saberá que a inicializacao talvez nao ocorra e poderá produzir um erro.

Entao para min ele esta dizendo que o contrario vale nao é??
se eu informar o valor literal ao bloco entao irá aceitar inicializar a variável??.Nao ainda assim pelo menos no meu compilador java as coisas nao sao assim
exemplo :

class A{

public static void main(String a[]){

boolean x=true;

int n,y;
if(x == true)
            n=4;
                  
     
      System.out.println(n);erro ao ecessar a variavel que nao foi   inicializada!!!!!!!!!!ou seja o compilador dispreza o valor literal de x nao quer nem saber!!!!!!

}
}

Mas afinal este livro é bom ou nao,pois estou estudando para certificao java e se toda vez tenho que conferir se o que fala esta certo vou estar pronto para a prova daqui 2 anos ou mais ou nunca???Alguem que tambem tem esse livro e que estudou nele para passar FAZER INFINITA GENTILEZA DE ME AJUDAR! e confeir???será que interpretei mal esses trecho do livro??

40 Respostas

leofernandesmo

Cara, o livro da Keith Syerra está com vários erros.
com relação ao seu exemplo…lógico que irá da erro de compilação, pois a variável poderá chegar ao system.out sem ter sido inicializada.
Apenas as variáveis de instância são inicializadas.

F

Obrigado professor de lógica, mas para quem nao conhece por completo uma linguagem de programacao nem tudo é tao lógico assim…

marcelo_mococa

Sim… o livro em português tem alguns erros, mas nada que possa te atrapalhar no exame.

Continue fazendo assim, testando os códigos… é bom pra você estudar e ainda pode descobrir alguns errinhos, que não deixa de ser um estudo, rs.

marcelo_mococa

– ops… duplicado -

F

Com relacao ao exemplo que fiz,eu tavo mostrando que a argumentacao estava invalida! nao foi para testar o quanto um expert em java é sagaz e domina a lógica !!

Ricardo_Siqueira

Cara, relax…a tradução é mesmo ridícula(na versão do java 2 ele chamava thread de seguimentos) mas o livro é muito bom. Você não gastou seu din din á toa. Eu e mta gente que conheço passamos no exame graças a ele.

F

È verdade Marcelo_Madeira e obrigado pelo conselho !

nadilsons

fabioEM:
Na pagina 62 esta escrito que um método private de uma superclasse nao pode ser sobrescrito por uma subclasse ,mas nao é vardade!O meu compilador compila e executa!!!

Pense que a sobreescrita depende da heranca… como voce nao herda atributos/metodos privados de uma classe; voce nao tem condicoes para sobreescreve-lo… voce apenas criou um metodo/atributo que por acaso tem o mesmo nome… mas noa tem nenhuma relacao com o metodo/atributo da classe pai.

Amigo, seja mais educado… afinal ninguém é obrigado a responder as suas indagações… fazemos por camaradagem, para propagar o conhecimento.

Ate mais.

esb

fabioEM,

Socorro? Tá no lugar errado… liga 190 e veja se eles te ajudam.

[]'s

andre_a_s

A respeito do método private…
O que acontece é que o quando vc herda uma classe e esta classe tem um método private, vc não tem acesso a este método na classe que herdou.

Tlvz isso seja um erro de tradução, e acabou dando outro sentido.

Ricardo_Siqueira

Calma cara…ele tava tentando te ajudar

F
beleza Ricardo ,estou mais confortado! Achavo que era eu que nao estava intendendo nada!!

A proposito vc ou alguem que ja passou no exame sabe me dizer pq

y =0;

y=y++;

pq vai mostrar  zero na tela,mas  em c a linguagem que tenho mais experiencia nao acontece!!e mosra 1
andre_a_s
Faz assim que funciona <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/w.pngink.png?v=9" title=":wink:" class="emoji" alt=":wink:">

y =0;

y=++y;

Quando vc põe o “++” antes, ele executa a operação antes da atribuição, caso contrário, ele executa a operação só depois.

F

Pior que nao andre_a_s!No livro é citado como uma das vária regras para poder subescrever um método correctamente a 5 de cima para baixo na pagina 62!!Pó aqui nao traducao aqui é um erro grosseiro

F

Querido nadilsons,se nao fui educado foi pq achei a resposta um pouco ofensiva pois insinuar que é lógico nao é muito simpatico de fato simplismente estavo com uma dúvida e com gentileza perguntei para alguem esclarecer.Para explicar melhor te faço um exemplo,se vc me perguntar algo sobre um assunto que eu tenho amplo conhecimento e dominio mas percebo que tua pergunta é simples e muito banal nao vejo a razao pela qual te responder o quanto tu nao sabes?concorda amigo?
um abraco

Luiz_Gustavo

fabioEM,

posso te fazer uma pergunta, de pura curiosidade?
Você já leu algum livro sobre a linguagem (Core Java, Deitel, etc…) antes de ler o livro de certificação?
Não discordo que o livro tenha erros de tradução, e até mesmo erros nos códigos, mas quando vc tem uma base anterior de conhecimento, esse tipo de erro vc tira de letra e não chegam a atrapalhar.
Passei por uma situação parecida quando comprei um livro de JSP, Servlet e EJB. a tradução tinha muitos erros, nomes traduzidos indevidamente, mas como já conhecia um pouco por ter lido outros livros, isso não me atrapalhou.

[]`s

Matheus_Tardivo

Neste caso, não há erro de tradução do livro. Veja que o nadilsons já explicou porque:

Realmente, foi um erro de interpretação.

Veronicaaa

fabioEM:
Pior que nao andre_a_s!No livro é citado como uma das vária regras para poder subescrever um método correctamente a 5 de cima para baixo na pagina 62!!Pó aqui nao traducao aqui é um erro grosseiro

A quinta regra da página 62 do livro em Português diz assim:

Qual o erro dela?
O colega nadilsons explicou anteriormente que você apena criou um método que por acaso tem a mesma assinatura to método private da superclasse.

F

tudo bem Ricardo Siqueira ,mas acho desnecessário ajudar alguém mostrando o quanto a pessoa nao sabe sabe.Sei que aqui tem gente que domina o assunto, mas nem por isso acho que deve responder desse com jeito.Cada um tem um jeito de ser diferente , mas acho que deveriamos ser somente um poquinho mais humilde afinal somos todos iguais nao é mesmo? Eu vou ao banheiro fazer …do mesmo jeito que vc e outros?

F

ops…è verdade Matheus Tardivo touche!!
mas…
adiante tem um erro que nao se trata de má interpretacao veja a pagina 97 exercio 7 aqui realmente nao tem para onde ir, aresposta nao tem muito a var pois explica o pq vai dar errado mas nao a solucao!!!
e mais…
como tambem na pagina 116 quando fala de inicializar uma variável primitiva o exemplo que citei no começo do meu questionamento
pode pegar o livro e ver!
valeu!!

F

Sim Luiz_Gustavo,comeci lendo deitel java como programar mas pelo fato de abordar java com mais superficialidade nao considerei muito.Na verdade comprei esse livro scjp sierra pq muitas pessoas que passarm no exame o aconselharam e no livro deitel, pelo menos nao que lembri nao havia ficado com tantas dúvidas, mas é como te falei, o livro scjp trata o assunto com mais riqueza de detalhes entao pode errar mais!

F

Muito obrigado Veronicaaa ,é de novo verdade!!Me parece até estranho uma mulher dando conselhos em programacao java pois na minha facu só tem uma mulher na turma!Mas como dizem, quando vcs se interessam por um assunto conseguem realmente domina-lo!valeu!!

Luiz_Gustavo

Exato!
Apesar de saber de pessoas que passaram na certificação estudando apenas pelo Deitel, ele não é um livro específico para a certificação.
O livro da kathy é mais focado em certificação, mostrando as “nhacas” das pegadinhas da linguagem.

[]'s

F
Legal Gustavo, entao vc que se garanters pq em java

y=0;

y=y++;

imprime 0??em c isso  nao acontece ele atribui y para ele mesmo e esmo assim  depois incrementa y=y=y+1;mas em java nao o resultado é zero!!!
F

ops na verdade era para vc a pergunta Gustavo!!foi mal!

Matheus_Tardivo
fabioEM:
... adiante tem um erro que nao se trata de má interpretacao veja a pagina 97 exercio 7 ...
Eu não tenho esse livro. Seria melhor você colocar aqui sua dúvida.
fabioEM:
... na pagina 116 quando fala de inicializar uma variável primitiva o exemplo que citei no começo do meu questionamento
Quanto a isso, é outro erro de interpretação. A variável x não é literal e nem constante. Dessa forma, o compilador não tem como garantir que essa variável será inicializada dentro do bloco condicional. Para verificar isso, vamos usar o seu exemplo:
public static void main(String[] args) {
	boolean x = true;
	
	int n, y;
	
	if (x == true) {
		n = 4;
	}
	
	System.out.println(n);
}
O compilador vai identificar um erro pois, como falei acima, x não é literal nem constante, por isso, para o compilador, n pode não ser inicializada antes de ser usada. Se você modificar para:
final boolean x = true;

int n, y;

if (x == true) {
	n = 4;
}

System.out.println(n);
Agora x é uma "constante" (ou não pode ter seu valor alterado), então o compilador não acusa nenhum erro. A mesma coisa irá acontecer se você alterar seu exemplo para:
boolean x = true;

int n, y;

if (true) {
	n = 4;
}

System.out.println(n);
Pois o bloco condicional tem apenas uma literal.

Enfim, recomendo o seguinte para você:
- Ou você "acredita" mais no que o livro está dizendo e faz uma força extra no sentido de entender o que ele diz;
- Ou, como o Luiz_Gustavo sugeriu, tente reforçar seus estudos com um livro mais didático (como este), para ensinar os fundamentos da linguagem, depois parta para um livro específico sobre certificação;

Matheus_Tardivo
<blockquote><div class="quote-author">fabioEM:</div> pq em java

y=0;

y=y++;

…</blockquote>

As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).

Em java:

int i = 0; System.out.println(i++);
Imprime 0.
Em C:

int i = 0; printf("%d", i++);
Imprime 0 também.
Isso porque a operação de pós-incremento primeiro avalia o valor da variável e depois faz a atribuição (i = i + 1).

Já com a operação de pré-incremento:
Em java:

int i = 0; System.out.println(++i);
Imprime 1.
Em C:

int i = 0; printf("%d", ++i);
Imprime 1 também.
Porque acontece o processo inverso, atribuição depois avaliação.

Veja a recomendação que coloquei no meu último post.

Veronicaaa
<blockquote><div class="quote-author">Matheus Tardivo:</div><blockquote><div class="quote-author">fabioEM:</div> pq em java

y=0;

y=y++;

…</blockquote>

As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).

Em java:

int i = 0; System.out.println(i++);
Imprime 0.
Em C:

int i = 0; printf("%d", i++);
Imprime 0 também.
Isso porque a operação de pós-incremento primeiro avalia o valor da variável e depois faz a atribuição (i = i + 1).

Já com a operação de pré-incremento:
Em java:

int i = 0; System.out.println(++i);
Imprime 1.
Em C:

int i = 0; printf("%d", ++i);
Imprime 1 também.
Porque acontece o processo inverso, atribuição depois avaliação.

Veja a recomendação que coloquei no meu último post.

Isso é verdade, mas acho que o que o colega fabioEM quis dizer é diferente disso, veja bem ele não falou em y++; e sim y = y++;

É diferente, pois também testei no eclipse e realmente permanece zero, não importa quantas vezes você faça a atribuição ele sempre permanece zero, acho que o java atribui o valor de y (que é 0) a y e depois faz o incremento só que este não é atribuído a variável nenhuma. Parece que o incremento se perde!

F

Agora vc realmente explicou Matheus,e por sinal muito bem explicado.
Mas tem algumas partes que estao realmente mal esclarecidas defato vc mesmo explicou com auxilio de uma costante que não é mencionada no livro e nem deixado por subentendido.No exemplo que dei NAO disse que x era o valor literal mas que tinha que assumir o valor literal boolean em código fonte, defato segui ao pé letra o exemplo do livro, pois é assim que ele explica e nao com uma constante!!!
E se vc tivesse com o livro em maos poderia ver a pagina 97 ex 7!!assunto "construtores " ,neste caso a resposta esta sem lógica.
mas acho que vou seguir mesmo assim seu conselho vou depositar mais fé no livro pode ser que realmente vou ter que sempre associar estudos com consultas e verificacoes!!
valeu pela ajuda mesmo!!!

L
<blockquote><div class="quote-author">Veronicaaa:</div><blockquote><div class="quote-author">Matheus Tardivo:</div><blockquote><div class="quote-author">fabioEM:</div> pq em java

y=0;

y=y++;

…</blockquote>

As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).

Em java:

int i = 0; System.out.println(i++);
Imprime 0.
Em C:

int i = 0; printf("%d", i++);
Imprime 0 também.
Isso porque a operação de pós-incremento primeiro avalia o valor da variável e depois faz a atribuição (i = i + 1).

Já com a operação de pré-incremento:
Em java:

int i = 0; System.out.println(++i);
Imprime 1.
Em C:

int i = 0; printf("%d", ++i);
Imprime 1 também.
Porque acontece o processo inverso, atribuição depois avaliação.

Veja a recomendação que coloquei no meu último post.

Isso é verdade, mas acho que o que o colega fabioEM quis dizer é diferente disso, veja bem ele não falou em y++; e sim y = y++;

É diferente, pois também testei no eclipse e realmente permanece zero, não importa quantas vezes você faça a atribuição ele sempre permanece zero, acho que o java atribui o valor de y (que é 0) a y e depois faz o incremento só que este não é atribuído a variável nenhuma. Parece que o incremento se perde!

É!

muito interessante.

Alguem sabe explicar tecnicamente o q ocorre? Em detalhes baixo nível! :smiley:

F
<blockquote><div class="quote-author">Matheus Tardivo:</div>

y=0;

y=y++;

As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).

…</blockquote>
<blockquote><div class="quote-author">FabioEM:</div>

y=0;

y=y++;

resultado é 0 em java mas em c é 1

…</blockquote>

Noa!! se vc fizer essa operacao em c o resultado vai ser diferente amigo pode acreditar !!alguma coisa acontece!!

F

Iclusive Matheus Tardivo essa questao estava em um site italiano que mostra alguns textes parecidos com a prova scjp!!! um boa pegadinha que é fácil cair viu???rs…

F

Pois é Veronica bem observado!Realmente essa pegadinha de mal gosto acaba de fazendo nos reflectir que a linguagem java esconde alguns segredinhos!!Nao é??
um abraço!!

F
Acho que Gustavo sabe,ei Gustavo será que pelo menos tu sabes???

to ficando doido!

y=0;

y=y++;

imprime zero!! mas porque??? se em c imprime 1!!!
Matheus_Tardivo

Realmente, neste caso, o funcionamento é um pouco diferente do que expliquei.
Ai já entra um elemento extra: ordem de avaliação dos operandos.

Mas essa dúvida já foi bastante discutida, inclusive aqui mesmo no GUJ.
http://www.guj.com.br/posts/list/2853.java
http://www.guj.com.br/posts/list/30723.java
http://www.javafree.org/javabb/viewtopic.jbb?t=11245
http://www.javafree.org/javabb/viewtopic.jbb?t=10563

Esse tipo de dúvida é apenas coisas de certificação (se bem que não me lembro de ter visto isso quando fiz a minha).
Não vejo porque alguém utilizaria uma atribuição dessas num caso real. :smiley:

leofernandesmo

fabioEM:
Querido nadilsons,se nao fui educado foi pq achei a resposta um pouco ofensiva pois insinuar que é lógico nao é muito simpatico de fato simplismente estavo com uma dúvida e com gentileza perguntei para alguem esclarecer.Para explicar melhor te faço um exemplo,se vc me perguntar algo sobre um assunto que eu tenho amplo conhecimento e dominio mas percebo que tua pergunta é simples e muito banal nao vejo a razao pela qual te responder o quanto tu nao sabes?concorda amigo?
um abraco

Cara, desculpe se o logico te ofendeu. Nao era essa minha intencao…de maneira alguma quero mostrar que sei mais do que vc ou qq outra.
Eu tenho que ter mais cuidado com meus posts pq esqueco que a pessoa nao esta “vendo minha expressao”…

Luiz_Gustavo

Opa… tudo jóia?

Talvez eu possa colaborar…

class Test {
	public static void main(String[] args) {
		int i = 2;
		int j = (i=3) * i;
		System.out.println(j);
	}
}
class Test {
	public static void main(String[] args) {
		int a = 9;
		a += (a = 3);									// first example
		System.out.println(a);
		int b = 9;
		b = b + (b = 3);									// second example
		System.out.println(b);
	}
}

fonte: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
	  i++;
	  System.out.println(i);	// "4"
	  ++i;			   
	  System.out.println(i);	// "5"
	  System.out.println(++i);	// "6"
	  System.out.println(i++);	// "6"
	  System.out.println(i);	// "7"
     }
}

fonte: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op1.html

acho que a questão toda está aqui:

Como o que prevalece na expressão é o valor da atribuição, e o pós incremento resulta no valor original, Y acaba sendo zero mesmo.

Caso alguém tenha uma visão diferente, ou outra explicação e queira compartilhar… por favor… para mim, até o momento, o motivo é esse.

abraços!

[editado]
Faltou a última fonte de referência!
[/editado]

F

Luiz_Gustavo:
fabioEM:

Legal Gustavo, entao vc que se garanters pq em java

y=0;

y=y++;

imprime 0??em c isso nao acontece ele atribui y para ele mesmo e esmo assim depois incrementa y=y=y+1;mas em java nao o resultado é zero!!!

</blockquote>

Opa… tudo jóia?

Talvez eu possa colaborar…

class Test {
	public static void main(String[] args) {
		int i = 2;
		int j = (i=3) * i;
		System.out.println(j);
	}
}
class Test {
	public static void main(String[] args) {
		int a = 9;
		a += (a = 3);									// first example
		System.out.println(a);
		int b = 9;
		b = b + (b = 3);									// second example
		System.out.println(b);
	}
}

fonte: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
	  i++;
	  System.out.println(i);	// "4"
	  ++i;			   
	  System.out.println(i);	// "5"
	  System.out.println(++i);	// "6"
	  System.out.println(i++);	// "6"
	  System.out.println(i);	// "7"
     }
}

fonte: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op1.html

acho que a questão toda está aqui:

Como o que prevalece na expressão é o valor da atribuição, e o pós incremento resulta no valor original, Y acaba sendo zero mesmo.

Caso alguém tenha uma visão diferente, ou outra explicação e queira compartilhar… por favor… para mim, até o momento, o motivo é esse.

abraços!

[editado]
Faltou a última fonte de referência!
[/editado]

Bom muitissssssssssssssimom obrigado meu amigo!!!

F

leofernandesmo:
fabioEM:
Querido nadilsons,se nao fui educado foi pq achei a resposta um pouco ofensiva pois insinuar que é lógico nao é muito simpatico de fato simplismente estavo com uma dúvida e com gentileza perguntei para alguem esclarecer.Para explicar melhor te faço um exemplo,se vc me perguntar algo sobre um assunto que eu tenho amplo conhecimento e dominio mas percebo que tua pergunta é simples e muito banal nao vejo a razao pela qual te responder o quanto tu nao sabes?concorda amigo?
um abraco

Cara, desculpe se o logico te ofendeu. Nao era essa minha intencao…de maneira alguma quero mostrar que sei mais do que vc ou qq outra.
Eu tenho que ter mais cuidado com meus posts pq esqueco que a pessoa nao esta “vendo minha expressao”…

Beleza meu amigo ,percebo que vc é um cara bem educado e camarada valeu!!!

F

Matheus Tardivo:
Realmente, neste caso, o funcionamento é um pouco diferente do que expliquei.
Ai já entra um elemento extra: ordem de avaliação dos operandos.

Mas essa dúvida já foi bastante discutida, inclusive aqui mesmo no GUJ.
http://www.guj.com.br/posts/list/2853.java
http://www.guj.com.br/posts/list/30723.java
http://www.javafree.org/javabb/viewtopic.jbb?t=11245
http://www.javafree.org/javabb/viewtopic.jbb?t=10563

Esse tipo de dúvida é apenas coisas de certificação (se bem que não me lembro de ter visto isso quando fiz a minha).
Não vejo porque alguém utilizaria uma atribuição dessas num caso real. :smiley:

ok li todos os comentarios.Defato todos afirmam que na ordem da
de uma expressao o compilador dar preferencia para o operador unario ++ ou – , depois o binario sendo assim em um exemplo
b=1
b=b++ + b
primeiro incrementa defato b+1 e depois e soma com b antigo
ou seja b= 2 + 1,b=3
O problema desse raciocinio surge quando vc tem uma expressao um pouco mais complicada do tipo b=1;
b=b++ + b++
logo de acordo com a regra geral explicada pela galera,o compilador PRIMEIRO faz b++ pós-operaco e operador unario, depois soma os 2 resultados dando preferencia por fim para o operador binario logo ficaria b=2 + 2,total b=4
mas na verdade quando mandei compilar o resultado foi b=3
pq??

Criado 13 de setembro de 2007
Ultima resposta 15 de set. de 2007
Respostas 40
Participantes 11