1.构造函数:完成对象的初始化工作
以下代码为何无法通过编译?哪儿出错了?
编译器提示:构造函数Foo()未定义
//正确代码如下
public class Test {
public static void main(String[] args) {
Foo obj1=new Foo();
}
}
class Foo{
int value;
Foo(){
}
public Foo(int initValue) {
value=initValue;
}
}
构造函数应注意:
1.构造函数没有返回值,也不能用void修饰. 如果不小心给构造函数前面添加了返回值类型,那么这将使这个构造函数变成一个普通的方法,在运行时将产生找不到构造方法的错误。
2.如果类的构造函数被重写了,如上例,Foo类已经有了一个有参数有方法体的构造函数,这时编译器就不会再给它默认加上一个无参且方法体为空的构造函数.可以理解为无参的构造函数被覆盖了.这种情况称为没有默认构造函数.
3.构造方法可以重载,以参数的个数,类型,顺序。
4.一个类可以定义多个构造方法,如果写的类里面没有构造函数,那么编译器会默认加上一个无参数且方法体为空的构造函数.
2.
在函数的继承里,子类必须调用父类的构造函数。但是,子类只能继承父类的默认构造函数,如果父类没有默认的构造函数,那子类不能从父类继承默认构造函数.这时子类必须使用super来实现对父类的非默认构造函数的调用.在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。
注意:通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
3.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过开?
构造函数是一种特殊的方法 。主要作用是用来在创建对象时初始化对象, 即为对象成员变量赋初始值,特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父类的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法就得不到正确的初始化。
不能反过来调用也是这个原因,因为父类不知道子类有啥变量而且这样一来子类也得不到初始化的父类变量