结论:
1.参数为基础类型(int,long,short等)时,本质为值传递,即对参数的任何操作都不会对原数据有影响。
2.参数为对象(实例化new出来的)时,本质为引用传递,参数地址指向原数据地址,即任何操作都是在操作原数据。
JAVA 演示功能代码:
import com.zzg.entity.Person;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
public class TransferTest {
public static void main(String[] args) {
String str = "Hello Java 8";
/**
* 基本类型按值传递
*/
System.out.println("str update before:" + str);
updateString(str);
System.out.println("str update after:" + str);
Person person = new Person();
person.setName("zzg");
person.setAge(30);
person.setHeight(2);
/**
* 对象类型:按照地址传递
*/
System.out.println("person update before:" + person.toString());
updatePerson(person);
System.out.println("person update after:" + person.toString());
/**
* 对象类型:传递对象不修改原有对象通过,实现Cloneable 接口,覆写Object.clone() 方法实现。
*/
System.out.println("clone person update before:" + person.toString());
cloneUpdatePerson(person);
System.out.println("clone person update after:" + person.toString());
}
public static void updateString(String str) {
str = "Hello Python3";
}
public static void updatePerson(Person person) {
person.setName("zzy");
person.setAge(2);
person.setHeight(1);
}
public static void cloneUpdatePerson(Person person) {
Person clonePerson = null;
try {
clonePerson = (Person) person.clone();
} catch (CloneNotSupportedException e) {
System.out.println("Person clone Object is failed");
return;
}
clonePerson.setName("zzy");
clonePerson.setAge(2);
clonePerson.setHeight(1);
}
}
package com.zzg.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable {
private String name;
private Integer age;
private Integer height;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
运行结果:
str update before:Hello Java 8
str update after:Hello Java 8
person update before:Person(name=zzg, age=30, height=2)
person update after:Person(name=zzy, age=2, height=1)
clone person update before:Person(name=zzy, age=2, height=1)
clone person update after:Person(name=zzy, age=2, height=1)