super () на Java


222

Чи super()використовується для виклику батьківського конструктора? Будь ласка, поясніть super().


1
Необхідно бути більш конкретним або просто прочитати документацію ...
Ману,

У зв’язку з дзвінками super () також перевірте цю відповідь. stackoverflow.com/questions/34349164 / ...
Vishrant

Пояснено тут: Java: Calling super ()
aioobe

Відповіді:


267

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

Він може бути використаний і з аргументами. Тобто super(argument1)він викличе конструктор, який приймає 1 параметр типу argument1(якщо він існує).

Також його можна використовувати для виклику методів від батьківського. Тобтоsuper.aMethod()

Більше інформації та підручника тут


9
ПРИМІТКА: у першому випадку у батьківського класу не повинно бути конструктора аргументів, у противному випадку він видасть помилку компіляції.
КНУ

Ніт: батьківська / дочірня термінологія не дуже підходить для ієрархій класів. (Дитина - не батько.)
aioobe

Чи існують обмеження щодо того, де можна використовувати супер?
Аарон Франке

2
@VivekChavda, впевнена, що дитина може бути батьком, подібно до того, як студент може бути вчителем і т. Д. Але я думаю, ви розумієте різницю порівняно з Animal -> Dog, наприклад. Собака - це обов’язково тварина. Батько / дитина, як правило, має стосунки ("батько має дитину"), а тварина / собака - це "є" . Дивіться aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe

2
@AaronFranke: "Чи існують обмеження щодо того, де можна використовувати супер?" - Так, super(...)може використовуватися лише в якості першого твердження в конструкторі.
aioobe

154

Деякі факти:

  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ключове слово перед ім'ям функції.


4
Чому ви не ввели приклади вихідного коду? Чи є конкретна причина?
erikbwork

НЕ Ерікб, я хочу дізнатися про використання супер (). Звідси лише я збираюся
Мохан

У моєму базовому класі я перевантажую конструктор одним, двома, ... аргументами
Мохан,

але в моєму похідному класі я використовую super () без жодної аргументації. то що буде, чи буде автоматично викликано конструктор за замовчуванням базового класу
Мохан

2
super()не є ключовим словом. Це виклик конструктора. superє ключовим словом, і №1 і №2 має сенс тільки з цим визначенням.
Маркіз Лорн

37

Стаття джерела: Java: Calling super ()


Так. 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.

У моєму базовому класі я перевантажую конструктор одним, двома, ... аргументами у своєму похідному класі, я використовую super () без жодних аргументів. то що буде, чи буде автоматично викликано конструктор за замовчуванням базового класу
Мохан

Так. Якщо ви super()його зателефонуєте , викличе конструктор суперкласу, який не бере аргументів. Аналогічно, він буде викликати конструктор з 1 аргументом, якщо ви це зробите super(arg1)тощо.
aioobe

якщо в базовому класі не було жодного конструктора без аргументів, то що станеться, якщо похідний клас викликає super ().
Мохан

1
Нічого. Він не складеться. Якщо ви надаєте конструктор самостійно, автоматичний / типовий / не-аргумент-конструктор не буде генерований, таким чином super(), не буде дійсним викликом.
aioobe

29

Чи використовується super () для виклику батьківського конструктора?

Так.

Поясніть про Super ().

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

Ось офіційний підручник


5
super()використовується для виклику батьківського конструктора, super.myMethod()використовується для виклику методу, що перекривається.
Шон Патрік Флойд

2
@seanizer або будь-який інший метод надкласу (включаючи статику), якщо він є в області його застосування. super - це лише посилання на ваш базовий клас.
отаманроман

3
Я не думаю, що super () використовується для виклику методів базового класу. Однак ви можете використовувати super.method ().
Dheeraj Joshi

@seanizer, @Dheeraj: Дякую за Ваш відгук, я адаптував свою відповідь.
Хайнзі

7

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

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

class Implicit {
    Implicit() {
    }
}

Я знайшов його використаним у кількох класах, не впевнений, у чому мета. Ваша відповідь корисна.
іпрашант

6

Так, super()(малі регістри) викликає конструктор батьківського класу. Ви можете включити аргументи:super(foo, bar)

Існує також superключове слово, яке ви можете використовувати в методах для виклику методу надкласу

Швидкий google для "Java super" призводить до цього


4

Це правильно. 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.


2

Я бачив усі відповіді. Але всі забули згадати один дуже важливий момент:

super () слід викликати або використовувати в першому рядку конструктора.


1

Просто супер (); поодинці викличуть конструктор за замовчуванням, якщо він існує в суперкласі класу. Але ви повинні чітко написати конструктор за замовчуванням самостійно. Якщо ви не 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.
   }

}

Без аргументів .
Маркіз Лорн

1

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

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........

1

Я хотів би поділитися з кодами все, що я зрозумів.

Супер ключове слово в java - це посилальна змінна, яка використовується для позначення об'єктів батьківського класу. Він в основному використовується в таких контекстах:

1. Використання супер із змінними:

class Vehicle 
{ 
    int maxSpeed = 120; 
} 

/* sub class Car extending vehicle */
class Car extends Vehicle 
{ 
    int maxSpeed = 180; 

