Classe interna de interface

5 respostas
rodrigo.bossini

Pessoal, é o seguinte:

Há poucos minutos descobri que uma interface pode ter uma classe interna.

interface Inter{
  class Classe{}
}

Tentando instaciá-la, descobri que não era possível com a seguinte sintaxe:

Inter i = new Inter(){};
Inter.Classe obj = i.new Classe();

Porém é possível com:

Inter.Classe obj = new Inter.Classe();

O que me leva a “brilhante” conclusão de que uma classe interna de interface é implicitamente static. Isso está certo mesmo?

5 Respostas

marcos.junqueira

Não, não é não…

Não existe classe estática, apenas métodos e atributos podem ser estáticos.

Ela é apenas uma classe interna.

Inter.Classe obj = new Inter.Classe();

Nesse caso você está instanciando um objeto da classe interna.

rodrigo.bossini

Pessoal, na boa, vamos responder só quando tivermos certeza.

Respondendo a minha própria pergunta, o seguinte trecho de código compila e executa, o que indica que minha suposição estava correta:
interface I{
	static class Classe{}
}
marcos.junqueira: A seguinte sintaxe serve para instanciar uma classe estática, definida dentro de uma outra classe, o que faz com que ela não seja uma classe interna "regular".
class Out{
   static class Inner{
   }
}

class Teste{
  public static void main (String... s){
      Out.Inner ob = new Out.Inner();
  }
}
Já a seguinte sintaxe serve para instancia uma classe interna "regular".
class Out{
   class Inner{
   }
}

class Teste{
  public static void main (String args[]){
    Out.Inner ob = new Out().new Inner(); //repare no relacionamento que uma instancia da inner tem com uma instancia da outer, o que a faz uma classe interna regular.
 }
}

Abraços

marcos.junqueira

Me equivoquei quanto à classe estática pois o modificador static atua de forma diferente em atributos, metodos e classes. Mas sabemos que a classe estática só consegue acessar os atributos estáticos da classe pai, qual seria a utilidade de uma classe estática em uma interface?

class NestedClassTip {

    private String name = "instance name";

    private static String staticName = "static name";

    public static void main( String[] args ) {
        NestedClassTip nt = new NestedClassTip();

        NestedClassTip.NestedOne nco = nt.new NestedOne();

        NestedClassTip.NestedTwo nct = new NestedClassTip.NestedTwo();
    }

    class NestedOne {

        NestedOne() {
            System.out.println(name);
            System.out.println(staticName);
        }

    }

    static class NestedTwo {

        NestedTwo() {
            System.out.println(name);//erro
            System.out.println(staticName);
        }

    }
}
maior_abandonado

caramba… se cai isso na scjp eu iria da uma bicuda das mais grossa… hauhahuauhauhauha

rodrigo.bossini

O seguinte código funciona normalmente:

interface A{
	  int a  = 2;

	 static class B{
		void metodo(){
			System.out.print (a);
		}
	}
}

Quer dizer que uma classe interna de interface pode brincar o quanto quiser com os atributos (que também são estáticos) da interface, só não vai poder utilizar os métodos, que obviamente não podem ser estáticos.

Criado 26 de fevereiro de 2009
Ultima resposta 26 de fev. de 2009
Respostas 5
Participantes 3