构造函数
| 一、构造函数概述 |
![]() |
|
构造函数是函数中的一种特殊类型。构造函数,一创建就直接自动运行的那个类附属的函数。 【】写法:没有返回值类型,函数名和类名一致。 【】运行:构造函数在对象一创建时就运行了。 【】作用,给对象初始化 【】对象不进行构造函数初始化就不能使用。(对象先默认初始化,然后构造函数初始化,之后才能使用) |
|
【】构造函数,就是用来构造对象时用到的函数。格式是:new+构造器。 |
| 二、构造函数--默认构造函数 |
|
【】创建对象都要通过构造函数初始化(例子:创建Person的类) 【】一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数,Person(){} 【】一旦在类中定义了一个构造函数,默认的构造函数就消失了。(默认函数和构造函数,在参数和函数名上一样,那就相同) 【】程序员自己写了构造函数,编译器就不给加默认的了,没有,编译器就增加一个默认的构造函数。 |
|
【】同载函数,函数名相同,唯一的区分就在于参数列表。返回值类型都不是区分点。 构造函数同载和一般函数同载一样,只看两点,y(x),函数名和参数列表这两点。 |
| 三、构造函数和一般函数的区别 |
|
【一】
|
|
【】构建函数,是对象初始化应该做什么事情,一创建就会被自动调用 【】一般函数,描述对象因该具备的功能,需要调用时程序员要手动调用 |
|
【二】
|
|
【三】 构造函数一般函数,格式上都可以写权限符public或private,但是返回值类型 【】构造函数,必须没有返回值类型,----如果有,那就不再是构造函数而变成一般函数了 【】一般函数,必须有返回值类型 |
| 四、什么时候定义构造函数 |
|
【】Person中名字、年龄等事物存在就具备这些内容,直接输入构造函数,建立时初始化就有了这些数据
|
|
|
| 五、构造函数的同载 |
|
【】一个类里面可以有多个同名的构造函数,只要参数列表不一致即可。和一般函数的重载一样。---方法名相同,参数列表不一样,y(x)。 参数列表参数多少不同,参数数据类型不同,顺序不同,都是不同。但是,和参数名没关系,叫a。叫b,叫c,都一样。
|
|
【】作为强类型语言,参数列表哪怕个数一样,顺序不同,也是不一样的函数
这个函数可以重载,参数列表参数顺序不同 |
| 六、构造函数--内存图解 |
|
堆内存成员变量初始化,栈内存构造函数初始化。 |
|
【】首先主函数进栈,然后主函数里面p2变量开辟空间。此时还没有把内存地址传过来给p2 【】同时堆内存产生对象,出现内存首地址值。对象一产生,成员变量name、age也开辟空间,默认初始化name为null,age为0。 【】对象进行默认初始化后,开始调用构造函数进行构造函数初始化。 此时,Person(n,a)函数进入栈内存,构造函数的参数列表n,a开辟内存空间。小强,10传给person函数的参数列表,n=小强,a=10;之后person内部运算,n,a参数列表赋值给堆内存变量,name改为小强,age改为10。那个对象调用的这个方法,就把值赋给那个对象。
【】赋值之后,构造函数弹栈消失。弹完后,这个对象初始化完毕。此时右边才算完成了,这会,才会把内存地址给p2. 【】p2.speak执行,speak()函数进栈,p2指向对象,执行程序。执行完后,speak函数出栈。 |
|
【】栈内存:函数、成员函数、临时变量、函数参数列表。堆内存:实体数据,成员变量。 【】次函数的参数列表变量也在栈内存次函数中开辟空间,接收数据 |
| 七、构造函数的细节 |
|
1、一个私有化的成员变量往往附带着setXxx和getXxx这两个方法。 哪怕构造函数里面有name赋值操作,也不能不写这两个函数。因为构造函数只能初始化一次,之后想要修改数据就需要使用一般操作。 这两者不冲突,各自有应用场景 【】比如构造函数初始化,name叫旺财,之后想改名字,这时就可以调用setName函数改名为旺旺。
|
|
2、类中的构造函数可以调用次函数,但是次函数不能调用构造函数。因为没有对象,而构造函数是给对象初始化用的。 非要调用,得写成new Person();先创建对象才能调用。 |
|
3、构造函数前面没有返回值类型,只有一个 类名() 如果给类名()前面加上void,它就从构造函数变成了一般函数。void Person() ------毕竟一般函数不按规范可以用类名来命名。但这样阅读性太差,容易误导别人。 |
|
4、构造函数里面有return语句(结束函数用的)。直接写的情况不多。
如果年龄小于0,直接结束。 |
| 5、类里面构造函数没设置空参数构造函数,那么创建对象new Person()就会报错。因为最初默认的构造函数在手动添加构造函数时就消失了。 |














浙公网安备 33010602011771号