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;
}
由上述代码可知,结论正确.