java 传值传引用
- 值传递:传递的只是值的地址(副本),方法中对副本进行修改,不会影响调用方。
- 引用传递:传递的是引用的副本,方法中更改属性值会影响此地址中的数值。此时形参和实参是同一个内存地址。
- 空指针异常:访问一个对象的属性或方法,出现对象值为null。只有地址,地址中没有属性值,故为空指针。
例子
public class Main {
public void changeInt(int age) {
age = 20;
}
public void changeObj(User user) {
user.age = 30;
}
public static void main(String[] args) {
//创建一个Main的对象
Main m = new Main();
//创建一个User对象
User u = new User();
u.age = 10;
m.changeInt(u.age);
System.out.println(u.age); //输出结果:10
m.changeObj(u);
System.out.println(u.age);///输出结果:30
主方法中u.age中确定了10,第一个输出调用u.age的地址(传引用),于是结果为10;第二个输出语句传值,u在之前已经声明为30故输出为30。
下面针对String型数据的传值传引用进行探讨。
public static void main(String[] args){
Main a =new Main();
User u=new User();
u.a="abc";
u.b="abc";
u.c="a"+"b"+"c";
u.d="ab";
u.e="d"+"c";
String f=new String("abc");
System.out.println(u.a);
System.out.println(u.b);
System.out.println(u.c);
System.out.println(u.d);
System.out.println(u.e);
System.out.println(u.f);
输出结果
总结:
基本类型(byte,short,int,long,double,float,char,boolean)为传值;对象类型(Object,数组,容器)为传引用;String、Integer、Double等immutable类型因为类的变量设为final属性,无法被修改,只能重新赋值或生成对象。当Integer作为方法参数传递时,对其赋值会导致原有的引用被指向了方法内的栈地址,失去原有的的地址指向,所以对赋值后的Integer做任何操作都不会影响原有值。
————————————————
版权声明:本文为CSDN博主「编码小农」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36759405/article/details/82764339
参考链接:Java 传值和传引用的区别