Eu tenho o seguinte código:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Sei Thing
que não faz nada, mas meu programa Hello, World é compilado sem ele. São apenas minhas classes definidas que estão falhando comigo.
E ele se recusa a compilar. Eu chego No enclosing instance of type Hello is accessible."
na linha que cria uma nova coisa. Eu estou supondo:
- Tenho problemas no nível do sistema (no DrJava ou na minha instalação em Java) ou
- Eu tenho alguns mal-entendidos básicos de como construir um programa de trabalho em java.
Alguma ideia?
java
inner-classes
coolpapa
fonte
fonte
Respostas:
static class Thing
fará seu programa funcionar.Como é, você tem
Thing
uma classe interna, que (por definição) está associada a uma instância específica deHello
(mesmo que nunca a use ou se refira a ela), o que significa que é um erro dizernew Thing();
sem ter umaHello
instância específica em escopo.Se você a declarar como uma classe estática, é uma classe "aninhada", que não precisa de uma
Hello
instância específica .fonte
outer class
, onon-static inner class
seria criado também, mesmo que eu não o usasse em nenhum lugar?Você declarou a classe
Thing
como uma classe interna não estática. Isso significa que ele deve estar associado a uma instância daHello
classe.No seu código, você está tentando criar uma instância de
Thing
um contexto estático. É disso que o compilador está reclamando.Existem algumas soluções possíveis. Qual solução usar depende do que você deseja alcançar.
Saia
Thing
daHello
classe.Mude
Thing
para ser umastatic
classe aninhada.Crie uma instância de
Hello
antes de criar uma instância deThing
.A última solução (uma classe aninhada não estática ) seria obrigatória se qualquer instância
Thing
dependesse de uma instânciaHello
para ser significativa. Por exemplo, se tivéssemos:qualquer tentativa bruta de criar um objeto de classe
Thing
, como em:seria problemático, pois não haveria um
enormous
valor óbvio para testar 31 contra ele. Uma instânciah
daHello
classe externa é necessária para fornecer esteh.enormous
valor:Porque isso não significa a
Thing
se não tiver aHello
.Para obter mais informações sobre classes aninhadas / internas: Classes aninhadas (The Java Tutorials)
fonte
Thing thing1 <<HelloInstantiation>>.new Thing()
é a chave. Passei alguns minutos confusos usando a sintaxeThing thing1 new <<HelloInstantiation>>.Thing()
. = PBem ... tantas boas respostas, mas quero acrescentar mais. Uma breve olhada na classe Inner em Java - Java nos permite definir uma classe dentro de outra classe e poder aninhar classes dessa maneira tem algumas vantagens:
Pode ocultar (aumenta o encapsulamento) a classe de outras classes - especialmente relevante se a classe estiver sendo usada apenas pela classe em que está contida. Nesse caso, não há necessidade do mundo exterior saber sobre isso.
Isso pode tornar o código mais sustentável, pois as classes são logicamente agrupadas em torno de onde são necessárias.
A classe interna tem acesso às variáveis e métodos da instância de sua classe que contém.
Temos principalmente três tipos de
Inner Classes
Alguns dos pontos importantes a serem lembrados
Vamos tentar ver os conceitos acima praticamente_
Espero que isso ajude a todos. Por favor, consulte para mais
fonte
Thing
é uma classe interna com uma conexão automática a uma instância deHello
. Você recebe um erro de compilação porque não há nenhuma instânciaHello
para anexar. Você pode corrigi-lo mais facilmente alterando-o para uma classe aninhada estática que não possui conexão:fonte
Vamos entendê-lo com o seguinte exemplo simples. Isso acontece porque essa é a CLASSE INTERNA NÃO ESTÁTICA. Você deve precisar da instância da classe externa.
fonte