2010-05-21 3 views
5

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

+1

надеюсь, что я смогу переложить его на ... – abson

ответ

7

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

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

Ключевое слово 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 

спецификация также ставит restrictions on how super can be used:

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

+0

+1 для упоминания про передачу этого аргумента и того же, что не применимо для супер – Sandeep

1

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

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

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

-1

Согласно Wikipedia, this и super ключевым словам, которые, как они уходят со всей своей магией, я полагаю.

+0

Согласно [JLS] (http://docs.oracle.com/ javase/specs/jls/se8/html/jls-3.html # jls-3.9), они являются ключевыми словами. Википедия не является нормативной ссылкой. – EJP

3

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

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

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

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

+0

есть ли какое-нибудь кодирование под супер и это для такого поведения? – abson

+1

@abson Он закодирован, но не вами. Это часть JVM, я полагаю, или, может быть, компилятор. Вы должны рассматривать это и супер так же, как + и -, компилятор просто знает, что с ними. – extraneon

1

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

public class MyException extends Exception {  
public MyException() 
{ 

} 

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

public MyException(String string, Throwable e) 
{ 
    super(string, e); 
} 
} 
0

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

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

0

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

Смежные вопросы