так:В чем разница между super и super() в java?
public class class1 {
public void xxx(){
super.getXXX();
super().getXXX();
}
}
так:В чем разница между super и super() в java?
public class class1 {
public void xxx(){
super.getXXX();
super().getXXX();
}
}
Оба используются в подклассе в качестве способа вызова или ссылки на его суперкласс.
- вызов метода, который вы создаете внутри конструктора или внутри переопределенного метода для вызова конструктора суперкласса или переопределенного метода суперкласса. В этом случае вызов super() также может принимать аргументы.
Обратите внимание: поскольку все классы по умолчанию, по крайней мере, наследуют от Object, вы всегда можете вызвать super() внутри конструктора (хотя он должен быть первым утверждением в конструкторе). Этот вызов super() фактически обычно вставляется компилятором в ваш конструктор no-arg по умолчанию.
Это может быть сложно, однако, если суперкласс не имеет конструктора no-arg, но в этом случае ваш вызов super() завершится с ошибкой без соответствующих аргументов. Конструктор no-arg обычно генерируется по умолчанию, поэтому вам не нужно беспокоиться об этом, но он не будет автоматически сгенерирован, если вы явно определяете другой конструктор с args, так что вам может понадобиться явно определить один самостоятельно.
super
без парнеров, с другой стороны, просто ссылка на сам суперкласс, как и любая другая переменная. Его можно использовать для вызова любого доступного метода в этом классе или для ссылки на любое из доступных полей класса, как и с любой другой ссылкой. Например: super.doSomething()
или super.x
Каждый класс в Java имеет суперкласса. Когда вы используете ключевое слово super
, вы имеете в виду суперкласс, а оператор точки на super
предоставит вам доступ к свойствам и методам Суперкласса.
super()
является конструктором суперкласса. Когда вы переопределяете конструктор в подклассе, вам нужно позвонить super()
, прежде чем вы сможете выполнить свою собственную логику, а если вы этого не сделаете, компилятор от вашего имени добавит вызов конструктору no-args. (Иногда, нет, и код не скомпилирован)
В то время как в Java вызов конструктора дает вам экземпляр класса, это не то же самое, когда вы делаете super()
, потому что там не является отдельным экземпляром создания суперкласса, созданного, когда вы делаете super()
. Следовательно, в то время как MyClass().doSomething()
является вполне допустимым вызовом, super().doSomethingElse()
нет.
Я проголосовал за это как правильный ответ. Я не уверен, кто или почему кто-то проголосовал. –
* «... вам нужно позвонить super() ...» * - Да и нет. Должен быть вызов конструктора суперкласса, но он * может быть * неявным ... если в суперклассе есть явный или неявный конструктор no-args. –
@StephenC позаботился. Спасибо за указание. –
Один супер, а другой супер-пупер. Серьезно, хотя это компилируется? Почему бы не написать * реальный * код в своем вопросе? Код, который прост, но на самом деле компилирует и демонстрирует то, что вы просите? –
@HovercraftFullOfEels Вы можете быть пупером в этом случае ...? http://en.wiktionary.org/wiki/duper «человек, который обманывает другого» – gutch
@gutch: вы можете быть на этом. –