传值与传引用
值调用:接收调用者提供的值
引用调用:接收调用者提供的变量地址
注:引用调用的值可以被修改,但是值调用不可以
-------------------------------------------------------------------------------------------------------
JAVA数据传递全部使用了值传递,针对于JAVA常规类型int、float等都是值传递,没有任何争议,存在异议的地方一般在于JAVA类的传递。
例:定义class:
package com.company;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public void printParm() {
System.out.println("The name is: " + name);
System.out.println("The age is: " + age);
}
}
class很简单,只有连个属性:name和ageMain函数
package com.company;
public class Main {
private static String newName= "Oldest man";
private static int newAge= 100;
private static User newUser= new User(newName, newAge);
private static void setParm(User user, String newName, int newAge) {
user.setName(newName);
user.setAge(newAge);
}
private static void setNewUser(User oldUser){
newUser.setAge(100);
oldUser = newUser;
}
public static void main(String[] args) {
// write your code here
User man = new User("man",25);
User woman = new User("woman", 22);
System.out.println("Before setParm:");
man.printParm();
setParm(man, "new man", 10);
System.out.println("After setParm:");
man.printParm();
System.out.println(" ");
System.out.println("Before setNewUser:");
woman.printParm();
setNewUser(woman);
System.out.println("After setNewUser:");
woman.printParm();
}
}
最终的运行结果:
可以看到调用setParm和调用setNewParm得到的结果不同,其中setParm修改了name和age的值,而setNewUser没有。依次分析一下:SetParm函数调用情况
在main函数中创建了明为man的实例,这是会在堆中创建一个User的实例,假设在堆中的地址为XX1,这是会在main函数栈中创建一个名为man的变量,man的类型为User的引用,其内存空间中放置的为XX1的值(User实例的引用)
调用函数setParm时,会在main自身的栈空间中构造出一个输入变量user,其类型为User的引用个,当调用函数时,user中存放的是XX1的值
当调用函数时,user和man中保存的是相同的地址,指向了同一个User实例,所以修改了实例XX1中的属性值。
setNewUser:
初始时,在静态变量区构建了User的实例XX3,且构建了User的引用newUser指向了XX3;在main函数堆中构建了User的实例XX2,且在main的栈中构建了User的引用women。
调用函数setNewUser时,会在main的栈中构建User的引用oldUser,当开始调用函数时,woman的值会传递给oldUser,这是oldUser也指向了XX2。
当调用到赋值语句时,newUser的值会赋值给oldUser,这是oldUser指向了XX3,但是women的值依旧为XX2,没有任何改变