1. JVM
在jvm中,每一个线程都是有一个空间是保存方法调用的,被称为虚拟机栈,
调用方法其实就是往该线程下的虚拟机栈下填充栈帧。
在栈帧中有局部变量表,里面存储java基本类型以及对应的引用类型。
2. 基本类型传值
基本类型比如,int \ long 类型传入方法的时候,是会传值的,也就是会往该方法的栈帧中的局部变量表进行push一个值。
3. 基本类型的包装值引用传值
包装类型,比如Integer 传入方法的中,Integer是引用类型,这里到局部变量表也是引用类型,会引用jvm堆空间,如果integer的值在-127到128会放在常量池。
但是如果在方法修改了传入的值,按道理说传入的变量也会改变,但是修改的时候,其实是重新给局部变量对象重新指向了一个新的引用,原引用的内存的值还是不变的。
这里有一个点非常重要,那么为什么修改值是另一个对象,而不是原来的对象呢?其他对象修改了为什么不是其他对象呢?因为点进去String类或者Integer类,其被定位final类,也就是最终类,不可被修改类,因此无法修改对应的值,如果修改了,则是创建了一个新的对象。
4. String值引用传递
如第三点相同。
代码
public static void main(String[] args) {
Integer a = 3230;
add(a);
System.out.println(a);
int b = 322330;
addInt(b);
System.out.println(b);
String c = "Fdsa";
change(c);
System.out.println(c);
}
private static void change(String c) {
c = "fdsf";
}
public static void add(Integer a){
a += 3;
}
public static void addInt(int a){
a += 3;
}
输出