大家都知道在java中只有值传递,关于这个问题自己也是懵懵懂懂,不写项目终于可以整理自己想要梳理的东西啦~~
值传递和引用传递:
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。表示方法接收的是调用者提供的值
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数。表示方法接收的是调用者提供的变量地址
值传递 | 引用传递 | |
根本区别 | 会创建副本Copy | 不创建副本 |
所以 | 函数中无法改变原始对象 | 函数中可以改变原始对象 |
java语言的方法调用只支持参数的值传递。
参数的传递分为两种:基本类型,引用类型。
基本数据类型
相信大家都没有什么问题,基本类型作为参数传递时在一个方法栈中开辟了一块新内存,拷贝原来的数据值,所以无论我们如何修改,原来的数据值不会受到任何影响。
如:
public class TestNum {
public static void main(String[] args) {
int a = 6;
System.out.println(a);
changNum(a);
System.out.println(a);
}
public static void changNum(int b){
b = 88;
}
}
输出的结果:
6
6
没有任何变化!!!!!
基本数据类型的值传递,不改变原值。因为调用后就会弹栈,局部变量随之消失。String类虽然是引用数据类型,但是它当做参数传递时是和基本数据类型一样的
引用数据类型
我们知道引用的数据存储在栈内存中,而引用指向的对象存储在堆内存中。当引用作为方法参数传递给方法的时候,是将引用的值拷贝一份给另一个引用,但引用指向的都是同一个堆内存,所以进行的修改操作同样有效。
如:
public class TestNum {
People p = new People("张三");
public static void main(String[] args) {
TestNum n = new TestNum();
System.out.println("调用change方法前:"+n.p.getName());
changName(n.p);
System.out.println("调用change方法后:"+n.p.getName());
}
public static void changName(People people){
people.setName("李四");
System.err.println("方法体内:"+people.getName());
}
}
class People{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public People(String name) {
this.name = name;
}
}
运行结果:
由于changeName方法为静态方法,当类加载时便会先进行加载。 引用类型中,形参能够改变实参的值,或者一个引用能够改变另一个引用的值,仅仅是因为他们栈内存中存储的值相同,但这个值是随时可以修改的。
在来看一个例子:
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf = new StringBuffer("Hi ");
strBuf.append("World!");
}
}
你猜测的结果是什么呢??????
运行结果如下:
对象作为参数传递时,同样是在方法内改变了对象的值,为什么有的是改变了原对象的值,而有的并没有改变原对象的值呢?
在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
总结一下Java中方法参数的使用情况:
一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
一个方法可以改变一个对象参数的状态。
一个方法不能让对象参数引用一个新的对象。
java中只有值传递,因为地址值也是值。
希望对看到的小伙伴们有所帮助,如有不同意见欢迎留言,喜欢的朋友希望多多支持!!!