Duvida Questão Livro Kathy

15 respostas
Nykolas_Lima

Boa Tarde

Estou fazendo os exercicios do livro da kathy do capitulo 8 -Classes internas

ai tem um exercicio assim:

class Foo {
    class Bar{}
}

class Teste{
  public static void main(String args[]) {
       Foo f = new Foo();
       //insira codigo aq
  }
}

A-Foo.Bar b = new Foo.Bar();

B-Foo.Bar b = f.new Bar();

C-Bar b = new f.Bar();

D-Bar b = f.new Bar();

E-Foo.Bar b = new f.Bar();

A resposta é a B.

Mas a resposta D também está correta nao esta? eu compilei e rodei aq e foi normalmente.
No livro fala que a D está errada porque não usa o nome da classe externa na declaração da variavel de referencia.

Mas o polimorfismo não se aplica ai?

Não sei se é erro do livro ou eu que não estou entendendo a resposta.

abraços

15 Respostas

T

Não é problema de polimorfismo (aliás não entendi o que o polimorfismo tem a ver com escopo de nomes), mas de resolução de nomes (ou seja, se o compilador acha um nome “Bar” sozinho, sem qualificação, acha que é uma classe que não é interna a outra, e isso ele não vai encontrar. Você precisa especificar Foo.Bar mesmo para a declaração da variável.

Por que é que ele consegue fazer f.new Bar()? Isso é um recurso da linguagem (que confesso que é muito pouco usado, justamente porque é um pouco obscuro). Como ele sabe que f.new deve ser seguido pelo nome de uma classe interna a Foo, e como a única classe interna a Foo é Bar, ele aceita Bar sozinho sem problemas (ou seja, você não precisa especificar f.new Foo.Bar().

Nykolas_Lima

Nao entendi a sua resposta.

A resposta D não está correta?

No livro diz que está errado por que tem q declarar como NomeClasseExterna.ClasseInterna

Mas se voce usar somente o tipo da classe intera ele compila e roda normalmente.

Mas no livro diz que isto está errado

A minha pergunta é, a resposta D está correta?

taaqui

Lembrando que você nunca pode acessar a classe internar sem uma referencia a uma classe externa.

Nykolas_Lima

Mas ali tem a referencia.

Bar b = f.new Bar();

no caso o “f” é a referencia da classe externa

taaqui

Veio pelo que eu entendi de classe interna é isso, se voce fizer isso Bar b = f.new Bar() o compilador vai achar que você da dando new em uma classe externa pelo “bar b” ou seja você tem que especificar que esta se referindo a classe interna com Foo.Bar, me corrijam se eu estiver errado.

F
O compilador acha que a referência Bar aponta para uma classe "normal" e não para uma classe interna. [u]Porque uma classe interna não pode ser acessada sem uma referência a classe externa.
[/u]

Para criar a referência a Bar, você precisa ter [b]Foo.Bar na referência[/b] e [b]f.new Bar() na construção real do objeto.[/b]

Pelo meu entendimento, acredito que seja isso.

O compilador acha que a referência Bar aponta para uma classe “normal” e não para uma classe interna. Porque uma classe interna não pode ser acessada sem uma referência a classe externa.

Para criar a referência a Bar, você precisa ter Foo.Bar na referência e f.new Bar() na construção real do objeto.

Pelo meu entendimento, acredito que seja isso.

Nykolas_Lima

É isso mesmo.

Eu entendi o que voce quis dizer.

Mas fazendo somente com Bar b = f.new Bar();

O programa roda normalmente!
acessando todas as variaveis e métodos da classe interna!

Então a resposta D nao estaria certa?

Nykolas_Lima

Outra questão com a mesma duvida

MyInner mi = new MyOuter.MyInner();

O livro diz que está errado porque nao usa o nome da classe encapsuladora na declaração da variavel.

Mas eu compilando isso o código RODA!

A minha dúvida é se essa declaração é correta ou não!

obs: Essa classe MyInner é ESTÁTICA.

F

Então, pelo o que o livro diz e pelo meu entendimento, ambos os exemplos que você deu estariam errados. Mas nunca cheguei a escreve-los no computador e testá-los.

Indo pelo que o livro diz me faz entender que está errado.

Mas se você testou e deu certo, então poderia ser um equivoco do livro!? É o que me vem primeiramente na cabeça agora.

Nykolas_Lima

Então está é a minha duvida, se é o livro que está errado.

pq eu compilei e rodei…e roda normalmente…

só se isso não for uma boa prática…mas de qualquer forma a questão estaria errada pq ele pergunta quais que criam uma instancia de Bar e com a resposta D ele cria normalmente…

Vou ficar acompanhando aq esperando se alguem consegue exclarecer as duvidas

Obrigado

F

Opa, não tinha visto que você escreveu que MyInner é estática. Daí muda um pouco a regra.

Sendo estatica tu não precisa ter antes a referência para a classe externa, pode criar a classe interna sem uma referência a classe externa, mas ainda assim tu precisa do nome da classe encapsuladora na criação da variável de referência.

Ou seja, acredito que o correto seria:

Alguém confirma?

Nykolas_Lima

Sim o que voce escreveu ai está correto!

a parte de instanciação está correta e eu já entendi

a minha duvida é se posso declarar o tipo da instancia somente com o tipo da classe interna:

ao invez de declarar assim:

Eu testei esses dois exemplos e os dois funcionaram, só que o livro diz que o primeiro não funciona!

Nykolas_Lima

Descobri o que havia errado

O meu método main estava na msm classe que MyOuter, ai o código rodava normalmente.

Mas com o main em uma outra classe separada, somente o com MyInner ele não reconhece.

Então é OBRIGATÓRIO usar a declaração OuterClass.InnerClass

Obrigado pela ajuda e desculpem a minha burrice haha

F

Blz… essa é a melhor maneira de esclarecer dúvidas, assim como serviu para me deixar alerta com relação a esse tipo de questão.

Meu exame está em cima da hora, dia 25-02, daqui 8 dias. Estou procurando ao máximo esclarecer minhas dúvidas e este tópico ajudou.

Até +…

lipe82

Putz cara, o código Bar b4 = f.new Bar(); não compila na minha máquina não.
Só o Foo.Bar b2 = f.new Bar(); compila numa boa. O livro tá certo…

Criado 18 de fevereiro de 2009
Ultima resposta 19 de fev. de 2009
Respostas 15
Participantes 5