Сбой компиляции при использовании супер в конкатенации строк - PullRequest
0 голосов
/ 01 мая 2019

У меня есть следующий класс, который не компилируется:

public class C {
    public String toString() {
        return "Test " + super;
    }
}

Это дает ошибку компиляции Syntax error on token "super", invalid Expression.

Кто-нибудь знает, почему происходит эта ошибка компилятора?Предполагаемый эффект будет "Test " + super.toString(), что прекрасно компилируется, но почему приведенный выше пример не компилируется?Разве здесь не должны применяться нормальные правила Java для конкатенации строк?

Еще более удивительно, что следующий код прекрасно компилируется:

public String toString2() {
    return "Test " + this;
}

Так почему this работает в конкатенации строк, тогда как super нет?

Я использую openjdk 11.0.3 2019-04-16, на всякий случай, если это имеет значение (в чем я сомневаюсь).

Ответы [ 4 ]

2 голосов
/ 01 мая 2019

Ключевое слово super в Java не является ссылкой на объект , и поэтому вы получаете некоторые ошибки в своем коде!Это не очень хорошая практика, потому что super является ключевым словом для обнаружения родительского класса .Таким образом, вы не можете печатать, используя это ключевое слово!

Согласно спецификации Java:

Формы, использующие ключевое слово super, допустимы только в методе экземпляра, инициализаторе экземпляра или конструкторе,или в инициализаторе переменной экземпляра класса.Если они появляются где-то еще, происходит ошибка времени компиляции.

2 голосов
/ 01 мая 2019

super использования:

  1. Инструкция super() используется для вызова родительского конструктора и может быть вызван только из конструктора ребенка. Это также должно быть первое утверждение в конструкторе ребенка.
  2. super.instance_variable
  3. super.instance_method

Например:

class Animal {
    String name;
    Animal() { }

    String myName() {
        return name;
    }
}

class Dog extends Animal {

    Dog() {
        super();
    }

    public String toString() {
        return "Test " + super.myName() + super.name;
    }
}

Автономное использование для отсутствует * просто super. this относится к текущему объекту и может быть вызван сам по себе.

1 голос
/ 01 мая 2019

Ключевое слово super само по себе не является допустимым выражением Java. Суть ответа в том, что super просто не используется таким образом в Java.

Следующие типы выражений являются производными грамматики Java, включая super, ни одно из которых не представляет super само по себе:

  • Выражения доступа к полю

    • super . Identifier Эта форма позволяет получить доступ к членам суперкласса.

    • TypeName . super . Identifier Эта форма позволяет получить доступ к членам суперкласса включающего класса.

  • Выражения вызова метода

    • super . Identifier ( [ArgumentList] ) Эта форма вызывает метод суперкласса.

    • TypeName . super . Identifier ( [ArgumentList] ) Эта форма вызывает либо метод суперинтерфейса, либо метод суперкласса во включающем классе, в зависимости от того, является ли TypeName именем класса или именем интерфейса.

  • Выражения справочных методов

    • super :: Identifier

    • TypeName . super :: [TypeArguments] Identifier

Напротив, this само по себе является выражением, поскольку ему разрешено формировать первичное выражение . Ключевое слово super само по себе отсутствует в этом списке произведений или в подпроизводствах. Думайте о «первичном» как о базовом строительном элементе выражения.

Первичная:

PrimaryNoNewArray

ArrayCreationExpression

PrimaryNoNewArray:

Буквально

ClassLiteral

this

TypeName. this

( Выражение )

ClassInstanceCreationExpression

FieldAccess

ArrayAccess

MethodInvocation

MethodReference

Ключевое слово this работает в выражении, потому что это Primary, который может участвовать в больших, более сложных выражениях с участием операторов, таких как +.

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

1 голос
/ 01 мая 2019

Простой: «супер» не может быть использован таким образом.

Это ключевое слово может использоваться либо для вызова супер-конструктора, либо для ссылки на супер-метод / поле. Но он не может стоять "все по своему".

Так как нет "супер" объекта. Вы можете использовать «this» для ссылки на объект «this», но так как нет «автономного» суперобъекта. Таким образом, язык не позволяет вам использовать «супер» так, как вы можете использовать «это».

...