Разница между ключевыми словами "this" и "super" в Java - PullRequest
49 голосов
/ 26 октября 2010

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

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

Ответы [ 9 ]

70 голосов
/ 26 октября 2010

Давайте рассмотрим эту ситуацию

class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}

class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void anotherEat() {
    super.eat();
  }
}

public class Test {
  public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eat();
    d.anotherEat();
  }
}

Выход будет

animal : eat
dog : eat
animal : eat

Третья строка печатает "animal: eat", потому что мы звоним super.eat(). Если бы мы позвонили this.eat(), он выглядел бы как «собака: есть».

51 голосов
/ 26 октября 2010

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

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

19 голосов
/ 26 октября 2010

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

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

10 голосов
/ 26 октября 2010

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

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

против

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

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

  • this формирует цепочки для конструктора в текущем классе; то есть в классе A.

  • super формируют цепочки для конструктора в непосредственном суперклассе; то есть в B классе.

8 голосов
/ 26 октября 2010

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

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

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

5 голосов
/ 03 ноября 2017

супер () и это ()

  • super () - вызвать конструктор родительского класса.
  • this () - вызвать тот же конструктор класса.

Примечание:

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

  • Мы должны оставить либо super (), либо this () в качестве первой строки конструктор, но НЕ оба одновременно.

супер & это ключевое слово

  • super - для вызова членов родительского класса (переменных и методов).
  • this - вызывать одинаковые члены класса (переменные и методы).

ПРИМЕЧАНИЕ: Мы можем использовать их в любом месте класса, кроме статических областей (статический блок или метод), любого попытка сделать это приведет к ошибке во время компиляции.

3 голосов
/ 11 августа 2013

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

синтаксис : this (список аргументов); // совместим с списком аргументов в другом конструкторе того же класса

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

синтаксис: super (список аргументов); // совместим с списком аргументов в конструкторе суперкласса.

Ex:

public class Rect {
int x1, y1, x2, y2;

public Rect(int x1, int y1, int x2, int y2) // 1st constructor 
{ ....//code to build a rectangle }
}

public Rect () {   // 2nd constructor
this (0,0,width,height) // call 1st constructor (because it has **4 int args**), this is another way to build a rectangle 
}


public class DrawableRect extends Rect {

public DrawableRect (int a1, int b1, int a2, int b2) {
super (a1,b1,a2,b2) // call super class constructor (Rect class) 
}
}
3 голосов
/ 26 октября 2010

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

MyClass()
{
   this(default1, default2);
}

MyClass(arg1, arg2)
{
   validate arguments, etc...
   note that your validation logic is only written once now
}

Что касается конструктора super(), опять же, в отличие от доступа super.method(), это должна быть первая строка вашего конструктора.После этого он очень похож на конструкторы this(), DRY (не повторяйте себя), если расширяемый класс имеет конструктор, который делает то, что вы хотите, затем используйте его и затем продолжайте конструировать ваш объект, например:

YourClass extends MyClass
{
   YourClass(arg1, arg2, arg3)
   {
      super(arg1, arg2) // calls MyClass(arg1, arg2)
      validate and process arg3...
   }
}

Дополнительная информация:

Даже если вы этого не видите, конструктор по умолчанию без аргументов всегда сначала вызывает super().Пример:

MyClass()
{
}

эквивалентен

MyClass()
{
   super();
}

Я вижу, что многие упоминали использование ключевых слов this и super для методов и переменных - все хорошо.Просто помните, что у конструкторов есть уникальные ограничения на их использование, наиболее примечательным является то, что они должны быть самой первой инструкцией объявленного конструктора, и вы можете использовать только один.

3 голосов
/ 26 октября 2010

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

super разрешает доступ к не приватным методам и полям в суперклассе и доступ к конструкторам только из конструкторов класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...