值传递和引用传递
值传递是:
基本类型的数据的传递.
因为基本数据类型在栈中存储,不同的方法栈区不同,基本数据类型的数据作为方法的参数进行传递,那么方法中会另外开辟一个新的内存空间。跟原来的内存空间不是一个内存空间,如果在方法中对参数值进行更改,不会影响原来内存空间的值.如果非要获取方法中修改后的值,则需要把修改后的值返回回来(也就是return)。
引用传递:
传递的是数组,对象,以及堆中的数据的传递.
如果传递的是对象或者数组,这些都是存放在堆空间中的,都是同一份内存空间,如果在方法中引用的对象或者数组做任何的修改都会影响原来内存空间的值,即修改了原来内存空间,其实操作的是同一份内存空间.
所以值传递和引用传递的本质不同:
是一份内存空间还是二份内存空间的问题.
public class Demo1 {
/**
* 此方法演示值传递,但是注意没有返回值
* @param a
*/
public void valueTransfer(int a){
a=100;
System.out.println(a);
}
/**
* 此方法演示值传递,但是有返回值
* @param a
*/
public int valueTransfer1(int a){
a=100;
return a;
}
/**
* 引用传递
* @param args
*/
public void referenceTransfer(Student stu){
stu.setAge(stu.getAge()+1);
stu.setName("ee");
stu.setStuNo("s003");
}
public static void main(String[] args) {
Demo1 d1=new Demo1();
int a=10;
d1.valueTransfer(a);
System.out.println("a="+a);
a=d1.valueTransfer1(a);
System.out.println("a="+a);
Student stu=new Student();
d1.referenceTransfer(stu);
System.out.println("age="+stu.getAge());
System.out.println("name="+stu.getName());
System.out.println("stuNo="+stu.getStuNo());
}
}
结果:
100
a=10
a=100
有参数构造
无参数构造
age=19
name=ee
stuNo=s003