Java 是否不需要在构造函数中放入super()?

Java 是否不需要在构造函数中放入super()?,java,constructor,super,Java,Constructor,Super,如果我不把它放在子类的构造函数中,编译器不是会自动把它放进去吗 那意味着我根本不需要关心它?在一些文章中,他们把它发表了 如果我有一个带参数的构造函数,这个是构造函数,还是不带参数列表的构造函数 如果超级类构造函数没有参数,Java会自动为您调用它。如果它有参数,您将得到一个错误 src:首先是一些术语: 无参数构造函数:无参数的构造函数 可访问的无参数构造函数:子类可见的超类中的无参数构造函数。这意味着它要么是公共的,要么是受保护的,或者,如果两个类在同一个包中,则为包访问;及 默认构造函数

如果我不把它放在子类的构造函数中,编译器不是会自动把它放进去吗

那意味着我根本不需要关心它?在一些文章中,他们把它发表了


如果我有一个带参数的构造函数,这个是构造函数,还是不带参数列表的构造函数

如果超级类构造函数没有参数,Java会自动为您调用它。如果它有参数,您将得到一个错误


src:

首先是一些术语:

  • 无参数构造函数:无参数的构造函数
  • 可访问的无参数构造函数:子类可见的超类中的无参数构造函数。这意味着它要么是公共的,要么是受保护的,或者,如果两个类在同一个包中,则为包访问;及
  • 默认构造函数:当类中没有显式构造函数时,编译器添加的公共无参数构造函数
所以所有类都至少有一个构造函数

public class Base { private Base() { } }
public class Derived extends Base { }
子类构造函数可以在执行子类构造函数中的代码之前,首先指定调用超类中的哪个构造函数

public class Base { private Base() { } }
public class Derived extends Base { }
如果子类构造函数没有指定要调用的超类构造函数,那么编译器将自动调用超类中可访问的无参数构造函数。

如果超类没有参数构造函数或无法访问,则不指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定它

例如:

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构造函数是私有的

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

}

}调用无参数超级构造函数只是浪费屏幕空间和程序员时间。无论您是否编写,编译器都会生成完全相同的代码

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

class Implicit {
    Implicit() {
    }
}

更新(2018年12月):

编写显式的
super()
有助于在IDE中导航源代码


截至2018年12月,Eclipse也没有提供任何从派生类的构造函数轻松导航到基类构造函数的方法。

如果没有显式调用super([参数]),任何类构造函数都会调用“super()”,只有我们在编程时记住访问super类构造函数。。。
当我们不扩展任何特定类时,自动扩展java.lang.Object类

默认父构造函数从子默认构造函数调用,即使您不调用它

主要

A

B

印刷品

A
B

第一段是一个非sequeuit…如果超类没有任何构造函数,编译器也会提供它[默认构造函数]。提供的构造函数将具有与超级类访问级别相同的访问级别。因此,我猜OP在标题中的问题的答案是“是的,没有必要在子构造函数中包含
super()
”,因为
super()
是对“无参数可访问构造函数”的调用。“上面是编译错误,因为Base没有默认构造函数。”应修改为“上面是编译错误,因为Base没有args构造函数。”。“这取决于你怎么想。我认为,虽然这不是必要的,但我不会说这是不必要的。@flow2k这不是一个“是”或“否”的问题。在某些情况下,如他的例子所示,这是不必要的,在某些情况下,这是必要的。super()将自动插入此(…)或未指定super(…)。如果超类不包含no-arg构造函数或者它不可访问,那么它将不会编译。在这种情况下,有必要放置super(…)并指定构造函数。因此,可能不存在可访问的无参数构造函数,在这种情况下,super是必需的,并且必须具有可访问构造函数的参数。@flow2k请注意,如果super类只有一个构造函数,并且它是私有的,则不可能扩展该类(或在没有反射的情况下实例化该类)因为没有可访问的构造函数。空的no args隐式构造函数也是不必要的。@Jon在这种情况下,是的。但是如果您有一个带参数的构造函数,那么默认情况下不会创建no-arg构造函数。
A
B