【发布时间】:2010-01-13 02:42:58
【问题描述】:
如果我不将它放在子类的构造函数中,编译器不会自动放入它吗?
这意味着我什至不需要关心它?在一些文章中他们把它放出来了。
如果我有一个带参数的构造函数,这将是构造函数,还是需要一个没有参数列表的构造函数?
【问题讨论】:
标签: java constructor super
如果我不将它放在子类的构造函数中,编译器不会自动放入它吗?
这意味着我什至不需要关心它?在一些文章中他们把它放出来了。
如果我有一个带参数的构造函数,这将是构造函数,还是需要一个没有参数列表的构造函数?
【问题讨论】:
标签: java constructor super
首先是一些术语:
所以所有类都至少有一个构造函数。
子类构造函数可以指定在执行子类构造函数中的代码之前调用超类中的哪个构造函数作为他们做的第一件事。
如果子类构造函数没有指定调用哪个超类构造函数,那么编译器会自动调用超类中可访问的无参数构造函数。
如果超类没有无参数构造函数或者它不可访问,则不指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定。
例如:
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 的无参数构造函数是私有的。
【讨论】:
super()”,因为super()是对“可访问”的调用无参数构造函数”。
如果超类构造函数没有参数,Java 会自动为您调用它。如果它有参数,你会得到一个错误。
src:http://java.sun.com/docs/books/tutorial/java/IandI/super.html
【讨论】:
调用无参数超级构造函数只是浪费屏幕空间和程序员时间。无论您是否编写,编译器都会生成完全相同的代码。
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
更新(2018 年 12 月):
编写显式 super() 有助于在 IDE 中导航源代码。
截至 2018 年 12 月,Eclipse 和 IntelliJ 均未提供任何从派生类的构造函数轻松导航到基类的构造函数的方法。
【讨论】:
即使你不调用默认父构造函数,也会从子默认构造函数中调用它。
主要
public class Main {
public static void main(String[] args) {
A a = new B();
}
}
一个
public class A {
public A() {
System.out.println("A");
}
}
B
public class B extends A {
public B() {
System.out.println("B");
}
}
打印
A
B
【讨论】:
如果没有显式调用 super([arguments]),任何类构造函数总是调用“super()”,只有我们在编程时记住对超类构造函数的访问...... 当我们不扩展任何特定类时自动扩展 java.lang.Object 类
【讨论】:
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);
}
}
【讨论】: