package com.yzy.memorymap;
/**
* @className Test1.java
* @author yangsir
* @version V1.0
* @date 2019年7月31日-上午9:12:46
* @description
*
*/
public class Test1 {
public static void main(String argv[]) {
Test1 t = new Test1();// 调用非静态的方法要创建对象
t.first();// 调用first方法
}
public void first() {
int i = 5;// 给局部变量i赋值
Value v = new Value(); // v.i = 15 i = 5 创建一个对象初始值为成员变量的初始值
v.i = 25; // v.i = 25 i= 5 将25赋值给v堆中的i
second(v, i);// v.i = 25 i = 5 此时v = v.i=25,i为局部变量的值,调用second方法
System.out.println(v.i);// 最后val被销毁,所以v.i = second里面第二行的赋值,即v.i=20
}
public void second(Value v, int i) {
i = 0;// v = 25 i=0 此时first中的局部变量已经销毁,0赋值给i
v.i = 20; // v.i = 20 i= 0 此时将v堆中的i v.i = 20
Value val = new Value(); // v = 15 i = 0 新创建一个对象 初始值为成员变量的初始值
v = val;// v.i = 15 i = 0 将新对象的地址值给之前对象
System.out.println(v.i + " " + i);// v.i = 15 i = 0 所以输出的为新对象的地址访问的值
}
}
class Value {
int i = 15;
}
下面附一张我画的内存草图
![内存分配图 值类型和引用类型作为方法参数的区别_System](//dev-img.mos.moduyun.com/20231113/abb8f32d-b32d-446b-9cff-3ba18c976341.png)
总结:值类型的数据在不同的方法中不相同,引用类型共享一个堆中的数据。