关于System.out.println(str)打印的是字符串值,而不是地址的问题

Q:为什么会有这种问题呢?
A:在我们没有学习Object类的toString方法前,我们打印引用类型对象名,打印出来的是地址值,那么String作为引用类型,打印的应该也是地址值呀.为什么它打印出来的就是字符串本身的值呢.


代码举例:

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

输出结果:abc


原因:

我们首先要记住一个概念:在打印引用类型对象名的时候,默认调用toString方法.String类作为Object的子类,必然也继承了toString方法,所以上面第2行代码实际为:System.out.println(str.toString());toString方法的意义是获取对象的文本描述.所以在java内部,String类重写了Object类的toString方法,使其打印str所指向的内存里共享区 串池中的一串字符(abc).


结论:

不论是那种引用类型,直接打印对象名的时候,默认调用toString方法.如果此类没有重写Object类中的toString方法,那么就调用Object类的toString方法,即打印出来的是地址(全类名+@+16进制的hashCode).如果此类重写了toString方法,那么就打印重写的toString方法.


利用代码来验证结论:

public class Test {

	public static void main(String[] args) {
		TestA a = new TestA();//利用无参构造创造对象a
		TestB b = new TestB();//创建对象b
		System.out.println(a);//结果:TestA [i=1]
		System.out.println(b);//结果:demo2.TestB@15db9742
	//由结果证明打印的实际是对象.toString()
	//对象a重写了,所以打印重写的.
	//对象b没有重写,所以打印地址
	}
}
//TestA有对toString的重写
class TestA{
	int i = 1;

	@Override
	public String toString() {
		return "TestA [i=" + i + "]";
	}

}
//TestB没有对toString的重写
class TestB{
	int j = 2;
}

由上述代码可知,结论正确.


  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值