构造函数

上一篇博客(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()的内存空间实行弹栈操作,如下图

构造函数