刚刚在网上看了很多资料,初涉这方面 知识,总结 一下! 若有不妥之处 望指正!
其实 在Java中 存在的是 值传递。那你可能会问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案是:值传递。首先不解析这个问题。讲一下基础。
对于基本类型:比如int a=4;a是直接放在 栈里面的。其值就为4.
对于引用类型:比如String str="java";其实str是在栈里 ,其值 为"java"对象的引用,即地址值。所以理解这个之后你就可以往下看了!
对于str="java";str="sb";这俩行代码 的理解是什么?首先 str 指向 "java",之后str重新指向“sb”;注意原有的“java”并未改变。
public class Employee {
public int age;
public Employee(int a){
age=a;
}
public static void changeEmployeeAge(Employee em){
em.age=50;
}
}
package string;
public class Testmain {
static void foo(String text){
text="windows";
}
public static void main(String[] args){
Employee employee=new Employee(10);
Employee.changeEmployeeAge(employee);
System.out.println(employee.age);
//int a[]={2,5};
//int[]b=a;
//b[1]=10;
//System.out.println(a[1]);
String str="sbbbbb";
foo(str);
System.out.println(str);
}
}
现在来解决这个问题:上面代码是这个问题的实例化。注意当employee 作为参数传递时 em 也同时获得了 其地址值,即em 和 employee 同时指向 employee这个对象
而em.age=50;则直接改变了 这个对象的值。所以 最后输出是50;没毛病的。
而若 你把 Employee 的changeEmployeeAge() 方法改为如下
package string;
public class Employee {
public int age;
public Employee(int a){
age=a;
}
public static void changeEmployeeAge(Employee em){
em=new Employee(50);
}
}
那么 结果会是什么?答案是:并未改变 输出10;为什么呢?em指向 新的对象而就对象并未改变。employee还是指向之前的对象。(如果你深刻理解了我前面讲得基础的话)代码最好自己写一下 运行一下 (题外话 :如果我讲得有一点让你有收获的话 点个赞把! 我还没被赞过呢)