Pergunta

Esta pergunta já tem uma resposta aqui:

Qual é a diferença entre a estática e não-classe aninhada estática?

Foi útil?

Solução

Uma classe interna, por definição, não pode ser estático, então vou reformular sua pergunta como "Qual é a diferença entre classes aninhadas estáticas e não estáticas?"

Uma classe aninhada não estática tem acesso total aos membros da classe dentro dos quais está aninhado. Uma classe aninhada estática não tem referência a uma instância de nidificação; portanto, uma classe aninhada estática não pode invocar métodos não estáticos ou acessar campos não estáticos de uma instância da classe na qual está aninhada.

Outras dicas

Vamos procurar na fonte de sabedoria essas perguntas: Java de Joshua Bloch:

Tecnicamente, não existe uma classe interna estática. De acordo com Java eficaz, a terminologia correta é uma classe aninhada estática. Uma classe aninhada não estática é de fato uma classe interna, juntamente com aulas anônimas e aulas locais.

E agora para citar:

Cada instância de um não estático aninhado A classe está implicitamente associada a um Instância anexando de sua classe contendo ... é possível invocar métodos na instância de anexo.

Uma classe aninhada estática não tem acesso à instância de anexo. Ele também usa menos espaço.

Existem duas diferenças entre classes internas estáticas e não estáticas.

  1. No caso de declarar campos e métodos de membros, a classe interna não estática não pode ter campos e métodos estáticos. Mas, em caso de classe interna estática, pode ter campos e métodos estáticos e não estáticos.

  2. A instância da classe interna não estática é criada com a referência do objeto da classe externa, na qual definiu, isso significa que possui uma instância em anexo. Mas a instância da classe interna estática é criada sem a referência da classe externa, o que significa que ela não possui instância de envolvimento.

Veja este exemplo

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}
  1. A classe interna estática não pode acessar membros não estáticos da classe de anexo. Ele pode acessar diretamente os membros estáticos (campo e os métodos da instância) de anexar a classe Mesmo com o estilo processual de obter valor sem criar objeto.

  2. A classe interna estática pode declarar membros estáticos e não estáticos. Os métodos estáticos têm acesso a membros estáticos da classe principal. No entanto, ele não pode acessar membros não estáticos da classe interna. Para acessar os membros da classe interna não estática, ele precisa criar objeto de classe interna não estática.

  3. A classe interna não estática não pode declarar métodos estáticos e de campo estático. Ele deve ser declarado em tipos estáticos ou de nível superior. Você receberá esse erro ao dizer isso dizendo "os campos estáticos só serão declarados em tipos estáticos ou de nível superior".

  4. A classe interna não estática pode acessar membros estáticos e não estáticos da classe de anexo em estilo processual de obter valor, mas não pode acessar os membros da classe interna estática.

  5. A classe anexante não pode acessar os membros de classes internas até criar um objeto de classes internas. Se a classe principal no acesso a membros da classe não estática, poderá criar um objeto de classe interna não estática.

  6. Se a classe principal no acesso a membros da classe interna estática, ele possui dois casos:

    • Caso 1: Para membros estáticos, ele pode usar o nome da classe da classe interna estática
    • Caso 2: Para membros não estáticos, ele pode criar uma instância da classe interna estática.

Discussão aninhado as classes...

A diferença é que uma classe aninhada declaração de que é também a estática pode ser instanciado fora da classe envolvente.

Quando você tem uma classe aninhada declaração de que é não estático, Java não permite instanciar exceto através da classe envolvente.O objeto criado a partir da classe interna é ligado ao objeto criado a partir do exterior de classe para a classe interna pode fazer referência a campos do exterior.

Mas se é estática, e , em seguida, o link não existe, o exterior de campos não pode ser acessado (exceto via ordinária referência, como qualquer outro objeto) e, portanto, podem instanciar a classe aninhada por si só.

Classe interna estática: pode declarar membros estáticos e não estáticos, mas só pode acessar membros estáticos da aula de seus pais.

Classe interna não estática: pode declarar apenas membros não estáticos, mas pode acessar o membro estático e não estático de sua classe pai.

Uma classe interna não pode ser estática, então vou reformular sua pergunta como "qual é a diferença entre classes aninhadas estáticas e não estáticas?".

Como você disse aqui, a classe interna não pode ser estática ... Encontrei o código abaixo que está sendo dado estático ... Razão? ou o que está correto ....

Sim, não há nada na semântica de um tipo estático aninhado que o impeça de fazer isso. Este trecho funciona bem.

    public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

Este é um código postado neste site ...

Para a pergunta ---> Uma classe aninhada estática pode ser instanciada várias vezes?

a resposta foi --->

Agora, é claro, o tipo aninhado pode fazer seu próprio controle de instância (por exemplo, construtores privados, padrão de singleton, etc.), mas isso não tem nada a ver com o fato de ser um tipo aninhado. Além disso, se o tipo aninhado for uma enumeração estática, é claro que você não pode instanciá -lo.

Mas, em geral, sim, um tipo aninhado estático pode ser instanciado várias vezes.

Observe que tecnicamente, um tipo aninhado estático não é do tipo "interno".

Uma classe aninhada estática interage com os membros da instância de sua classe externa (e outras classes), como qualquer outra classe de nível superior. Com efeito, uma classe aninhada estática é comportamentalmente uma classe de nível superior que foi aninhada em outra classe de nível superior para a conveniência da embalagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top