构造函数:
构造函数定义:
构建创造时用的函数,即对象创建时执行的函数。
构造函数的格式
修饰符 构造函数名(参数列表){
}
构造函数的体现
- 构造函数没有返回值类型。也不需要写返回值。因为其是为构建对象的,对象创建完,
函数就执行结束。- 构造函数名称必须和类型保持一致。
- 构造函数没有具体的返回值
class Person
{
//Person的成员属性age和name
private int age;
private String name;
//Person的构造函数,拥有参数列表
Person(int a , String nm)
{
//接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
}
构造函数的调用:
构造函数
父类的构造函数会优先于子类的构造函数运行
为什么?父类为子类准备一些数据
构造函数的第一句有一个隐藏的super(参数列表)
对于super(参数列表)调用,前提是父类必须有相应的构造函数
this(…)也在第一句 冲突不?不冲突
因为this(…)会转接到其他构造函数,其他的构造函数最终不会再转接回去,第一句只能是super(…)
class Person
{
//Person的成员属性age和name
private int age;
private String name;
//Person的构造函数,拥有参数列表
Person(int a , String nm)
{
//接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
public void speak()
{
System.out.println("name="+name+",age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
//创建Person对象
//Person p = new Person();
//上述代码编译报错,原因是在Person类中没有Person()这样的构造函数
//创建Person对象,并明确对象的年龄和姓名
Person p2 = new Person(23,"张三");
p2.speak();
}
}
该代码表示创建对象时构造函数的调用。即在创建对象时,会调用与参数列表对应的构造函数。如果创建对象时没有对应的构造函数,那么无法创建该对象。
上述代码图解:
图解:
1、首先将main主函数压入栈中,执行main函数中的new Person(23,“张三”);
2. 在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x88)。然后给成员变量进行默认初始化(name=null,age=0)。
3. 执行构造函数(这里省略部分知识,后面讲解)中的代码(age = a ; name =nm;),这段代码执行结束后,成员变量age和name的值已经改变。此步骤也为构造函数初始化。执行结束之后构造函数弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2。
默认构造函数:
class Person
{
//如果没有显示指定构造函数,编译会在编译时自动添加默认的构造函数
//Person(){} //空参数的默认构造函数
}
如果创建对象时不需要明确具体的数据,这是可以不用书写构造函数(不写也有默认构造函数)。
构造函数的细节:
一个类中可以有多个构造函数,多个构造函数是以重载的形式存在的
构造函数中也是有return语句的,用于结束初始化动作。
构造函数是可以被private修饰的,作用:其他程序无法创建该类的对象
构造函数与一般函数的区别:
构造函数:构造函数在对象创建时就执行了,而且只执行一次。
一般函数:一般函数是在对象创建后,需要使用时才被对象调用,并可以被多次调用。
问题:
有了构造函数之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?
需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时在,这时
只能通过set或者get方法来操作。