详解java中println输出字符串

本文详细分析了Java中println方法在处理char[]类型和String类型时的不同输出结果。对于char[],直接输出是内容,而与字符串连接后输出则是地址值,这是因为println方法针对char[]有特殊处理,而对于其他类型则默认输出对象地址。同时,讲解了String对象的输出始终显示其内容,因为重写了toString方法。了解这些原理有助于更好地理解和调试Java代码。
摘要由CSDN通过智能技术生成

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+单击 真是个好东西~还有运用调试工具可以清楚地看到程序的执行流程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值