值传递:在调用函数的时候,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改的 时候,就不会影响到原来的实际参数 引用传递:在调用函数的时候,将实际参数的地址直接传递函数中,这样在函数中对参数进行修改 的时候,就会影响到实际参数 值传递 引用传递 根本区别 会创建一个副本(copy) 不创建副本 结果 函数中无法改变原来的对象 函数可以改变原来的对象 将对象创建好了之后将信息传给了函数 在函数中对原来传入的值进行了改变, 主函数中的对象的值也改变了. 那么这里就是引用传递,并且所有的对象的地址都是相同 只要有一个函数对其进行了改变,那么对象的值就变了 java中的基本年数据类型都是值传递,引用数据类型中的String也是值传递 引用数据类型除了String之外都是引用传递
值传递:
package cn.java.Demo;
/**
* 通过运行结果我们知道,str的值发生了改变,但是s的值没有发生改变还是原来的值
* 所有
* String类型是一个值传递
* 调用函数对String类型进行赋值的时候, str = "哈哈哈哈"; 相当于做了一个创建
* 对象的操作 str = new String("哈哈哈哈");
* 这里我们可以理解为变量str重新创建了一个新的对象指向新的地址
*/
public class Demo_02 {
public void pass(String str){
System.out.println("str === " + str.hashCode());
str = "哈哈哈哈";
System.out.println("str = " + str);
System.out.println("str === " + str.hashCode());
}
public static void main(String[] args) {
Demo_02 demo_02 = new Demo_02();
String s = "呵呵呵";
System.out.println("s === " + s.hashCode());
demo_02.pass(s);
System.out.println("s = " + s);
System.out.println("s === " + s.hashCode());
}
}
运行结果:
引用传递:
先创建一个实体类:
package cn.java.Demo;
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
* 将对象创建好了之后将信息传给了函数
* 在函数中对原来传入的值进行了改变,
* 主函数中的对象的值也改变了.
* 那么这里就是引用传递,并且所有的对象的地址都是相同
* 只要有一个函数对其进行了改变,那么对象的值就变了
* java中的基本年数据类型都是值传递,引用数据类型中的String也是值传递
* 引用数据类型除了String之外都是引用传递
*/
public class Demo_03 {
public void pass(User user){
System.out.println("2 " + user.hashCode());
user.setName("李四");
user.setAge(20);
System.out.println(user.toString());
System.out.println("3 " + user.hashCode());
}
public static void main(String[] args) {
Demo_03 demo_03 = new Demo_03();
User user = new User("张三",18);
System.out.println("1 " + user.hashCode());
System.out.println(user.toString());
demo_03.pass(user);
System.out.println(user.toString());
System.out.println("4 " + user.hashCode());
}
}
运行结果: