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.
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.
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
MyInnermi=newMyOuter.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
fernandoeick
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
fernandoeick
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
fernandoeick
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…