黑马程序员技术交流社区

标题: 为什么不是空呢 [打印本页]

作者: 正阳门下    时间: 2016-1-21 01:33
标题: 为什么不是空呢
public static void main(String[] args) {
                StringBuilder sb = new StringBuilder();
               
                sb.append("abc");
               
                insert(sb);
               
                System.out.println(sb);
        }

        public static void insert(StringBuilder sb) {
                sb.append("def");
                sb = null;
        }
大神请告诉我为啥不是null呢
作者: 西贝    时间: 2016-1-21 10:17
骚等我来画个内存图给你解释
作者: 西贝    时间: 2016-1-21 10:36
C:\Users\jiayu\Desktop\expression.jpg
作者: 西贝    时间: 2016-1-21 10:37
图片来了

expression.jpg (19 KB, 下载次数: 24)

expression.jpg

作者: 西贝    时间: 2016-1-21 10:39
能看的清楚么?

expression.jpg (19 KB, 下载次数: 15)

expression.jpg

作者: Mayer    时间: 2016-1-21 12:41
  1. class Test{
  2. public static void main(String[] args) {
  3.                 StringBuilder sb = new StringBuilder();
  4.                
  5.                 sb.append("abc");
  6.                 //sb=null;  题外话:但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。
  7.                 insert(sb);
  8.                
  9.                 System.out.println(sb);
  10.         }

  11.         public static void insert(StringBuilder sb) {
  12.                 sb.append("def");
  13.                 sb = null;//使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。
  14.                                  //让一个非null的引用类型变量指向null,等待JVM垃圾回收机制去回收,内存中的内容任然存在。
  15.                                 //在sb被回收前,sb的内容能被打印出来。
  16.                                 //你可以试试其它的引用类型变量赋值后指向null;我试过数组也能打印出来。
  17.         }  
  18. }
复制代码

作者: 正阳门下    时间: 2016-1-21 23:51
西贝 发表于 2016-1-21 10:39
能看的清楚么?

看的不是很清楚,但是基本上看明白了,谢谢
作者: 正阳门下    时间: 2016-1-21 23:59
Mayer 发表于 2016-1-21 12:41

嗯,谢谢了
作者: black习    时间: 2016-1-22 00:00
支持4楼
作者: 小赵VS老付    时间: 2016-1-22 09:50
好难,输出的结果是什么啊?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2