构造方法
在Java中构造方法也就做构造函数或者构造器,它是一种用于创建类实例的特殊方法,构造方法的用途就是在创建对象时执行对象的初始化操作。
当对一个对象进行初始化,系统会默认地为对象中的属性进行初始化,初始化的原则是:数值类型的属性默认初始化为0,boolean类型的属性初始化为false,引用类型的属性初始化为null。但是如果要将这些属性初始化为其他的值,就需要通过构造函数来实现。
在Java中一个类里面至少包含一个构造方法。所以如果程序中没有显式地方一个构造方法,则系统会为这个类提供一个无参的构造方法。所以如果程序中没有显式地实现一个类定义构造方法,则系统会为这个类提供一个无参的构造方法,这个构造方法函数体为空,不做任何操作。但是一旦程序中显式定义了一个构造方法(无论是带参还是不带参数的),那么系统将不在提供默认的构造方法。
定义构造方法时需要注意以下几点:
- 构造方法必须与类名一致。
- 构造方法不能有返回类型,void也不行
- 构造方法可以重载,即在同一个类中可以定义多个构造方法,通过参数列表的不同来区分不同的构造函数。
- 在一个构造方法可以通过this(x,x)的形式调用另一个重载的构造方法,使用this调用另一个重载的构造函数只能在构造方法中使用,而且必须作为构造方法执行体的第一条语句
- 在子类的构造方法中可以通过super(x,x)的形式调用父类的构造方法,使用super调用父类的构造方法也必须出现在子类构造方法执行体的第一行,因此在构造方法中this调用和super调用不能同时出现
构造方法从来都是Java基础的一个重点,所以大家要认真学习
构造函数是否能被继承?能否被重载?
构造函数是不能被继承的,也就是说,子类不能获得父类的构造函数。在前面的我们已经讲过,一个类里面至少包含一个构造方法,即使不显式地定义一个整数,系统也会为该类生成一个默认的构造函数。这就说明,子类是无法继承父类的构造方法的,必须在自身的类中定义
但有些时候子类构造函数中需要调用父类的构造函数,以便初始化父类的对象(子类中是包含父类的对象的),这时就需要使用super来引用调用父类的构造函数。
public class Base{
public Base(int a){
System.out.println("Constructor in Base,parameter a="+a);
}
public static voia main(String[] args){
new Sub;
}
}
class Sub extends Base{
public sub(){
super(1);
System.out.println("Construtor is Sub");
}
}
如上述这段代码,子类的构造方法中通过super(1)调用了父类的构造方法,所以再main方法中创建子类的对象时,首先会调用父类的构造方法,然后调用子类的构造方法。
这里需要注意一点,由于子类的对象中本身包含父类的对象,所以在构造子类对象时一定会构造父类对象,所以父类的构造方法一定会被调用。如果不显式地用super()调用父类的构造方法,系统也会隐式地调用父类的无参构造方法。
其次,构造函数是可以被重载的。同一个类中可以定义多个构造方法,通过参数列表的不同来区分不同的构造函数。同时可以通过this(x,x)的形式调用另一个重载的构造方法。
public class Base{
public Base(int a){
this();
System.out.println("Constructor in Base,parameter a="+a);
}
public Base(){
System.out.println("Constructor in Base,no parameter");
}
public static main(String[] args){
new Base(1);
}
}
在上面的代码中,带参的构造函数Base(int a)中第一行通过this()调用Base类的无参构造函数,所以在main方法中通过new Base(1)构造Base类的对象时,会直接调用无参的构造函数。
答案
- 子类不能继承父类的构造方法,但可以通过super引用调用父类的构造方法
- 构造方法可以被重载,同时在构造方法中可以通过this调用其他构造方法