Dúvida em Questão sobre herança

10 respostas
kaduzick

Galera,

eu estava fazendo o testkiller e me deparei com a seguinte questão:

Given:

  1. package test;
  2. class Target {
  3. public String name = “hello”;
  4. }
    What can directly access and change the value of the variable name?
    A. any class
    B. only the Target class
    C. any class in the test package
    D. any class that extends Target

A resposta é a letra C

O que eu gostaria de saber é: Por que a letra D está errada?

Se a classe pode extender Target logo Target é visivel e então todos os seus membros public serão visíveis também?
Eu sei que a questão não fala pra eu escolher todas as opções possíveis, mas essa também não estaria correta?

Observação:

Pessoal, estou estudando para a SCJP 6.
Se alguem quiser trocar informações e discutir algum assunto estou a disposição.

10 Respostas

Jiraiya

Eae kaduzick

A letra D está errada porque a classe Target tem o modificador de acesso default, ou seja só tem acesso a ela e os atributos dela, as classes que pertencem ao mesmo pacote que ela.

Assim só é possível visualizar os membros dessa classe por herança se a outra classe pertencer ao pacote da classe Target.

Entendeu?..( tem como explicar de outras formas, se quiser)

kaduzick

Jiraiya,

Você concorda comigo que toda classe que conseguir herdar de Target também conseguirá alterar a variável diretamente? Ou melhor, por ser default, qualquer classe que consegue ver a classe Target conseguirá esse acesso.

Por ser default, podemos concluir automaticamente que a subclasse está no mesmo pacote, logo é válido dizer que uma subclasse consegue esse acesso.
Entendeu minha dúvida?

Se fosse o contrário: Classe public e membro default aí sim a letra D estaria errada.

Jiraiya

Não necessariamente a subclasse está no mesmo pacote, você pode ter uma subclasse em um pacote xyz que herda a classe Target que está no pacote test, mas Target precisa ser public para isso.

Uma class declarada como padrão(default) pertence apenas aquele pacote(pasta) aonde ela foi criada.
Não é possível acessar uma default class de um pacote diferente mesmo que ela tenha um import.

kaduzick

Então,

a classe Target é default, então ela só é visível no pacote dela. Como o mebro é public ele é visível para todas as classes que conseguem ver Target … logo, uma classe que consegue herdar de Target tem que ser do mesmo pacote dela. E se ele é do mesmo pacote, então ela consegue alterar o membro.

Para mim tanto C quanto D estão corretas.

Jiraiya

A letra D esta errada

any class that extends Target

“Qualquer classe que herde de Target”, nao foi especificado que está no mesmo pacote, ou seja opção errada

Se estivesse na opção assim, “Qualquer classe que herde de Target e pertença ao mesmo pacote” daria certo

kaduzick

Jiraiya,

Acho que você não entendeu minha dúvida.

A classe é DEFAULT e o membro é PUBLIC.
Para uma classe herdar de TARGET ela TEM que estar no mesmo pacote. Não é possível extender Target estando em outro pacote.

Logo se você extende Target é claro que você está no mesmo pacote entendeu minha dúvida agora?

Jiraiya

Ah sim entendi

Mas a opção ,coloca como qualquer classe que herde de Target, ou seja não esta prevendo o erro de compilação.

Essa opção é meio que um “pega”

marcosvidolin

Jiraiya:
Ah sim entendi

Mas a opção ,coloca como qualquer classe que herde de Target, ou seja não esta prevendo o erro de compilação.

Essa opção é meio que um “pega”

Concordo!
Esta a essência do exame.

kaduzick

Bom, entendi o ponto de vista de vocês … mas … bom … deixa pra lá.

De qualquer forma deixo o seguinte recado:
Eu baixei no 4shared um TestKiller de 30 megas … ele que eu estava usando, ele tem várias respostas erradas.

Obrigado pelas respostas Jiraiya e marcosvidolin

ViniGodoy

Acho que é porque a letra D é menos específica que a letra C.

Ela dá a entender que APENAS classes que estendem Target poderiam ver o atributo. Entretanto, classes que não estendem, mas estão no mesmo pacote, também podem ver.

Portanto, D não está errado, mas está incompleto.

Criado 19 de novembro de 2009
Ultima resposta 19 de nov. de 2009
Respostas 10
Participantes 4