值传递
值传递,像int,float之类的简单类型进行的是值传递
public static void main(String[] args) {
int i = 900;
System.out.println(i);
changeInt(i);
System.out.println(i);
}
public static void changeInt(int s) {
s = 34234;
}
值传递,int之类的简单类型把自己的“COPY”传递给了参数,虽然在方法中改变了形式参数s的值,但对原来的i并没有影响,changInt修改的是“拷贝”
引用传递
引用传递,复杂对象(自己创建的类什么的)作为参数传递的时候就是进行的引用传递,引用传递没有“COPY”或者“拷贝”的概念,因此在方法中改变复杂对象参数的值就相当于改变原来的值
ObjParam类:
package com.feng.reference.obj;
public class ObjParam {
private int a;
private String str;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
方法:
public void changeObj(ObjParam param) {
param.setA(100);
param.setStr("你好");
}
ObjParam obj = new ObjParam();
obj.setA(10);
obj.setStr("哈哈");
ChangeParam change = new ChangeParam();
System.out.println(obj.getA() + " " + obj.getStr());
change.changeObj(obj);
System.out.println(obj.getA() + " " + obj.getStr());
输出结果:
10 哈哈
100 你好
String类型
public static void main(String[] args) {
String s = "java test";
System.out.println(s);
changeString(s);
System.out.println(s);
}
public static void changeString(String str) {
str = "3gg over right";
}
输出结果:
java test
java test
String的值并没有改变
因为是这样的:
String被设计为不可修改的类型,也就是对String对象的任何修改都将重新创建一个对象而放弃以前的内存空间的引用!
如上例:
比如 s指向0x2344, 当它赋值给str时str也同样指向了0x2344.而当 执行str="3gg over right"后,str指向了别的地方。也许是
0x2222或者其他,反正不是0x2344了。所以当你输出s的时候,它的值并没有被修改!