Использование extends в Java дает ошибку включения экземпляра - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь использовать extends (наследование) в Java. Я сделал быстрый абстрактный класс для расширения, а затем расширил его. Однако моя IDE сейчас говорит, что «требуется включающий экземпляр, который содержит abstract_class», и дает моему конструктору для производных классов большие строки ошибок. О чем это вообще происходит? Абстрактный класс не имеет или не нуждается ни в каком конструкторе.

Просто для справки, я использую расширения, а не реализации частично, потому что детали реализации, которые я не хочу сохранять для каждого производного класса, которые идентичны, включают использование отражения этого.

Редактировать: я прочитал некоторые ответы. Что, во имя Бога, является статическим (или нестатичным, если на то пошло) классом? И просто раздражать всех вас, это не решило проблему.

// some_class.java
public class some_class {
    public static abstract class abstract_class {
        ...
    }
    ...
}

// Model.java
public class Model extends some_class.abstract_class {
    public Model(...) {
        // No enclosing instance! Critical error.
        ...
    }
    ...
}

И я подумал, что заголовочные файлы C ++ были плохими.

Ответы [ 5 ]

2 голосов
/ 29 июля 2010

Код, который вы разместили, кажется, прекрасно для меня.Попробуйте сделать чистую сборку в вашей IDE, и она должна работать.

Просто для вашего собственного интереса, в Java есть 2 типа внутренних классов: static и обычный или (non-static).Если вы не включите ключевое слово static для определения внутреннего класса, это означает, что для экземпляра этого класса всегда будет требоваться экземпляр родительского класса.Например:

public class MyClassOuter {
    //...
    public class MyClassInner {
        //..
    }
}

Если вы напишите это, подразумевается, что любой экземпляр MyClassInner будет иметь неявную ссылку на экземпляр MyClassOuter.

Static нас другой стороны, рука не подразумевает такой вещи.Это просто определение класса, которое оказывается внутри другого определения класса.Внешний класс используется почти как пакет (хотя и не совсем).

2 голосов
/ 29 июля 2010

если у вас есть

interface MyInterface
{

   abstract class MyAbstractClass {
     // ...
   }
}

и затем вы пытаетесь

class ConcreteClass extends MyAbstractClass {

}

Вы получите описанную ошибку. Исправление заключается в том, чтобы либо переместить MyAbstractClass в класс верхнего уровня (поместить его в свой собственный файл - это не является строго обязательным для непубличных классов, но сохраняет организованный код.) В качестве альтернативы добавьте модификатор static в объявление MyAbstractClass.

0 голосов
/ 04 апреля 2013

класс A {

 .
 .
 .


 class B{
      . . .     
 }

}

если вы хотите получить доступ к классу B, и если это не статический внутренний класс, вы можете написать код как

AB objOfB = новый A ().новый B ();

0 голосов
/ 29 июля 2010

Вам нужно добавить в свой дочерний класс конструктор super (), чтобы можно было создать супер класс.

0 голосов
/ 29 июля 2010

Сообщение «включающий экземпляр» почти наверняка подразумевает, что у вас есть (нестатический) внутренний класс для вашего суперкласса.В большинстве случаев внутренние классы могут и должны быть статичными - это, вероятно, лучший обходной путь.В качестве альтернативы, как говорится в сообщении, вам потребуется использовать включающий экземпляр «внешнего» класса, если ваш родитель действительно имеет смысл как нестатический внутренний класс.

Размещение некоторого кода поможет устранить неоднозначность между этимипричины и предложить лучший способ ее устранения.Я также смогу привести примеры разрешений с правильными именами классов - в настоящее время я не думаю, что произвольные имена помогут так сильно, как кажется, вы не определили проблему внутреннего / внешнего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...