1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

Merge pull request #6 from kinglaw1204/patch-1

Update 第一周(2018-8-7).md
This commit is contained in:
Snailclimb 2018-08-14 10:02:21 +08:00 committed by GitHub
commit 2f7d90c140
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -133,6 +133,17 @@ public static void change(int[] array) {
因为在`change1`方法内部我们是新建了一个StringBuffer对象所以`str`指向了另外一个地址,相应的操作也同样是指向另外的地址的。 因为在`change1`方法内部我们是新建了一个StringBuffer对象所以`str`指向了另外一个地址,相应的操作也同样是指向另外的地址的。
把上面的代码解析成字节码分析就比较直观了change1方法解析成字节码如下
```
0 new #2 <java/lang/StringBuffer>
3 dup
4 ldc #8 <abc>
6 invokespecial #4 <java/lang/StringBuffer.<init>>
9 astore_0
10 return
```
我们知道每个方法都是一个栈帧每个栈帧都维护有一个局部变量表分析第6步发现调用了stringBuffer方法的初始化也就是执行了```new StringBuffer("abc");```方法接下来第9步是把栈顶的对象也就是调用chang1方法传来的StringBuffer引用加载进局部变量表弟一个slot中接着方法就结束了所以这个引用直接存到了change1的局部变量表中而method1中输出的str还是自己的局部变量表中的引用所以change方法并不影响输出结果。
那么,如果将`change1`方法改成如下图所示,想必大家应该知道输出什么了,如果你还不知道,那可能就是我讲的有问题了,我反思(开个玩笑,上面程序中已经给出答案): 那么,如果将`change1`方法改成如下图所示,想必大家应该知道输出什么了,如果你还不知道,那可能就是我讲的有问题了,我反思(开个玩笑,上面程序中已经给出答案):
``` ```