    void display() 
    { 
        /* print maxSpeed of base class (vehicle) */
        System.out.println("Maximum Speed: " + super.maxSpeed); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String[] args) 
    { 
        Car small = new Car(); 
        small.display(); 
    } 
} 

Вихід: -

Maximum Speed: 120
  1. Використання супер методів:
/* Base class Person */
class Person 
{ 
    void message() 
    { 
        System.out.println("This is person class"); 
    } 
} 

/* Subclass Student */
class Student extends Person 
{ 
    void message() 
    { 
        System.out.println("This is student class"); 
    } 

    // Note that display() is only in Student class 
    void display() 
    { 
        // will invoke or call current class message() method 
        message(); 

        // will invoke or call parent class message() method 
        super.message(); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String args[]) 
    { 
        Student s = new Student(); 

        // calling display() of Student 
        s.display(); 
    } 
}

Вихід: -

This is student class
This is person class

3. Використання супер з конструкторами:

class Person 
{ 
    Person() 
    { 
        System.out.println("Person class Constructor"); 
    } 
} 

/* subclass Student extending the Person class */
class Student extends Person 
{ 
    Student() 
    { 
        // invoke or call parent class constructor 
        super(); 

        System.out.println("Student class Constructor"); 
    } 
} 

/* Driver program to test*/
class Test 
{ 
    public static void main(String[] args) 
    { 
        Student s = new Student(); 
    } 
} 

Вихід: -

Person class Constructor
Student class Constructor

0

Конструктори
У конструкторі ви можете використовувати його без крапки для виклику іншого конструктора. superвикликає конструктор у надкласі; thisвикликає конструктор цього класу:

public MyClass(int a) {
  this(a, 5);  // Here, I call another one of this class's constructors.
}

public MyClass(int a, int b) {
  super(a, b);  // Then, I call one of the superclass's constructors.
}

superє корисним, якщо надкласові необхідно ініціалізувати себе. thisкорисно, щоб ви могли записати весь жорсткий код ініціалізації лише один раз в один з конструкторів і викликати його від усіх інших, набагато простіших для запису конструкторів.

Методи
У будь-якому методі ви можете використовувати його з крапкою для виклику іншого методу. super.method()викликає метод у надкласі; this.method()називає метод цього класу:

public String toString() {
  int    hp   = this.hitpoints();  // Calls the hitpoints method in this class
                                   //   for this object.
  String name = super.name();      // Calls the name method in the superclass
                                   //   for this object.

  return "[" + name + ": " + hp + " HP]";
}

superкорисний у певному сценарії: якщо у вашому класі є той самий метод, що і ваш суперклас, Java припустить, що ви хочете цього у своєму класі; superдозволяє замість цього запитати метод суперкласу. thisкорисний лише як спосіб зробити ваш код більш читабельним.


0

Супер можна використовувати ключове слово для виклику конструктора суперкласу і звернутися до члену суперкласу

Коли ви викликаєте super () з правильними аргументами, ми фактично викликаємо конструктор Box , який ініціалізує змінні ширини , висоти та глибини , згаданих до нього, використовуючи значення відповідних параметрів. Вам залишається лише ініціалізувати його вагу доданої вартості. Якщо потрібно, тепер ви можете робити змінні класу Box як приватні . Відкладіть у поля приватного модифікатора класу Box і переконайтесь, що ви можете отримати доступ до них без проблем.

У суперкласі може бути кілька конструкторів перевантажених версій, тому ви можете викликати метод super () з різними параметрами. Програма виконає конструктор, який відповідає заданим аргументам.

public class Box {

    int width;
    int height;
    int depth;

    Box(int w, int h, int d) {
        width = w;
        height = h;
        depth = d;
    }

    public static void main(String[] args){
        HeavyBox heavy = new HeavyBox(12, 32, 23, 13);
    }

}

class HeavyBox extends Box {

    int weight;

    HeavyBox(int w, int h, int d, int m) {

        //call the superclass constructor
        super(w, h, d);
        weight = m;
    }

}

0

super - ключове слово. Він використовується всередині визначення методу підкласу для виклику методу, визначеного в суперкласі. Приватні методи надкласу не можна назвати. Супер-ключовим словом можна викликати лише загальнодоступні та захищені методи. Він також використовується конструкторами класів для виклику конструкторів свого батьківського класу.

Перевірте тут для подальшого пояснення.


0

Як зазначено, всередині конструктора за замовчуванням є імпліцитний super (), що викликається в першому рядку конструктора.

Цей супер () автоматично викликає ланцюжок конструкторів, що починається вгорі ієрархії класів, і рухається вниз по ієрархії.

Якби було більше двох класів в ієрархії класів програми, конструктор вищого класу по замовчуванням буде отримати називають першим .

Ось приклад цього:

class A {
    A() {
    System.out.println("Constructor A");
    }
}

class B extends A{

    public B() {
    System.out.println("Constructor B");
    }
}

class C extends B{ 

    public C() {
    System.out.println("Constructor C");
    }

    public static void main(String[] args) {
    C c1 = new C();
    }
} 

Наведене вище:

Constructor A
Constructor B
Constructor C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.