基本数据类型为值传递
代码举例
public class JavaTest {
public void changeBasicDataTypeValue(int i) {
i = 2;
System.out.println(i);
}
public static void main(String[] args) {
JavaTest javaTest = new JavaTest();
int i = 1;
System.out.println("原始值");
System.out.println(i);
System.out.println("函数修改值");
javaTest.changeBasicDataTypeValue(i);
System.out.println("函数修改后mian中的值");
System.out.println(i);
}
}
结果输出
原始值
1
函数修改值
2
函数修改后mian中的值
1
解释
在mian函数中的int i为基本数据变量,所以是存储在mian栈帧的局部变量表中
在changeBasicDataTypeValue函数中的参数i也为基本数据变量,所以也存储在changeBasicDataTypeValue栈帧中,changeBasicDataTypeValue函数中将i赋值为2的操作对象为changeBasicDataTypeValue函数栈帧局部变量表的i对main函数栈帧局部变量表中的i没有影响
8大基本数据类型
public class JavaTest {
public void changeBasicDataTypeValue(byte b, short s, int i, long l, float f, double d, char c, boolean bool) {
b = 0;
s = 0;
i = 0;
l = 0;
f = 0.0F;
d = 0.0;
c = '0';
bool = false;
System.out.println("byte:" + b + "-" + "short:" + s + "-" + "int:" + i + "-" + "long:" + l + "float:" + f
+ "-" + "double:" + d + "char:" + c + "_" + "boolean:" + bool);
}
public static void main(String[] args) {
JavaTest javaTest = new JavaTest();
byte b = 1;
short s = 1;
int i = 1;
long l = 1;
float f = 1.0F;
double d = 1.0;
char c = '1';
boolean bool = true;
System.out.println("原始值");
System.out.println("byte:" + b + "-" + "short:" + s + "-" + "int:" + i + "-" + "long:" + l + "float:" + f
+ "-" + "double:" + d + "char:" + c + "_" + "boolean:" + bool);
System.out.println("函数修改值");
javaTest.changeBasicDataTypeValue(b, s, i, l, f, d, c, bool);
System.out.println("函数修改后mian中的值");
System.out.println("byte:" + b + "-" + "short:" + s + "-" + "int:" + i + "-" + "long:" + l + "float:" + f
+ "-" + "double:" + d + "char:" + c + "_" + "boolean:" + bool);
}
}
输出
原始值
byte:1-short:1-int:1-long:1float:1.0-double:1.0char:1_boolean:true
函数修改值
byte:0-short:0-int:0-long:0float:0.0-double:0.0char:0_boolean:false
函数修改后mian中的值
byte:1-short:1-int:1-long:1float:1.0-double:1.0char:1_boolean:true
非基本数据类型为引用传递
代码举例
class User {
String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
public class JavaTest {
public void changeUserName(User tempUser) {
tempUser.name = "change";
System.out.println(tempUser);
}
public static void main(String[] args) {
JavaTest javaTest = new JavaTest();
User user = new User("name");
System.out.println("原始值");
System.out.println(user);
System.out.println("函数修改值");
javaTest.changeUserName(user);
System.out.println("函数修改后mian中的值");
System.out.println(user);
}
}
结果输出
原始值
User{name='name'}
函数修改值
User{name='change'}
函数修改后mian中的值
User{name='change'}
解释
mian函数栈帧的user和changeUserName函数栈帧的tempUser都是指向堆中User实例对象的引用,changeUserName函数修改User的name属性,实际上修改的是堆中实例对象,而main函数局部变量表中user还是为堆中该对象。所以值改变了。
String
代码举例
public class JavaTest {
public void changeString(String str) {
str = "changeStr";
System.out.println(str);
}
public static void main(String[] args) {
JavaTest javaTest = new JavaTest();
String str = "mainStr";
System.out.println("原始值");
System.out.println(str);
System.out.println("函数修改值");
javaTest.changeString(str);
System.out.println("函数修改后mian中的值");
System.out.println(str);
}
}
结果输出
原始值
mainStr
函数修改值
changeStr
函数修改后mian中的值
mainStr
解释
个人理解为:String的s = “str"其实是在字符串常量池中创建一个"str"对象,然后s为指向"str”,是创建了一个字符串s,而不是将是s赋值为"str"
changeString()执行str = “changeStr”;前
changeString()执行str = “changeStr”;后
可以看到在执行后mian函数中的str指向的还是"mainStr"而changeString函数的str在运行时创建了一个新的字符串并将str指向新的字符串。