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

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

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

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

7 ответов


во-первых с терминологией:

  • конструктор 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 является частным.


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

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


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

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

class Implicit {
    Implicit() {
    }
}

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

Main

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

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

синтаксис вызова конструктора суперкласса -

super();  
--or--
super(parameter list);

С помощью super () вызывается конструктор суперкласса без аргументов. С помощью super (список параметров) вызывается конструктор суперкласса с соответствующим списком параметров.

Примечание: Если конструктор явно не вызывает конструктор суперкласса, Компилятор Java автоматически вставляет вызов конструктора без параметров суперкласса. Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции. У Object есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.


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


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);

}

}