2013-07-11 4 views
2

Я немного смущены этим кодом:super() в Java. Что это значит?

class A{ 
    class B{ 
    } 
} 

class C extends A.B{ 
    C(A a){ 
     a.super(); 
    } 
} 

Что значит: "a.super();" ? Прежде чем я подумал, что супер-ссылка на ее родительский класс, но «супер()» - ссылка на конструктор родителя, но на самом деле класс А не имеет родительского класса (не обращайте внимание на Object ...), так что это значит супер в этом контексте?

Thx everyone.

ответ

3

Это квалифицированный вызов конструктора суперкласса.

Из Явных заявлений Призыва конструктора JLS 1.8

можно разделить на два вида:

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

  2. Вызовы конструктора суперкласса начинаются либо с ключевого слова super (возможно, предваряемого явным аргументом типа), либо из первичного выражения. Они используются для вызова конструктора прямого суперкласса. Вызовы конструктора суперкласса могут быть дополнительно разделены:

  3. Вызовы конструктора неквалифицированного суперкласса начинаются с ключевого слова super (возможно, предваряется явным аргументом типа).

  4. Квалифицированные вызовы конструктора суперкласса начинаются с первичного выражения. Они позволяют конструктору подкласса явно указывать непосредственно входящий экземпляр вновь созданного объекта в отношении прямого суперкласса (§8.1.3). Это может быть необходимо, когда суперкласс является внутренним классом.

5

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

+0

Нет, это неправильно. Я тоже думал. Но, фактически, 'a.super()' = 'A.B()', поэтому конструктор класса B. Я нашел его здесь: http://stackoverflow.com/a/2831567/2572927 И я нашел один процентный момент: 'класса А { класс B { B (String s) {Print (ы); } } } класс C расширяет AB { C (A a) { a.super («конструктор C!»); } } ' Это нормальная работа, поэтому 'a.super()' = 'A.B()'. Я так думаю, я надеюсь, что это правда =) –

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