Не нужно ли добавлять super() в конструктор?
Разве это не автоматически устанавливается компилятором, если я не помещаю его в конструктор подкласса?
Это означает, что мне даже не нужно заботиться об этом? В некоторых статьях они выразились.
И если у меня есть один конструктор с аргументами, будет ли это конструктором или требуется конструктор без списка аргументов?
Ответы
Ответ 1
Во-первых, некоторая терминология:
- Конструктор no-args: конструктор без параметров;
- Доступный конструктор no-args: конструктор no-args в суперклассе, видимый для подкласса. Это означает, что он является открытым или защищенным или, если оба класса находятся в одном пакете, доступ к пакетам; и
- Конструктор по умолчанию: открытый конструктор no-args, добавленный компилятором, когда в классе нет явного конструктора.
Итак, все классы имеют хотя бы один конструктор.
Конструкторы подклассов могут указывать в качестве первой вещи, которую они выполняют, для конструктора в суперклассе для вызова перед выполнением кода в конструкторе подкласса.
Если конструктор подкласса не указывает, какой конструктор суперкласса вызывается, тогда компилятор автоматически вызовет доступный конструктор no-args в суперклассе.
Если суперкласс не имеет конструктора no-arg или он недоступен, то не указывать конструктор суперкласса, который должен быть вызван (в конструкторе подкласса), является ошибкой компилятора, поэтому он должен быть указан.
Например:
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 no-args является закрытым.
Ответ 2
Если конструктор суперкласса не имеет аргументов, Java автоматически вызывает его для вас. Если у него есть аргументы, вы получите сообщение об ошибке.
src: http://java.sun.com/docs/books/tutorial/java/IandI/super.html
Ответ 3
Вызов супер-конструктора без аргументов - это просто трата экранного пространства и времени программиста. Компилятор генерирует точно такой же код, независимо от того, пишете вы его или нет.
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
Обновление (декабрь 2018 года):
Написание явного super()
помогает перемещаться по исходному коду в IDE.
По состоянию на декабрь 2018 года ни Eclipse, ни IntelliJ не предоставляют никаких средств для удобного перехода от конструктора производного класса к конструктору базового класса.
Ответ 4
По умолчанию родительский конструктор вызывается из дочернего конструктора по умолчанию, даже если вы его не называете.
Главная
public class Main {
public static void main(String[] args) {
A a = new B();
}
}
А
public class A {
public A() {
System.out.println("A");
}
}
В
public class B extends A {
public B() {
System.out.println("B");
}
}
Печать
A
B
Ответ 5
Если ваш метод переопределяет один из его методов суперкласса, вы можете вызвать переопределенный метод с помощью ключевого слова super.
Синтаксис для вызова конструктора суперкласса
super();
--or--
super(parameter list);
С супер() вызывается конструктор без аргументов суперкласса. С супер (список параметров) вызывается конструктор суперкласса с соответствующим списком параметров.
Примечание. Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов конструктору без аргументов суперкласса. Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции. У объекта есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.
Ответ 6
Любой конструктор классов всегда вызывает "super()", если явно не указано super ([arguments]), но мы будем иметь в виду доступ к суперклассическому конструктору при программировании...
когда мы не расширим какой-либо специальный класс, автоматически расширяет класс java.lang.Object
Ответ 7
abstract class Book
{
String title;
String author;
Book(String t,String a){
title=t;
author=a;
}
abstract void display();
}
Если суперкласс может иметь конструктор No-args. Хорошо иметь конструктор без аргументов, иначе вам нужно передать супер конструктор с параметром.
Если суперкласс не имеет конструктора no-arg или он недоступен, то не указывать конструктор суперкласса, который должен быть вызван (в конструкторе подкласса), является ошибкой компилятора, поэтому его необходимо указать
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);
}
}