是不必将super()放在构造函数中?

时间:2010-01-13 02:42:58

标签: java constructor super

如果不将它放在子类的构造函数中,编译器是不是会自动放这个?

这意味着我甚至不需要关心它?在一些文章中,他们说出来了。

如果我有一个带参数的构造函数,这是构造函数,还是它需要一个没有参数列表的构造函数?

6 个答案:

答案 0 :(得分:210)

首先是一些术语:

  • No-args构造函数:没有参数的构造函数;
  • 可访问的no-args构造函数:子类可见的超类中的无参数构造函数。这意味着它是公共的或受保护的,或者如果两个类都在同一个包中,则包访问;和
  • 默认构造函数:当类中没有显式构造函数时,编译器添加的public 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构造函数是私有的。

答案 1 :(得分:50)

如果超类构造函数没有参数,Java会自动为您调用它。如果它有参数你就会收到错误。

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

答案 2 :(得分:19)

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

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

class Implicit {
    Implicit() {
    }
}

更新(2018年12月):

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

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

答案 3 :(得分:6)

默认的父构造函数是从子默认构造函数调用的,即使你没有调用它。

主要

public class Main {

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

A

public class A {

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

public class B extends A {

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

打印

A
B

答案 4 :(得分:0)

如果没有显式调用super([arguments]),任何类构造函数总是调用“super()”,只有在编程时我们记住超类构造函数的访问权限... 当我们没有扩展任何特定类时自动扩展java.lang.Object类

答案 5 :(得分:-2)

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

}

}