定义
传值
传递的是值的副本。方法中对副本的修改,不会影响到调用方
传引用:
传递的是引用的副本,共用一个内存,会影响到调用方。
此时,形参和实参指向同一个内存地址。
注意: 对引用副本本身(对象地址)的修改,如设置为null,重新指向其他对象,不会影响到调用方。
基本数据类型
/**
* @author Wgs
* @version 1.0
* @create:2018/10/27
*/
public class ParamChangeValue {
public static void main(String[] args) {
int i = 5;
System.out.println("args = [" + i + "]");
change(i);
System.out.println("args = [" + i + "]");
}
private static void change(int i) {
i = 1 + 5;
}
}
输出
args = [5]
args = [5]
对象
/**
* @author Wgs
* @version 1.0
* @create:2018/10/27
*/
public class ObjectChangeValue {
private int age;
private String name;
@Override
public String toString() {
return "ObjectChangeValue{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public static void main(String [] args){
ObjectChangeValue objectChangeValue = new ObjectChangeValue();
objectChangeValue.setAge(2);
objectChangeValue.setName("tom");
System.out.println(objectChangeValue);
change(objectChangeValue);
System.out.println(objectChangeValue);
}
private static void change(ObjectChangeValue objectChangeValue) {
objectChangeValue.setName("jack");
objectChangeValue.setAge(23);
}
}
输出
ObjectChangeValue{age=2, name='tom'}
ObjectChangeValue{age=23, name='jack'}
注:如果对象被重新创建或赋值为null,即new则会重新指向其他对象,不影响其远对象的值
/**
* @author Wgs
* @version 1.0
* @create:2018/10/27
*/
public class ObjectChangeValueNew {
private int age;
private String name;
@Override
public String toString() {
return "ObjectChangeValue{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
ObjectChangeValueNew objectChangeValue = new ObjectChangeValueNew();
objectChangeValue.setAge(2);
objectChangeValue.setName("tom");
System.out.println("args = [" + objectChangeValue + "]");
change(objectChangeValue);
System.out.println("after args = [" + objectChangeValue + "]");
}
private static void change(ObjectChangeValueNew objectChangeValue) {
objectChangeValue = new ObjectChangeValueNew();
objectChangeValue.setName("jack");
objectChangeValue.setAge(23);
System.out.println(objectChangeValue);
}
}
输出
args = [ObjectChangeValue{age=2, name='tom'}]
ObjectChangeValue{age=23, name='jack'}
after args = [ObjectChangeValue{age=2, name='tom'}]
String、Integer、Long等
public class StringChangeValue {
public static void main(String[] args) {
String s = "test1";
System.out.println("args = [" + s + "]");
change(s);
System.out.println("args = [" + s + "]");
}
private static void change(String i){
i = i + " test value";
}
}
输出
args = [test1]
args = [test1]
总结
基本类型(byte,short,int,long,double,float,char,boolean)为传值
对象类型(Object,数组,容器)为传引用
String、Integer、Double等immutable类型因为类的变量设为final属性,无法被修改,只能重新赋值或生成对象。
当Integer作为方法参数传递时,对其赋值会导致原有的引用被指向了方法内的栈地址,失去原有的的地址指向,所以对赋值后的Integer做任何操作都不会影响原有值。
网友评论