关于堆栈的简单分析
代码片:
public static void main(String[] args) { Integer a = 1; Integer b = 2; System.out.println("before swap a=" + a +",b=" + b); //swap()实现 swap(a, b); System.out.println("after swap a=" + a +",b=" + b); } private static void swap(Integer num1, Integer num2) { Integer tmp = num1; num1 = num2; num2 = tmp; }
运行结果:
before swap a=1,b=2 after swap a=1,b=2
大家会发现其中的值并没有发生变化,可是为什么话出现这样的结果呢?就让我们一探究竟吧!
以上是堆栈的存储示意图HEAP堆中咱们一般所存储的是对象的一些值,而STACK栈内存中一般是变量本身指向heap区。A和B所指向的都是堆内存中的地址。而num1和num2是相当于A和B的一个副本所以他们所指向的值的地址是一致的。那么,为什么最终所得到的结果是一致的呢?很简单,num1和num2只是A和B的一个副本他们本身所指向的地址是没有变的。
integer底层是由final来修饰的所以他的地址是不会发生改变的。那么,我们应该如何来赋值呢?
integer内部是如何赋值的呢?
查看其字节码文件,int类型的变量,值压到了栈顶调用了integer.valueOF。
我们接下来可以使用反射来进行实现。稍后分析………………