在构造函数中放入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); }
}