2013-04-24 11 views
-2

так:В чем разница между super и super() в java?

public class class1 { 
    public void xxx(){ 

     super.getXXX(); 

     super().getXXX(); 

    } 
} 
+4

Один супер, а другой супер-пупер. Серьезно, хотя это компилируется? Почему бы не написать * реальный * код в своем вопросе? Код, который прост, но на самом деле компилирует и демонстрирует то, что вы просите? –

+2

@HovercraftFullOfEels Вы можете быть пупером в этом случае ...? http://en.wiktionary.org/wiki/duper «человек, который обманывает другого» – gutch

+1

@gutch: вы можете быть на этом. –

ответ

4

Оба используются в подклассе в качестве способа вызова или ссылки на его суперкласс.

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

Обратите внимание: поскольку все классы по умолчанию, по крайней мере, наследуют от Object, вы всегда можете вызвать super() внутри конструктора (хотя он должен быть первым утверждением в конструкторе). Этот вызов super() фактически обычно вставляется компилятором в ваш конструктор no-arg по умолчанию.

Это может быть сложно, однако, если суперкласс не имеет конструктора no-arg, но в этом случае ваш вызов super() завершится с ошибкой без соответствующих аргументов. Конструктор no-arg обычно генерируется по умолчанию, поэтому вам не нужно беспокоиться об этом, но он не будет автоматически сгенерирован, если вы явно определяете другой конструктор с args, так что вам может понадобиться явно определить один самостоятельно.

super без парнеров, с другой стороны, просто ссылка на сам суперкласс, как и любая другая переменная. Его можно использовать для вызова любого доступного метода в этом классе или для ссылки на любое из доступных полей класса, как и с любой другой ссылкой. Например: super.doSomething() или super.x

5

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

super() является конструктором суперкласса. Когда вы переопределяете конструктор в подклассе, вам нужно позвонить super(), прежде чем вы сможете выполнить свою собственную логику, а если вы этого не сделаете, компилятор от вашего имени добавит вызов конструктору no-args. (Иногда, нет, и код не скомпилирован)

В то время как в Java вызов конструктора дает вам экземпляр класса, это не то же самое, когда вы делаете super(), потому что там не является отдельным экземпляром создания суперкласса, созданного, когда вы делаете super(). Следовательно, в то время как MyClass().doSomething() является вполне допустимым вызовом, super().doSomethingElse() нет.

+0

Я проголосовал за это как правильный ответ. Я не уверен, кто или почему кто-то проголосовал. –

+0

* «... вам нужно позвонить super() ...» * - Да и нет. Должен быть вызов конструктора суперкласса, но он * может быть * неявным ... если в суперклассе есть явный или неявный конструктор no-args. –

+0

@StephenC позаботился. Спасибо за указание. –

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