Questão Sobre Classe Interna[Resolvido]

10 respostas
sidney.tavares

Boa tarde a todos, estava fazendo um simulado quando me deparei com a questão abaixo:

given:

1.class Foo{
2.    class Bar{}
3.}
4.class Test{
5.   public static void main(String [] args){
6.        Foo f = new Foo();
7.        //insert code here
8.    }
9.}


Which, inserted at line 7, creates an instance of Bar?

A- Foo.Bar b = new Foo.Bar();
B- Foo.Bar b = f.new Bar();
C- Bar b = new f.Bar();
D- Bar d = f.new Bar();
E- Foo.Bar b = new f.Bar();

Eu marquei a opção D, mas o simulado me diz que a correta é a B, com a seguinte explicação:

Dizendo que é a correta porque a sintaxe está usando os nomes tanto da classe encapsuladora quanto da classe interna, testei o código e com a opção que eu marquei compila e executa também, me parecendo que também cria uma instância de Bar. Minha dúvida é, se uma questão desse tipo cai no exame, porque só a opção B é a maneira correta de criar uma instância da classe interna. Agradeço desde já pela ajuda. Abraços.

10 Respostas

gabrielfrios

Estranho mesmo manolo, a opção D tbm cria um objeto Bar. Pode ser que a questão seja sobre o correto uso da sintaxe. Apesar que o enunciado pergunta qual cria uma instancia de Bar. Estranho.

E

Não acho que cairia uma coisa tão detalhista como esta. De qualqer forma, se você testar vai ver que b é a resposta certa mesmo.

class Foo {
    public Foo () {
	}
	class Bar {
		public Bar() {
		}
	}
}

class FooBar {
    public static void main (String[] args) {
	    Foo f = new Foo();
		Foo.Bar fb = f.new Bar(); // OK
		Foo.Bar fb2 = f.new Foo.Bar(); // Ele se confunde achando que você quer chamar o construtor de Foo
		// Por isso, a mensagem (que é um pouco incompreensível, na verdade) é "'(' expected". 
	}
}

Eu também achava que tinha de usar Foo.Bar, já que o nome da classe é pacote.Foo.Bar.

sidney.tavares

Valeu pelas respostas amigos, entanglement, no seu código eu entendi, mas olha a resposta que eu marquei como certa, a letra D, não faz a mesma coisa? Abraço.

E
class Foo {
    public Foo () {
	}
	class Bar {
		public Bar() {
		}
	}
}

class FooBar {
    public static void main (String[] args) {
	    Foo f = new Foo();
		Foo.Bar fb = f.new Bar(); // OK
		Bar fb2 = f.new Bar(); // Erro: 'Can not find symbol' (lembre-se, o nome da classe é Foo.Bar) 
	}
}

Não, porque o nome da classe é Foo.Bar.

ribclauport

Realmente, esta questão caiu na minha prova, e no meu mock o cara coloca um detale, que talvez elucide melhor a explicação do entanglement.

Veja que se digitar em um pacote chamado view isso aqui nao vai compilar

package view;
class Foo{   
    class Bar{}   
}   
class Test{   
   public static void main(String [] args){   
        Foo f = new Foo();   
        Bar d = f.new Bar(); //aqui da erro, pois dentro de view, não existe a classe Bar!, e a minha IDE diz: Bar cannot be resolved to a type
   }   
}

Como o entanglement explicou a classe é Foo.bar, e seu nome qualificado seria view.Foo.Bar, porém acho que você colocou o código na IDE e não viu uma sutil diferença:

package view;

import view.Foo.Bar; //aqui a IDE as vezes coloca o import sozinha, ou você da um CTL+Shift+O no Eclipse!

class Foo{   
    class Bar{}   
}   
class Test{   
   public static void main(String [] args){   
        Foo f = new Foo();   
        Bar d = f.new Bar(); 
   }   
}

Repare que agora existe um import da Classe com seu nome totalmente qualificado, e desta Forma você pode usá-la no código, mas na questão não existe
declaração de import!

Att.

gabrielfrios

Até ai tudo bem, mas a questão não seria sobre o que a questão está pedindo?

Which, inserted at line 7, creates an instance of Bar?

ribclauport

gabrielfrios:
Até ai tudo bem, mas a questão não seria sobre o que a questão está pedindo?

Which, inserted at line 7, creates an instance of Bar?

Which, inserted at line 7, creates an instance of Bar?

Bom, se eu entendi sua citação, a questão está pedindo o que inserido na linha 7 vai criar uma intância de Bar, e toda a abordagem no post foi a respeito da motivação do código não compilar, como pudemos ver o código não trás uma declaração package, não traz uma declaração import, e se você colocar o código para compilar(Pode ser uma IDE no pacote default), verá que não compila, pois não existe uma classe com o nome qualificado Bar, e sim uma classe chamada Foo.Bar, pois uma classe interna é considerada um membro da classe que a detém, hora o código abaixo não compila:

class Foo{ class Bar{} } class Test{ public static void main(String [] args){ Foo f = new Foo(); Bar d = f.new Bar(); //Bar cannot be resolved to a type (É isso que a IDE vai te dizer, não existe o tipo Bar! } }

Mesmo se você tentar importar a classe Bar não vai funcionar!

veja o código abaixo, lembrando que estou no momento testando esse código em meu Eclipse sem a presença de um package, e sim no default!

import Foo.Bar; //The import Foo cannot be resolved

class Foo{   
    class Bar{}   
}   
class Test{   
   public static void main(String [] args){   
        Foo f = new Foo();   
        Bar d = f.new Bar();// Bar cannot be resolved to a type
    }

Bom diante dos testes, lembrando que o código reside sobre o pacote “default”, seguindo a mesma lógica do código da questão, mostra que o texto do post citado abaixo, não coincide com o que foi exposto acima, veja o texto:

A única forma de o código ter ter sido testado como o post relata, é o mesmo ter sido inserido em um pacote, e ter sido inserido a declaração import como citado abaixo
em meu post:

Bom, espero ter sanado, o que na verdade não entendi muito com o que foi dito:

Até ai tudo bem, mas a questão não seria sobre o que a questão está pedindo?

Pois para mim tem tudo a ver com o que a questão pediu.

Att

gabrielfrios

ribclauport eu já tinha entendido a sua explicação. Agora eu entendi que no contexto da questão, sem adição de package e import, apenas a resposta B criaria uma instancia.

sidney.tavares

ribclauport, esclareceu 100% minha dúvida, realmente eu não prestei atenção ao fato da IDE realizar o import automaticamente, obrigado mesmo, estou encerrando o tópico.

ribclauport

Opa, valeu rapaiz, tive a mesma dúvida que você, e então eu gerei tudo fora do eclipse, e então comparei os dois arquivos…
É realmente essas coisas que acho massa no estudo da certificação, a gente começa a reparar em detales que trabalhando não da tempo de ver…

Fico feliz de ter ajudado.

Criado 15 de maio de 2012
Ultima resposta 17 de mai. de 2012
Respostas 10
Participantes 4