是否没有必要在构造函数中放入 super () ?

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

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

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

103906 次浏览

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

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

首先是一些术语:

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

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


}

如果超类可以有一个 No-args 构造函数。最好有一个没有参数的构造函数,否则就必须传递带参数的超级构造函数。

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

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 ()”,只是我们在编程时要记住超类构造函数的访问..。 当我们没有扩展任何特定的类时,自动扩展 java.lang.Object 类

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

总部

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