在构造函数中放入super()是不必要的?

如果我不把它放在一个子类的构造函数中,这不是由编译器自动放置的吗?

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

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

首先是一些术语:

  • 无参数构造函数:没有参数的构造函数;
  • 可访问无参数构造函数:子类中可见的超类中的无参数构造函数。 这意味着它是公开的或者是受保护的,或者如果这两个class级在同一个包裹中,则包裹访问; 和
  • 默认构造函数:在类中没有显式构造函数时由编译器添加的public no-args构造函数。

所以所有的类至less有一个构造函数。

在执行子类的构造函数中的代码之前,子类构造函数可以指定它们在超类中调用哪个构造函数的第一件事。

如果子类构造函数没有指定要调用哪个超类构造函数,编译器将自动调用超类中可访问的无参数构造函数。

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

例如:

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

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

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

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

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

如果你的方法覆盖了它的一个超类的方法,你可以通过使用关键字super来调用被重写的方法。

调用超类构造函数的语法是

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

用super(),超类无参数的构造函数被调用。 用super(参数列表),调用具有匹配参数列表的超类构造函数。

注意:如果构造函数没有显式地调用超类构造函数,那么Java编译器会自动插入对超类的无参构造函数的调用。 如果超类没有没有参数的构造函数,你会得到一个编译时错误。 对象确实有这样的构造函数,所以如果Object是唯一的超类,没有问题。

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

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

主要

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

}