это и супер в Java - PullRequest
       2

это и супер в Java

6 голосов
/ 21 мая 2010

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

Ответы [ 7 ]

8 голосов
/ 21 мая 2010

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

В соответствии со спецификацией this может использоваться первичное выражение (только в определенных местах) или явный вызов конструктора .

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

Таким образом, вы можете использовать this в качестве аргумента функции для передачи ссылки на текущий объект. Однако обратите внимание, что вы не можете использовать super так же, как это не является основным выражением:

public class Program
{   
    void test(Program p) {}

    void run() { test(super); }

    public static void main(String[] args)
    {
        new Program().run();
    }
}

Результат:

Program.java:5: '.' expected
    void run() { test(super); }

Вы можете использовать super.foo, хотя, потому что это определено в 15.11 , чтобы быть действительным:

FieldAccess:
    Primary . Identifier
    super . Identifier
    ClassName .super . Identifier

Спецификация также устанавливает ограничения на использование super * :

Специальные формы, использующие ключевое слово super, действительны только в методе экземпляра, инициализаторе экземпляра или конструкторе или в инициализаторе переменной экземпляра класса; это точно такие же ситуации, в которых ключевое слово может использоваться (§15.8.3).

3 голосов
/ 21 мая 2010

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

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

Java обеспечивает специальную обработку для них, потому что их привязка отличается от привязки обычных методов (т. Е. Вы хотите избежать динамического вызова или вам никогда не удастся получить конструктор для супертипа).

Каждый язык имеет дело с этой проблемой. Например, в C ++ вы явно указываете имя родительского метода вместо использования super.

1 голос
/ 21 мая 2010

Из вашего подкласса вы можете передать переменные, предоставленные вашему родителю. Примеры лучше, чем длинные объяснения, поэтому вот довольно общий пример расширения класса исключений для вашего собственного использования:

public class MyException extends Exception {    
public MyException()
{

}

public MyException(String message)
{
    super(message);
}

public MyException(String string, Throwable e) 
{
    super(string, e);
} 
} 
1 голос
/ 21 мая 2010

Я не совсем уверен, что вы спрашиваете здесь, но именно так устроен язык. Компилятор знает, что когда вы делаете это в конструкторе:

super("I'm a string!", 32);

он должен найти конструктор в суперклассе, который принимает String и int в качестве параметров.

0 голосов
/ 22 мая 2010

Я не уверен, в чем тут сомнение. Это this относится к ссылке на текущий экземпляр, также при вызове, как this(arg), оно вызывает соответствующий constructor в текущем class. Аналогичным образом, когда вызывается super(), он вызывает соответствующий constructor в классе super. Их можно вызвать только с номера constructor.

0 голосов
/ 22 мая 2010

как получается, что они могут показывать такие отличное поведение

Вопрос не имеет смысла. Все ключевые слова имеют различное поведение. Вот для чего они.

0 голосов
/ 21 мая 2010

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

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