首先回忆一下String str = null与String str = “” 的区别:
null表示一个空对象,除了基础类型以外的其它类型,都能以此声明一个对象,但未分配堆内存空间,就好比口头宣布“我要上北大”;后者声明了一个实实在在的字符串,只不过这个字符串比较特殊,他的长度为0,可以理解为“买好了所有的复习资料准备撸起袖子开干了,但是还未开始,积累为0”。null对象在使用String的方法时会抛出“空指针异常”,很好理解,你就一个声明,啥也没有,我连它指向谁都不知道,还不给抛出异常嘛;但是"“就不同了,人家可是实实在在的String对象,方法随便用。
特别提醒一点,对”“使用split方法会返回一个length为1的String[]数组,并且唯一一个引用仍然是”"。

下面测试“空对象”打印情况:

public class StringTest {public static void main(String[] args) {String string = null;String string1 = string + "123";//$_1输出值为:null123System.out.println(string1);String string2 = "";int length = string2.split(",").length;     //$_2输出值为:1System.out.println(length);String string3 = string2+"123";//$_3输出值为:123System.out.println(string3);StringTest stringTest = null;//$_4输出值为:nullSystem.out.println(stringTest);StringTest stringTest1 = new StringTest();//$_5输出值为:com.nicetomeetyou.javatest.StringTest@15db9742System.out.println(stringTest1);}
}

$_1位置处输出值为“null123”,这其实是在字符串连接时搞的鬼,"+"连接两个子串时,编译器会新建一个StringBuilder对象,再按顺序使用append方法来连接两个子串,这个时候我们需要看一下append方法的源码

    public StringBuilder append(String str) {super.append(str);return this;}

再查看父类的append方法

    public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}private AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;}

很赤裸有木有,所有类型的null对象其实都是这种处理方法。value[]为字符型数组,用于存放String对象的每一个char,在进行append时,会通过ensureCapacityInternal方法来对原有的value[]数组进行扩容,实际上就是根据需要,重新声明了一个新的char[]数组,并且将原来的value[]进行复制,再将需要拼接的字符一个一个对应赋值。
这样一来,后面的print结果都很好理解了,在$_5位置处,打印结果看似并不那么友好,实际上也很简单,我们查看一下源码

    public void print(Object obj) {write(String.valueOf(obj));}

看来是valueOf方法在搞鬼

    public static String valueOf(Object obj) {return (obj == null) ? "null" : obj.toString();}

嗯,这个貌似有所耳闻,打印时都是调用了对象的toString方法,并且这个方法是Object类所持有的,继续看

    public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}

果然,一般的引用类型的toString方法都是由类名+“@”+哈希码组成,当然,如果该类重写了toString方法,例如String,打印效果看起来就会友好很多。

关于null对象使用print方法打印问题总结,null+123打印结果是null123还是123?相关推荐

  1. js设置html打印不分页,JS 使用 window对象的print方法实现分页打印功能

    最近做项目用到了web在线打印功能,经研究使用了JS自身支持的Window对象的打印方法,此种方法兼容性比较好,在IE和火狐浏览器下使用都没有问题. 1.但是网上好多案例都不支持分页功能,最后通过CS ...

  2. null对象打印为什么是null?

    JAVA中有八种基本数据类型,他们在初始化的时候会被赋予初始值. byte -> 0 short -> 0 int -> 0 long -> 0 char -> &quo ...

  3. 打印对象和toString方法

    JAVA对象 java对象是都是Object类的实例,都可直接调用该类中定义的方法,这些方法提供了处理java对象的通用方法. > > 6.2.1打印对象和toString方法     先 ...

  4. null对象访问static属性或方法

    一道非常有趣的基础题 , 如下所示 , main方法正常运行还是报空指针异常呢 public class XUtil {public static int num = 10;public static ...

  5. 在C#中,当您在null对象上调用扩展方法时会发生什么?

    本文翻译自:In C#, what happens when you call an extension method on a null object? Does the method get ca ...

  6. 使用 Window print() 方法 实现打印文件

    前言:今天得到一个需求 就是把一些wode文档中的表格,去根据数据填充,然后调用打印机进行打印出来 在这个需求下来的时候,其实第一时间就想的是,使用JAVA代码对wode文档进行操作,然后调用打印机去 ...

  7. 条码打印软件引用其他对象内容的方法

    在使用中琅条码打印软件制作标签时,通常会看到某些标签中的产品编号.条码或者二维码,虽然形式不同,但内容却是相同的.在中琅条码打印软件中,如果使标签上某些内容保持同步,也可以使用数据引用的方法,来实现这 ...

  8. 使用window.print()方法分页打印

    使用window.print()方法分页打印 只需要在每页中增加以下样式属性 style="page-break-after:always" 例如 <div style=&q ...

  9. window.print()方法实现打印功能,多出一张空白页

    项目内需要实现一个打印的功能,用了window.print()方法,但是在打印的时候总是多出一张空白页,偶然搜到了一篇文章,(https://blog.csdn.net/web_houzhanguo/ ...

最新文章

  1. 一些实用的 Javascript 代码
  2. dcba oracle,【转】dcba的文章:Oracle的SET UNUSED COLUMN操作到底做了什么?
  3. 利用Win32 Debug API打造自己的调试器Debugger
  4. bigdecimal不保留小数_金钱要使用BigDecimal数据类型(使用double的已经被公司开除了)...
  5. Webstorm 10.0.4 配置
  6. 【深度学习】研究揭秘:神经网络越大、表现越好的“神秘力量”
  7. C语言 static - C语言零基础入门教程
  8. Spring Cloud 分布式 微服务 最佳实践之一
  9. 国内首个 App SDK 国家标准成功立项;苹果意外泄露iPhone 12发布时间;TypeScript 4.0 发布| 极客头条
  10. CentOS 7 使用yum安装出现错误
  11. Migrate blog from blogcn here
  12. 安装MySql报错(This application requires .NET Framework x.x.x)
  13. ESXi社区版NVMe驱动更新v1.1
  14. diskgeniuslinux版_DiskGenius 4.6.2 正式版发布,现已提供下载
  15. 实验楼挑战:备份日志
  16. 2007年12月25日至2008年1月1日百宝箱游戏下载排行榜
  17. 服务器系统如用pe和做镜像,怎么用pe中的光盘镜像安装操作系统
  18. (附源码)基于spring boot 青少年公共卫生教育平台的设计与实现 毕业设计 643214
  19. 山东理工 ACM [1011] A+B for Input-Output Practice (II)
  20. 备忘_命令行查看电池损耗

热门文章

  1. 为什么将iostream :: eof放在循环条件(即`while(!stream.eof())`)内?
  2. SQL Server:如何加入第一行
  3. 生成0到9之间的随机整数
  4. win11还原点如何设置 windows11还原点的设置方法
  5. Windows输入体验是什么,Windows11输入体验在哪里
  6. 教你win7显卡驱动如何安装,win7电脑显卡驱动的安装方法
  7. SpringBoot解决jpa,NoSession问题
  8. JDBC中给Mysql加时区问题!
  9. 微信小程序API之showActionSheet(操作菜单)
  10. 天梯—个位数统计(C语言)