супер () в Java - PullRequest
       68

супер () в Java

210 голосов
/ 22 сентября 2010

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

Ответы [ 15 ]

250 голосов
/ 22 сентября 2010

super() вызывает родительский конструктор без аргументов.

Может использоваться также с аргументами. То есть super(argument1) и вызовет конструктор, который принимает 1 параметр типа argument1 (если существует).

Также его можно использовать для вызова методов родителя. То есть super.aMethod()

Дополнительная информация и учебное пособие здесь

149 голосов
/ 22 сентября 2010

Некоторые факты:

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

Хорошо, теперь давайте практически реализуем эти пункты super().

Проверьте разницу между программой 1 и 2. Здесь программа 2 подтверждает наше первое утверждение super() в Java.

Программа 1

class Base
{
    int a = 100;
}

class Sup1 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup1().Show();
    }
}

Вывод:

200
200

Теперь проверьте программу 2 и попытайтесь выяснить основное отличие.

Программа 2

class Base
{
    int a = 100;
}

class Sup2 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(super.a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup2().Show();
    }
}

Выход:

100
200

В программе 1 вывод был только производного класса. Не удалось вывести переменную ни базового класса, ни родительского класса. Но в программе 2 мы использовали super() с переменной a при печати ее вывода, и вместо вывода значения переменной a производного класса, она напечатала значение переменной a базового класса. Таким образом, это доказывает, что super() используется для вызова непосредственного родителя.

ОК, теперь проверьте разницу между программой 3 и программой 4.

Программа 3

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup3 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup3().Show();
    }
}

Выход:

200

Здесь вывод равен 200. Когда мы вызвали Show(), была вызвана функция Show() производного класса. Но что нам делать, если мы хотим вызвать функцию Show() родительского класса? Проверьте программу 4 для решения.

Программа 4

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup4 extends Base
{
    int a = 200;
    void Show()
    {
        super.Show();
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup4().Show();
    }
}

Выход:

100
200

Здесь мы получаем два выхода, 100 и 200. Когда вызывается функция Show() производного класса, она сначала вызывает функцию Show() родительского класса, потому что внутри функции Show() производного класс, мы вызвали функцию Show() родительского класса, поместив ключевое слово super перед именем функции.

34 голосов
/ 22 сентября 2010

Да. super(...) вызовет конструктор суперкласса.

Посмотрите на этот пример:

class Animal {
    public Animal(String arg) {
        System.out.println("Constructing an animal: " + arg);
    }
}

class Dog extends Animal {
    public Dog() {
        super("From Dog constructor");
        System.out.println("Constructing a dog.");
    }
}

public class Test {
    public static void main(String[] a) {
        new Dog();
    }
}

Печать:

Constructing an animal: From Dog constructor
Constructing a dog.
28 голосов
/ 22 сентября 2010

Используется ли super () для вызова родительского конструктора?

Да.

Просьба объяснить про Super ().

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

Вот официальное руководство

5 голосов
/ 11 декабря 2016

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

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}
5 голосов
/ 22 сентября 2010

Да, super() (в нижнем регистре) вызывает конструктор родительского класса. Вы можете включить аргументы: super(foo, bar)

Существует также ключевое слово super, которое можно использовать в методах для вызова метода суперкласса

Быстрый Google для "Java Super" приводит к это

3 голосов
/ 22 сентября 2010

Это правильно.Super используется для вызова родительского конструктора.Итак, предположим, что у вас есть кодовый блок, например

class A{
    int n;
    public A(int x){
        n = x;
    }
}

class B extends A{
    int m;
    public B(int x, int y){
        super(x);
        m = y;
    }
}

Затем вы можете присвоить значение переменной-члену n.

1 голос
/ 18 июня 2017

Я видел все ответы.Но все забыли упомянуть один очень важный момент:

super () должен вызываться или использоваться в первой строке конструктора.

1 голос
/ 14 июля 2015

Например, в автоматизации селена у вас есть PageObject, который может использовать конструктор своего родителя, например:

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........
1 голос
/ 03 мая 2015

Просто супер (); один вызовет конструктор по умолчанию, если он существует из суперкласса класса. Но вы должны явно написать конструктор по умолчанию самостоятельно. Если у вас нет Java, сгенерируйте его для вас без реализаций, сохраните super (); , ссылаясь на универсальный объект суперкласса, и вы не можете вызвать его в подклассе.

public class Alien{
   public Alien(){ //Default constructor is written out by user
   /** Implementation not shown…**/
   }
}

public class WeirdAlien extends Alien{
   public WeirdAlien(){
   super(); //calls the default constructor in Alien.
   }

}
...