详解java中println输出字符串 您所在的位置:网站首页 字符串怎么打印 详解java中println输出字符串

详解java中println输出字符串

2024-03-05 02:28| 来源: 网络整理| 查看: 265

文章目录 1. char[] 类型的输出1.1 输出字符串的原因1.2 输出地址值的原因 2. String 类定义的对象的输出写在最后

1. char[] 类型的输出 char[] str={'a','b','c'}; System.out.println(str);//这里输出的是字符串"abc" System.out.println("str:"+str);//这里输出的是地址值,str:[C@5f184fc6

字符串可以用字符数组的形式来定义,那么为什么第一种输出会直接输出字符串,而第二种却是输出地址呢? 简单说一下,就是因为调用了两个不同的重载方法。

1.1 输出字符串的原因

先来看第一种输出原因: 直接先来看源码

//System.out.println()源码 public void println(char[] x) { if (getClass() == PrintStream.class) { writeln(x); } else { synchronized (this) { print(x); newLine(); } } }

先判断是不是类,如果不是,直接调用print()方法输出再调用newLine()方法换行输出。 如果是,调用writeln()方法,最终是输出字符串的内容,并且换行。

顺带一提 如果刚开始定义的是一个一个int[] 类型的数组,无论是哪种形式的输出都会直接输出地址值。

int[] arr1={1,2,3}; System.out.println(arr1);//输出结果为地址值 System.out.println("arr1:"+arr1);//输出结果为地址值

小结一下 println中对于数组类型的输出中,只有char[] 类型有定义,且打印字符数组转换为字符串后的形式;其他的数组类型(int[],double[] 等等) 均对应于println(Object x)形式,打印的是对象的地址值。

1.2 输出地址值的原因

最上面代码第二种输出也是想要输出一个char[]类型的字符数组,但是输出结果不是字符串的内容,而是和其他的数组类型(比如int[] 类型)一样,最终输出了字符数组的地址值。

再来看一下最上面的代码第二种println对应的源码

public void println(String x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } }

调用这个方法,先判断if里面的语句结果为true,再接着调用valueOf()方法, valueOf源码:

//这个是Object类中的方法 public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }

因为不是空串,再接着去调用toString()方法。

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

返回值是:类名+符号@+对象的哈希码值。 所以最终的输出结果就是一个地址值。

但是,为什么第二个println调用的是 public void println(String x) 呢? 原因:String和任何对象做连接都会返回String;连接的时候会调用对象的.toString方法来连接,所以第二个char[]和字符串拼接的时候就是char[].toString + 字符串了。(“str:”+str)这个整体现在是一个字符串,这个字符串作为参数传给println()方法,所以就会调用public void println(String x)了。

总结,上面的两个println 调用了两个不同的重载方法,第一个接收char[],直接输出内容,第二个接收String,最终输出地址。

2. String 类定义的对象的输出

由String定义的字符串对象的输出

String str = "abc"; System.out.println(str);//abc System.out.println("str:"+str);//str:abc

这两种形式的输出都一样,都是输出字符串的内容,原因放在一起说一下 println会去调用public void println(String x),接着执行writeln(String.valueOf(x));具体看上面valueOf的源码,接着调用toString()方法,但是在String类中将toString()方法改写了,返回值是字符串本身。

public String toString() {return this;}

所以最后都输出的是字符串的内容,而不是地址值。

写在最后

有时对程序的运行结果不太理解时,想查看某个方法的源码,可以按住Ctrl键,鼠标点击对应的代码,就能看到源码啦,Ctrl+单击 真是个好东西~还有运用调试工具可以清楚地看到程序的执行流程。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有