值传递:在调用函数的时候,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改的时候,就不会影响到原来的实际参数 引用传递:在调用函数的时候,将实际参数的地址直接传递函数中,这样在函数中对参数进行修改的时候,就会影响到实际参数值传递 引用传递 根本区别 会创建一个副本(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;}@Overridepublic 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());}
}
运行结果: