0

Разница между ключевыми словами "this" и "super" в Java

9

В чем разница между ключевыми словами this и super?

Оба используются для доступа к конструкторам классов, верно? Можете объяснить, как они различаются и в каких ситуациях следует использовать каждое из них?

5 ответ(ов)

0

Давайте рассмотрим представленную ситуацию.

В вашем коде у вас есть класс Animal с методом eat(), который выводит строку "animal : eat". Затем у вас есть класс Dog, который наследует от Animal и переопределяет метод eat(), выводя "dog : eat". В классе Dog также есть метод anotherEat(), который вызывает super.eat(), то есть метод родительского класса Animal.

Когда вы выполняете код в методе main, происходит следующее:

  1. Создается объект Animal, и вызывается метод a.eat(), который выводит "animal : eat".
  2. Далее создается объект Dog, и при вызове d.eat() выполняется переопределенный метод этого класса, который выводит "dog : eat".
  3. Затем вызывается метод d.anotherEat(), который вызывает super.eat(). Поскольку super.eat() ссылается на метод родительского класса Animal, он выводит "animal : eat".

Если бы вместо super.eat() вы использовали this.eat(), то при этом вызвался бы переопределенный метод eat() из класса Dog, и вывод было бы "dog : eat".

Таким образом, вывод программы будет следующим:

animal : eat
dog : eat
animal : eat

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

0

super используется для доступа к методам базового класса, тогда как this предназначен для доступа к методам текущего класса.

Расширяя это понятие, если вы пишете super(), это относится к конструктору базового класса, а если вы пишете this(), это относится к конструктору того класса, в котором вы пишете этот код.

0

this — это ссылка на объект, типизированный текущим классом, а super — ссылка на объект, типизированный классом-родителем.

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

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

0

Из вашего вопроса я понимаю, что вы на самом деле спрашиваете о том, как использовать this и super в цепочке конструкторов; например:

public class A extends B {
    public A(...) {
        this(...);
        ...
    }
}

в отличие от

public class A extends B {
    public A(...) {
        super(...);
        ...
    }
}

Разница здесь проста:

  • Форма с this вызывает конструктор в текущем классе, т.е. в классе A.
  • Форма с super вызывает конструктор в непосредственном суперклассе, т.е. в классе B.
0

this ссылается на текущий экземпляр класса.

super ссылается на родительский класс текущего класса (в котором используется ключевое слово super).

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

super позволяет получить доступ к публичным и защищённым методам и атрибутам родительского (базового) класса. Доступ к закрытым методам и атрибутам родительского класса невозможен.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь