From 48955149450db8d8307e16889113f5c3fa7c37c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=9C=A8=E5=8C=A0?= Date: Sun, 12 Aug 2018 16:51:32 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E7=AC=AC=E4=B8=80=E5=91=A8=EF=BC=8820?= =?UTF-8?q?18-8-7=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完善下StringBuffer类型传递 中method1()方法和change1()输出结果原因分析。 --- .../第一周(2018-8-7).md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md b/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md index 4382fab6..c660a745 100644 --- a/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md +++ b/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md @@ -133,6 +133,17 @@ public static void change(int[] array) { 因为在`change1`方法内部我们是新建了一个StringBuffer对象,所以`str`指向了另外一个地址,相应的操作也同样是指向另外的地址的。 +把上面的代码解析成字节码分析就比较直观了,change1()方法解析成字节码如下: +``` + 0 new #2 + 3 dup + 4 ldc #8 + 6 invokespecial #4 > + 9 astore_0 +10 return +``` +我们知道,每个方法都是一个栈帧,每个栈帧都维护有一个局部变量表,分析第6步,发现调用了stringBuffer方法的初始化,也就是执行了```new StringBuffer("abc");```方法,接下来第9步是把栈顶的对象(也就是调用chang1方法传来的StringBuffer引用)加载进局部变量表弟一个slot中,接着方法就结束了,所以这个引用直接存到了change1的局部变量表中,而method1中输出的str还是自己的局部变量表中的引用,所以,change方法并不影响输出结果。 + 那么,如果将`change1`方法改成如下图所示,想必大家应该知道输出什么了,如果你还不知道,那可能就是我讲的有问题了,我反思(开个玩笑,上面程序中已经给出答案): ```