购物网站开发流程,使用wordpress版权,ui培训班学费多少钱,搭建网站源码我相信很多刚学Java的小伙伴都很难理解Java到底是值传递还是引用传递的问题#xff0c;但肯定背过这道面试题。确实#xff0c;Java就是值传递#xff0c;那什么原理呢#xff1f;请往下看。
我们先看一段代码#xff1a;分析一下这两句打印的结果分别是什么。
public c…我相信很多刚学Java的小伙伴都很难理解Java到底是值传递还是引用传递的问题但肯定背过这道面试题。确实Java就是值传递那什么原理呢请往下看。
我们先看一段代码分析一下这两句打印的结果分别是什么。
public class Test {public static void main(String[] args) {double percent 10;tripleValue(percent);System.out.println(percent的值为 percent);}public static void tripleValue(double x){x 3 * x;System.out.println(x的值为 x);}
}
x的值为30.0
percent的值为10.0
可能有小伙伴会问了我明明将变量percent传到tripleValue方法中了并在方法内将值乘以了3那x和percent的值都应该是30.0啊
嗯按逻辑讲确实是这样但Java却不是这么做的它在你传参的时候偷偷的将percent变量拷贝了一个“副本”也就是x后面再用3 * x的时候其实乘以的是副本早就不是你传的percent变量了等tripleValue方法结束参数变量x就被干掉了。 那么肯定又有小伙伴问了你基本数据类型勉强算你过关那我传个Java对象总能破你的局了吧我就不信传一个对象地址你还没影响
嗯还真是有影响但你还破不了我的局请看如下代码假如我想将员工的工资提高三倍如果这个员工是我就好了
public class Test {public static void main(String[] args) {Employee e new Employee(); //创建员工对象e.setSalary(10.0); //设置e员工的工资为10tripleSalary(e);System.out.println(e的工资为 e.getSalary());}public static void tripleSalary(Employee x){double addSalary x.getSalary() * 3; //为员工涨工资x.setSalary(addSalary);System.out.println(x的工资为 x.getSalary());}
}
x的工资为30.0
e的工资为30.0
从结果上来看实现方法改变对象参数的状态是完全可以的。理由也很简单方法得到的是对象引用的“副本”原来的对象引用和这个副本都引用同一个对象就类似于这样 在传参的时候依然搞了一个副本x但x和e指向的是同一个对象地址所以x改了e也改。 我们再通过一个例子来让你完全理解到底是值传递还是引用传递下面来编写一个交换两个 Employee 对象的方法
public static void swap(Employee x, Employee y){Employee temp x;x y;y temp;
}
如果 Java 对对象采用的是按引用调用那么这个方法就应该能够实现交换
Employee a new Employee();
Employee b new Employee();
System.out.println(a的地址值为 a);
System.out.println(b的地址值为 b);
swap(a, b);
System.out.println(交换后a的地址值为 a);
System.out.println(交换后b的地址值为 b);
a的地址值为com.example.test.controller.Employee5caf905d
b的地址值为com.example.test.controller.Employee27716f4
交换后a的地址值为com.example.test.controller.Employee5caf905d
交换后b的地址值为com.example.test.controller.Employee27716f4
从结果上看出a和b并没有实现交换其实原因很简单在传递参数的过程中还是拷贝了两个副本a的副本是xb的副本是y方法中交换的也是x和y交换压根没a和b什么事所以可以得出结论Java是值传递。