Java基础 值传递和引用传递
1.问题描述
由于Java中是没有指针的,Java中只存在值传递,只存在值传递!!!!‘
在实际使用中,我们经常使用对象的传递,这种看起来很像引用传递,可以改变对象中某个属性的值。但在底层运用中,这种传递实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。
综上,对于Java中方法值传递的问题,可以分为以下两点:
- 对于八种基本数据类型来说,在传递过程中,会自动生成一个新的基本数据。对于基本的数值类型其实传递的是一份数值的拷贝,传入函数之后跟原来的值就没有关系了,在函数中改变这个数的值也不会影响到原来的值。
- 对于引用数据来说,在传递过程中,会将方法调用处的对象地址赋给方法列表中的参数,而不是生成一个新的对象。
2.代码测试
2.1 基本数据类型
public class Question1 {
public static void main(String[] args) {
int a=10;
System.out.println("方法执行前");
show(a);
changeA(a);
System.out.println("方法执行后");
show(a);
}
private static void changeA(int a) {
a=100;
System.out.println("方法执行期间");
show(a);
}
private static void show(int a) {
System.out.println("a的值是:"+a);
}
}
输出
方法执行前
a的值是:10
方法执行期间
a的值是:100
方法执行后
a的值是:10
2.2 对象数据类型:
public class Question1_2 {
public static void main(String[] args) {
User user =new User("tom",1);
System.out.println("方法执行前");
show(user);
changeUser(user);
System.out.println("方法执行后");
show(user);
}
private static void changeUser(User user) {
user=new User("jary",2);
System.out.println("方法执行中");
show(user);
}
private static void show(User user) {
System.out.println(user.toString());
}
}
输出:
方法执行前
User{name='tom', age=1}
方法执行中
User{name='jary', age=2}
方法执行后
User{name='tom', age=1}
3 解析
对于基本数据类型,相当于重现创建了一个基本数据类型,只是在数值上与原有的一样。方法内部改变数据后,也不会对方法外部的原有的值进行任何改变。
对于对象数据类型,相当于把自己的地址值传递给了方法内部的对象引用。若方法内部的都对象引用对指向的对象进行了内部改变(改变了对象内部的属性),则将会直接影响方法外部的数据;若方法内部的对象引用进行了对象间的改变(重现生成了一个对象,或者对对象引用进行了指向性的改变),则不会改变方法外部的任何值,因为外部a的对象引用没变。
4 结论
因此,Java中只存在值传递,对于基本数据类型,相当于重新创建一个值,并将原来的值赋给方法内的类型。对于对象数据类型,相当于把方法外部的地址值传递给了方法内部的对象引用。
标签:Java,show,对象,数据类型,传递,引用,方法,user From: https://www.cnblogs.com/weliars/p/16739704.html