Почему this () не разрешен в методе void?

Я создаю класс A с помощью общедоступного метода void A (), который имеет this () в качестве первого оператора. Метод A (), очевидно, не является конструктором, но компилятор жалуется на то, что this () не является первым оператором некоторого конструктора, который, как я полагаю, неявно создается с помощью super () в качестве первого оператора. На какой конструктор и на что этот оператор () ссылается компилятор? Спасибо.

class A
{
    public void A(){this();}
}

Выход ошибка: вызов этого должен быть первым оператором в конструкторе public void A () {this ();} ^ 1 ошибка

Поскольку this() разрешен только в качестве первого оператора в конструкторе, а voidфункция не является конструктором. Вам нужен public A() {} - при использовании this() рекурсия будет бесконечной.

Elliott Frisch 02.06.2018 07:07

Спасибо за пояснение

Ada 02.06.2018 07:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
75
1

Ответы 1

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

          A(int x){
              this(); // Calling a no argument constructor of the same class
          }

Но это неверно, это вызывает ошибку компиляции, потому что это рекурсивный вызов конструктора.

          A(){
             this();
          }

Вы не можете использовать this() в методах.

Большое спасибо за объяснение. Просто сбивает с толку то, что компилятор обращается к общедоступному методу void A () как к конструктору. Сообщение об ошибке не отражает реальной проблемы, которую я предполагаю.

Ada 02.06.2018 07:27

Ты прав. Об этом можно было сообщить как об ошибке компилятора :-)

Stephen C 02.06.2018 08:40

Другие вопросы по теме