8000 Merge pull request #6 from kinglaw1204/patch-1 · codeemma/Java-Guide@2f7d90c · GitHub
[go: up one dir, main page]

Skip to content

Commit 2f7d90c

Browse files
authored
Merge pull request Snailclimb#6 from kinglaw1204/patch-1
Update 第一周(2018-8-7).md
2 parents f4038e4 + 4895514 commit 2f7d90c

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,17 @@ public static void change(int[] array) {
133133

134134
因为在`change1`方法内部我们是新建了一个StringBuffer对象,所以`str`指向了另外一个地址,相应的操作也同样是指向另外的地址的。
135135

136+
把上面的代码解析成字节码分析就比较直观了,change1()方法解析成字节码如下:
137+
```
138+
0 new #2 <java/lang/StringBuffer>
139+
3 dup
140+
4 ldc #8 <abc>
141+
6 invokespecial #4 <java/lang/StringBuffer.<init>>
142+
9 astore_0
143+
10 return
144+
```
145+
我们知道,每个方法都是一个栈帧,每个栈帧都维护有一个局部变量表,分析第6步,发现调用了stringBuffer方法的初始化,也就是执行了```new StringBuffer("abc");```方法,接下来第9步是把栈顶的对象(也就是调用chang1方法传来的StringBuffer引用)加载进局部变量表弟一个slot中,接着方法就结束了,所以这个引用直接存到了change1的局部变量表中,而method1中输出的str还是自己的局部变量表中的引用,所以,change方法并不影响输出结果。
146+
136147
那么,如果将`change1`方法改成如下图所示,想必大家应该知道输出什么了,如果你还不知道,那可能就是我讲的有问题了,我反思(开个玩笑,上面程序中已经给出答案):
137148

138149
```

0 commit comments

Comments
 (0)
0