Что касается ключевого слова Super?

Какая необходимость в том, чтобы JVM вызывала конструктор суперкласса?

public class Test1{
    public void dis()
    {
        System.out.println("In Test1");
    }
}

public class Test2 extends Test1{
    public void dis()
    {
        System.out.println("Inside test2");
        super.dis();
    }
}

Поскольку dis() является методом экземпляра, можно ли предположить, что super указывает на объект родительского класса, поскольку конструктор вызывается автоматически?


person Ullas    schedule 18.07.2013    source источник
comment
извините..System.out.println   -  person Ullas    schedule 18.07.2013
comment
Кстати, вы можете легко протестировать его, просто запустите файл main и запустите свою программу.   -  person Maroun    schedule 18.07.2013
comment
Конструктор суперкласса не участвует в опубликованном вами коде.   -  person Ted Hopp    schedule 18.07.2013
comment
проверьте это stackoverflow.com/questions/2632882/calling-super   -  person Ruchira Gayan Ranaweera    schedule 18.07.2013


Ответы (5)


Ключевое слово super не указывает на какой-то "объект родительского класса". Это квалификатор имени, поэтому вы можете ссылаться на метод, определенный в родительском классе для текущего объекта. Таким образом, в следующем:

public class Test2 extends Test1{
    public void dis()
    {
        System.out.println("Inside test2");
        super.dis();
    }
}

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

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

public class Test2 extends Test1{
    public Test2() {
        super(); // explicitly invokes parent class default constructor
        . . .
    }
}

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

person Ted Hopp    schedule 18.07.2013

Ключевое слово super полезно для:

  • Вызов реализации суперкласса метода, переопределенного в этом классе
  • Доступ к конструктору суперкласса из конструктора подкласса

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

Inside test2 
In Test1
person Óscar López    schedule 18.07.2013

можно ли предположить, что super указывает на объект родительского класса

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

так как конструктор вызывается автоматически?

Роль ключевого слова super не зависит от вызываемого конструктора суперкласса. Конструктор суперкласса всегда вызывается через цепочку конструкторов с использованием вызова super() либо без аргументов, либо с параметризованным конструктором.

Одно различие между цепочкой конструктора суперкласса и вызовом члена суперкласса заключается в следующем: «При цепочке конструкторов вызов super() должен быть первым оператором в конструкторе, в то время как вы можете вызывать метод суперкласса в любой точке вашего текущего метода».

person Rohit Jain    schedule 18.07.2013

Это не имеет ничего общего с конструкторами. Поскольку Test2 extends Test1 и dis() реализованы в обоих классах, super.dis() в подклассе вызовет dis() в суперклассе.

person Kayaman    schedule 18.07.2013

с помощью суперконструктора мы можем вызывать функции и переменные напрямую из
суперкласса в подкласс для


public class Test1{
 int a=5;
  } 
 public class Test2 extends Test1{
  int a=15;
  int c;
   c=a+super.a;
  System.out.println("value of c is:"+
  }
   result :value of c is:20
  you can call default constructor of super class by super() .
  if there is variables then you can call it by super(parameter_list).
person anand saini    schedule 18.07.2013