简介
构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
起源与背景
随着计算机革命的发展,"不安全"的编程方式一逐渐成为变成代价高昂的主因之一。
初始化正是涉及安全的一个问题。许多C程序的错误都源于程序员忘记初始化变量。特别是在使用程序库时。
C++引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法。java中也采用了构造器。
构造方法存在的意义
简单来说,在创建对象时并初始化。
在java中通过提供构造器,我们可以确保每个对象都会得到初始化。可以使程序更加安全可靠且高效。
为什么要使用构造器?
首先要明白不通过构造方法,能不能初始化类内的成员变量(域)?答案是可以,通过静态变量,或初始化块等手段就可以完成变量的初始化。然而通过这样的手段,每次new的时候都执行了一样的操作:一成不变的值赋值给了变量。而通过构造函数则不一样,因为方法可以有参数,而且可以被重载,通过传入参数的不同,可以一定程度实现类的动态赋值。而不同的重载构造函数让类的实例化更加多样。
但java中构造器的作用不限于此。
如何写一个构造方法
构造方法名与类名相同,在类实例化时自动调用。
简单的带有构造器的类:
class Demo{
Demo(){
//默认语句 super();
System.out.print("Demo ");
}
}
public class Simple{
public static void main(String[] args){
for(int i=0;i<5;i++){
new Demo(); //实例化
}
}
}
输出结果:
Demo Demo Demo Demo Demo
注意!在子类继承父类中
- java类至少有一个构造方法。若父类没有定义任何类型的构造方法,编译器会自动生成无参数的构造方法;如果你定义了一种构造方法,则编译器不会自动生成无参构造函数。
- 构造方法不能互相调用(死循环),否则报错。.
- 构造方法只能调用,不能继承。
简单的解释:构造器和类同名,父类和子类肯定不同名,那父类的构造器放在子类里那不成一般方法了吗?所以父类的构造器是无法继承的。 - 构造器是一种特殊的类型,没有返回值。注意:不是空返回值(void)。
- 如果子类没有定义构造方法,则调用父类的无参数的构造方法,如果父类只定义了有参数的构造方法(没有无参构造方法)则报错。
- 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,“默认”执行父类无参数的构造方法(子类构造器第一行会隐式使用super()),然后执行自己的构造方法。
- 调用构造方法时this和super只能出现一个。
- 子类构造方法默认调用父类无参构造方法。可以通过super(参数)调用所需要的父类的构造方法,//通常该语句做为子类构造方法中的第一条语句。
- 如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),//该语句放在构造方法的第一条。
- 若父类定义了有参数的构造方法,没定义无参数的构造方法,则子类需要显式引用父类含参的构造方法。
- 构造方法可以重载,无重写(因为没有继承),构造方法只能执行一次。
- 如果构造器中添加了this引用该类的其他构造器,或者添加了super()调用父类构造器,如果this和super中有参数,则只能是静态的方法和静态变量或常量
- 构造方法只能被构造方法调用。
- 调用其他构造方法只可以单调用,不可以多调用。可以多重调用。即不可以构造方法1同时调用构造方法2和构造方法3;可以传递调用,方法1调用方法2,方法2调用方法3。