java只有值传递。引用传递的说法是不对的。 那么为什么有些基础类型比如int 是值传递,有些类型如Object 类型是“引用传递”,注意这里的引用传递加了双引号,因为传递对象表现上是为引用。实际上是 值传递了 对象 的地址。 我们看一下例子:
package java对象引用;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String [] Args) {
Result r = process() ;
List<DataBean> datas = (List<DataBean>) r.getData();
//改变前
System.out.println("改变前");
for (DataBean d: datas
) {
System.out.println(d.getName());
}
change(r) ; //值传递
//改变后
System.out.println("改变后");
for (DataBean d: (List<DataBean>) r.getData()
) {
System.out.println(d.getName());
}
}
public static Result process() {
Result result = new Result() ;
List<DataBean> datas = new ArrayList<>();
for(int i = 0 ; i< 3 ; i++) {
DataBean data = new DataBean() ;
data.setName("name"+i);
datas.add(data) ;
}
result.setData(datas);
return result;
}
public static void change(Result r){
List<DataBean> datas = new ArrayList<>() ; // 方式二
datas = (List<DataBean>) r.getData();
//改变1
datas.get(0).setName("000000000");
datas.get(1).setName("111111111");
//改变2
for(int i = 2;i<3;i++){
DataBean d = new DataBean();
d = datas.get(i) ;
d.setName("局部变量改变,也影响");
}
}
}
class DataBean{
private String name ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Result {
private Object data ;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
我们定义了一个可以存放任意类型的Result 类,然后又定义了一个DataBean 类用来存数据。
process()初始化了 Result ,在主函数里 调用change(Result) 将result 值传递。
运行结果如下:
最后的结果还是改变了。