Не нужно ли помещать super () в конструктор?

Разве это не автоматически добавляется компилятором, если я не помещаю его в конструктор подкласса?

Значит, мне даже не нужно об этом заботиться? В некоторых статьях это выложили.

И если у меня есть один конструктор с аргументами, будет ли это конструктор или он принимает конструктор без списка аргументов?


person ajsie    schedule 13.01.2010    source источник


Ответы (6)


Для начала немного терминологии:

  • Конструктор без аргументов: конструктор без параметров;
  • Доступный конструктор без аргументов: конструктор без аргументов в суперклассе, видимый для подкласса. Это означает, что он либо общедоступный, либо защищенный, либо, если оба класса находятся в одном пакете, доступ к пакету; а также
  • Конструктор по умолчанию: общедоступный конструктор без аргументов, добавляемый компилятором, когда в классе нет явного конструктора.

Итак, у всех классов есть хотя бы один конструктор.

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

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

Если у суперкласса нет конструктора без аргументов или он недоступен, то не указание вызываемого конструктора суперкласса (в конструкторе подкласса) является ошибкой компилятора, поэтому его необходимо указать.

Например:

public class Base { }
public class Derived extends Base { }

Это нормально, потому что, если вы явно не добавляете конструктор, Java помещает для вас общедоступный конструктор по умолчанию.

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

Тоже все в порядке.

public class Base { public Base(String s) { } }
public class Derived extends Base { }

Вышеупомянутая ошибка компиляции, поскольку у Base нет конструктора по умолчанию.

public class Base { private Base() { } }
public class Derived extends Base { }

Это также ошибка, потому что конструктор Base без аргументов является частным.

person cletus    schedule 13.01.2010
comment
Итак, я предполагаю, что ответ на вопрос OP в заголовке - да, нет необходимости включать super() в дочерний конструктор, потому что super() - это вызов доступного конструктора без аргументов. - person flow2k; 31.07.2017
comment
Вышеупомянутая ошибка компиляции, поскольку у Base нет конструктора по умолчанию. должен быть изменен на. Вышеупомянутая ошибка компиляции, поскольку у Base нет конструктора без аргументов. - person Anup Verma; 26.08.2017
comment
Зависит от того, как ты думаешь. Думаю, пока в этом нет необходимости - я бы не сказал, что в этом нет необходимости. - person ahsan.dev; 17.05.2018
comment
@flow2k Это не вопрос "да" или "нет". В некоторых случаях в этом нет необходимости, как показано на его примерах, а в некоторых случаях это необходимо. super () будет автоматически вставлен из этого (...) или super (...) не указан. Если суперкласс не включает конструктор без аргументов или недоступен, он не будет компилироваться. В этом случае необходимо поставить super (...) и указать конструктор. Таким образом, возможно, что нет доступного конструктора no arg, и в этом случае super необходим и должен иметь аргументы для доступного конструктора. - person JustAFellowCoder; 09.09.2020
comment
@flow2k обратите внимание, что если суперкласс имеет только один конструктор и является частным, то невозможно расширить класс (или создать экземпляр класса без отражения), поскольку нет доступного конструктора. - person JustAFellowCoder; 09.09.2020

Если конструктор суперкласса не имеет аргументов, Java автоматически вызывает его. Если у него есть аргументы, вы получите сообщение об ошибке.

src: http://java.sun.com/docs/books/tutorial/java/IandI/super.html

person lemon    schedule 13.01.2010
comment
... и если суперкласс вообще не имеет конструктора, он [конструктор по умолчанию] также будет предоставлен компилятором. Предоставленный конструктор будет иметь тот же уровень доступа, что и уровень доступа суперкласса. - person JonyD; 13.04.2017

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

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

class Implicit {
    Implicit() {
    }
}

Обновление (декабрь 2018 г.):

Написание явного super() помогает ориентироваться в исходном коде в среде IDE.

По состоянию на декабрь 2018 г. ни Eclipse, ни IntelliJ не предоставляют никаких средств удобной навигации из конструктора производный класс в конструктор базового класса.

person Roland Illig    schedule 11.12.2016
comment
Пустой неявный конструктор no-args также не нужен. - person Jon; 27.02.2018
comment
@Jon В этом случае да. Но если у вас есть конструктор с аргументами, то конструктор без аргументов по умолчанию не будет создан. - person Eric Wilson; 22.05.2018

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

Главный

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

A

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

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

Печать

A
B
person Yan Khonski    schedule 29.06.2017

Любой конструктор класса всегда вызывает "super ()", если он явно не вызывается super ([arguments]), только мы учитываем доступ к конструктору суперкласса во время программирования ... когда мы не расширяем какой-либо конкретный класс, автоматически расширяет java.lang .Object класс

person Dharmendrasinh Chudasama    schedule 16.02.2017

abstract class Book
 {
String title;
String author;
Book(String t,String a){
    title=t;
    author=a;
}
abstract void display();

}    

Если суперкласс может иметь конструктор без аргументов. Хорошо иметь конструктор без аргументов, в противном случае вам нужно передать суперконструктор с параметром.

Если у суперкласса нет конструктора без аргументов или он недоступен, то не указание вызываемого конструктора суперкласса (в конструкторе подкласса) является ошибкой компилятора, поэтому его необходимо указать

class MyBook extends Book{   
int price ;
public  MyBook(String t,String a,int price){
     super(t,a);
    this.price=price;
}

public void display(){
    System.out.println("Title: "+title);
 System.out.println("Author: "+author); 
System.out.println("Price: "+price);

}

}

person abhishek ringsia    schedule 14.01.2016
comment
Первый абзац - это не продолжение. - person user207421; 30.11.2016