Como instanciar classe interna não estática dentro de um método estático?
Eu tenho o seguinte pedaço de código:
int s, e, p;
Até essa parte, o código é bom, mas não consigo instanciar 'in' dentro do método principal, como in = new Inner()ele está mostrando non static field cannot be referenced in static context.
Como posso fazer isso? Eu não quero fazer o meuInner classe estática .
java static inner-classes
— Victor Mukherjee
'Interior não estático' é uma tautologia.
Você também deve ter uma referência à outra classe externa.
Se Inner fosse estático, seria
— RNJ
Essa resposta acabou de mudar minha visão da vida. outer.new Inner ()? Nunca sequer considerou isso uma possibilidade. O_O
Para interior estático, você não pode simplesmente fazer Inner inner = new Inner ()?
— Pode Lu
@ Canan para criar um objeto para a classe aninhada estática, use OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass(). Classes aninhadas
— LittleLittleQ
Uma classe interna "regular" possui um ponteiro oculto (implícito) para uma instância de classe externa. Isso permite que o compilador gere o código para perseguir o ponteiro para você sem precisar digitá-lo. Por exemplo, se houver uma variável "a" na classe externa, o código na sua classe interna poderá fazer "a = 0", mas o compilador gerará código para "outerPointer.a = 0" mantendo o ponteiro oculto em As tampas.
Isso significa que, quando você cria uma instância de uma classe interna, é necessário ter uma instância de uma classe externa para vinculá-la. Se você criar essa criação dentro de um método da classe externa, o compilador saberá usar "this" como ponteiro implícito. Se você deseja vincular a outra instância externa, use uma sintaxe "nova" especial (consulte o trecho de código abaixo).
Se você tornar sua classe interna "estática", não haverá ponteiro oculto e sua classe interna não poderá referenciar membros da classe externa. Uma classe interna estática é idêntica a uma classe regular, mas seu nome é definido dentro do pai.
Aqui está um trecho de código que demonstra a sintaxe para criar classes internas estáticas e não estáticas:
//a = 0;  Can't do this ... no outer pointer
//MyClass parentPointer;      Hidden pointer to outer instance
//outerPointer.a = 0      The compiler generates this code
// The compiler knows that "this" is the outer reference to give
InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
MyClass outer = new MyClass();
InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
— ChrisCantrell
Se você deseja criar new Inner()de dentro de um método, faça-o a partir de um método de instância da classe MyClass:
Alexei Kaigorodov é a resposta certa. Sua solução permite instanciar classes internas a partir de um método estático, como main () da mesma classe. Caso contrário, você não poderá instanciar uma classe interna dentro de um método estático. Não compila. A solução de Alexei é compilada e permite instanciar classes internas a partir de um método estático. As outras respostas são notas secundárias interessantes, mas não as acho responsivas à pergunta real.
InnerClass sc = new InnerClass();//<---this is key
Example e = new Example();//<---so is this
e.demonstrate();//<---and this is also key
— Herbert Samuel Jennings III
Adendo: Você pode instanciar classes internas estáticas a partir de métodos estáticos. Esse tipo de código é necessário apenas para instanciar classes internas não estáticas de dentro de métodos estáticos.