Java学习笔记(3)
一、内存中的参数传递
1、基本数据类型的参数传递
我们可以通过下面的具体示例来了解,基本数据类型的参数传递:
上述代码具体的执行过程:
1)栈内存优先读取Demo类中的主方法main,并在栈内存中新建一个main方法的内存空间
2)在main方法中新建局部变量x,并赋值3
3)读取到show(x)方法时,在栈内存中新建一个show方法的内存空间
4)将主方法中的x=3传递到show方法的内存空间中,
5)读取show方法中的语句,将x的值置为4
6)show方法执行完毕,执行弹栈操作,如下图:
7)继续读取main方法中的执行语句,打印x的值,因为show方法并没有返回值,因此,主方法中的x值并不受影响,所以最终输出结果为 x = 3 。
2、引用数据类型的参数传递
对于引数据类型的参数传递,我们也可以通过一个具体示例,来进行了解:
上述代码的具体执行过程:
1)栈内存优先读取Demo类中的主方法main,并在栈内存中新建一个main方法的内存空间
2)在栈内存的main方法的内存中新建一个局部变量d
3)在堆内存中新建一块Demo对象的存储空间,并对其中的成员x进行初始化 x=0 ,然后读取Demo类中的 x = 3 ,再将3赋给x,将堆内存中Demo对象的首地址传给栈内存的d
4)通过读取d中存的首地址,找到堆内存中的Demo对象,将9赋给其中的成员x
5)读取 show(x) ,在栈内存中新建一个show方法的内存空间,并将变量d传递进去
6)执行 show 方法中的 d.x = 4 语句,因为show中的变量d存储的是堆内存中 Demo 对象的首地址,所以会将堆内存中的x值置为4
7)show方法执行完毕,执行弹栈操作
8)继续读取main方法中的执行语句,打印x的值,因为堆内存中的x值已经变化,所以最终的输出结果是 4
二、构造函数
1、定义:
关于构造函数的定义,我们可以简单理解为,构建创造对象时调用的函数
2、作用:
可以给对象进行初始化
3、特点
1)创建对象都必须要通过构造函数进行初始化
2)一个类中如果没有定义构造函数,Java会为该类创建一个默认的空参数构造函数,如:
class Person
{
Person() {} //为Person类创建一个空的构造函数
}
3)一个类中如果定义了构造函数,那么类中默认的构造函数就没有了
4、具体示例
class Person
{
private String name;
private int age;
//定义一个Person类的构造函数
Person() //构造函数,而且是空参数的
{
System.out.println("Person run");
}
}
class ConsDemo
{
public static void main(String[] args)
{
Person p = new Person(); //对新建的对象 p 进行初始化
}
}
运行结果
5、一般函数和构造函数的区别
构造函数:
1)对象创建时,就会调用与之对应的构造函数,对对象进行初始化
2)对象创建时,会被调用,且只调用一次
一般函数:
1)对象创建后,需要函数功能时才调用
2)对象创建后,可以被多次调用