Java. Нет доступных экземпляров типа Foo.
У меня есть следующий код:
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!");
}
}
Я знаю, что Thing
ничего не делает, но моя программа Hello, World компилируется без штрафа. Это только мои определенные классы, которые терпят неудачу на мне.
И он отказывается компилировать. Я получаю No enclosing instance of type Hello is accessible."
в строке, которая создает новую вещь. Я также предполагаю:
- У меня проблемы с системным уровнем (либо в DrJava, либо в моей Java-установке), либо
- У меня есть некоторые основные недоразумения о том, как создать рабочую программу в java.
Любые идеи?
Ответы
Ответ 1
static class Thing
сделает вашу программу работать.
Как бы то ни было, у вас есть Thing
как внутренний класс, который (по определению) связан с конкретным экземпляром Hello
(даже если он никогда не использует или не ссылается на него), что означает, что он чтобы сказать new Thing();
, не имея конкретного экземпляра Hello
в области видимости.
Если вместо этого вы объявите его как статический класс, тогда это "вложенный" класс, который не нуждается в конкретном экземпляре Hello
.
Ответ 2
Вы объявили класс Thing нестационарным внутренним классом. Это означает, что он должен быть связан с экземпляром класса Hello.
В вашем коде вы пытаетесь создать экземпляр Thing из статического контекста. Это то, о чем компилятор жалуется.
Существует несколько возможных решений. Какое решение использовать зависит от того, чего вы хотите достичь.
-
Измените Thing как статический вложенный класс.
static class Thing
-
Создайте экземпляр Hello, затем создайте экземпляр Thing.
public static void main(String[] args)
{
Hello h = new Hello();
Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P
}
-
Переместить Thing из класса Hello.
Для получения дополнительной информации о вложенных/внутренних классах:
Вложенные классы (Учебники Java)
Ответ 3
Ну... так много хороших ответов, но я хочу добавить к нему больше. Краткий взгляд на класс Inner в Java-Java позволяет нам определить класс внутри другого класса и
Способность гнездовать классы таким образом имеет определенные преимущества:
-
Он может скрыть (он увеличивает инкапсуляцию) класс из других классов - особенно актуально, если класс используется только классом, в котором он содержится. В этом случае нет необходимости, чтобы внешний мир знал об этом.
-
Он может сделать код более удобным для обслуживания, поскольку классы логически сгруппированы вместе там, где они необходимы.
-
Внутренний класс имеет доступ к переменным экземпляра и методам его содержащего класса.
В основном мы имеем три типа Inner Classes
- Локальный внутренний
- Статический внутренний класс
- Анонимный внутренний класс
Некоторые важные моменты, которые нужно запомнить
- Нам нужен объект класса для доступа к локальному внутреннему классу, в котором он существует.
- Статический внутренний класс получает доступ напрямую, как и любой другой статический метод того же класса, в котором он существует.
- Анонимный внутренний класс не отображается вне стороннего мира, а также другим методам или классам того же класса (в котором он существует), и он используется в точке, где он объявлен.
Попробуем увидеть приведенные выше понятия практически _
public class MyInnerClass {
public static void main(String args[]) throws InterruptedException {
// direct access to inner class method
new MyInnerClass.StaticInnerClass().staticInnerClassMethod();
// static inner class reference object
StaticInnerClass staticInnerclass = new StaticInnerClass();
staticInnerclass.staticInnerClassMethod();
// access local inner class
LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass();
localInnerClass.localInnerClassMethod();
/*
* Pay attention to the opening curly braces and the fact that there a
* semicolon at the very end, once the anonymous class is created:
*/
/*
AnonymousClass anonymousClass = new AnonymousClass() {
// your code goes here...
};*/
}
// static inner class
static class StaticInnerClass {
public void staticInnerClassMethod() {
System.out.println("Hay... from Static Inner class!");
}
}
// local inner class
class LocalInnerClass {
public void localInnerClassMethod() {
System.out.println("Hay... from local Inner class!");
}
}
}
Надеюсь, это поможет всем. Пожалуйста, обратитесь к более
Ответ 4
Давайте рассмотрим следующий простой пример.
Это происходит потому, что это НЕСТАТИЧЕСКИЙ ИНТЕРНЕТ-КЛАСС. Вам понадобится экземпляр внешнего класса.
public class PQ {
public static void main(String[] args) {
// create dog object here
Dog dog = new PQ().new Dog();
//OR
PQ pq = new PQ();
Dog dog1 = pq.new Dog();
}
abstract class Animal {
abstract void checkup();
}
class Dog extends Animal {
@Override
void checkup() {
System.out.println("Dog checkup");
}
}
class Cat extends Animal {
@Override
void checkup() {
System.out.println("Cat Checkup");
}
}
}
Ответ 5
Thing
является внутренним классом с автоматическим подключением к экземпляру Hello
. Вы получаете ошибку компиляции, потому что для нее нет экземпляра Hello
. Вы можете исправить это наиболее легко, изменив его на статический вложенный класс, который не имеет связи:
static class Thing
Ответ 6
помогите мне, если я хочу избавиться от этого без использования статического слова.