如果我没有在子类的构造函数中定义,那么编译器不是会自动添加它吗?
这意味着我甚至不需要关心它?有些文章将其列出。
如果我有一个带参数的构造函数,那么这将成为构造函数,还是要使用不带参数列表的构造函数?
如果我没有在子类的构造函数中定义,那么编译器不是会自动添加它吗?
这意味着我甚至不需要关心它?有些文章将其列出。
如果我有一个带参数的构造函数,那么这将成为构造函数,还是要使用不带参数列表的构造函数?
首先是一些术语:
因此,所有类都至少有一个构造函数。
子类的构造函数可能会指定要调用哪个超类构造函数,然后再执行子类构造函数中的代码。
如果子类构造函数没有指定要调用哪个超类构造函数,则编译器将自动调用超类中可访问的无参构造函数。
如果超类没有无参构造函数或者该构造函数不可访问,则在子类构造函数中不指定要调用的超类构造函数是一个编译错误,因此必须指定。
例如:
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的无参构造函数是私有的。
调用无参数的超类构造函数只是浪费屏幕空间和程序员的时间。不管你是否编写,编译器生成的代码都是完全相同的。
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
更新(2018年12月):
在IDE中,显式使用 super()
可以帮助浏览源代码。
截至2018年12月,无论是Eclipse还是IntelliJ都没有提供任何方便从派生类的构造函数导航到基类构造函数的方法。
即使您没有调用它,子类默认构造函数仍会调用父类的默认构造函数。
主要
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
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);
}
}
super()
是不必要的”,因为super()
是对“可访问的无参构造函数”的调用。 - flow2k