构造函数
上一篇博客(https://blog.****.net/qq_41819988/article/details/88628466)中,简单谈了一下构造函数,这篇博客,我们就来详细了解一下构造函数,以及它在内存中的运行方式。
一、构造函数特点
1、在描述事物时,该事物一存在就具备的一些内容,这些内容就定义在构造函数中,如下面举例:
class Person
{
private String name;
private int age;
Person()
{
name = "小明";
age = 10;
}
public void speak()
{
System.out.println(name+":"+age);
}
}
class ConsDemo3
{
public static void main(String[] args)
{
Person p = new Person();
p.speak();
}
运行结果
上述代码,在新建对象p时,便通过构造函数对对象p的内容进行初始化。
2、构造函数可以有多个,用于不同的对象进行针对性的初始化
3、多个构造函数在类中是以重载的形式来体现的
上面这两个特点,我们可以通过下面这个具体示例来了解:
class Person
{
private String name;
private int age;
Person(String n,int a)
{
name = n;
age = a;
}
Person(String n)
{
name = n;
}
Person()
{
}
public void speak()
{
System.out.println(name+":"+age);
}
}
class ConsDemo2
{
public static void main(String[] args)
{
Person p0 = new Person("小强",10);
Person p1 = new Person("小强");
Person p2 = new Person();
p0.speak();
p1.speak();
p2.speak();
}
}
运行结果:
上述代码中,主函数通过新建对象时,传递不同类型的参数,来实现构造函数的重载。
二、构造函数在内存中的运行方式
要了解构造函数在内存中的运行机制,我么可以通过下面这个具体示例来学习。
1、代码
class Person
{
private String name;
private int age;
Person(String n,int a)
{
name = n;
age = a;
}
Person(String n)
{
name = n;
}
Person()
{
}
public void speak()
{
System.out.println(name+":"+age);
}
}
class ConsDemo2
{
public static void main(String[] args)
{
Person p2 = new Person("小强",10);
p2.speak();
}
}
2、运行过程
1)栈内存读取主函数以及在主函数的内存区域中新建局部变量p2,然后通过传递的参数类型确定读取 Person(String n, int a) 构造函数,并在堆内存中新建一个对象,并将对象中的成员变量置空,如下图
2)栈内存读取Person类中的 Person(String n,int a) 构造函数,并将参数"小明",10传递进去,,如下图
3)通过构造函数Person对堆内存中的对象中的成员变量进行赋值,执行完毕后,栈内存对Person构造函数执行弹栈操作,如下图
4)堆内存将新建的对象的首地址传递给栈内存的p2变量,如下图
5)执行 p2.speak() 方法,在栈内存新建speak()函数,执行完毕后,对speak()的内存空间实行弹栈操作,如下图