A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏亮 中级黑马   /  2012-9-20 22:47  /  1725 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 魏亮 于 2012-9-21 07:27 编辑

class CeShi
{      
     public static void main(String[] args)   
     {                       
                    String str=new String("abcd");               
                 System.out.println(str); \\打印结果是“abcd”
                Student s =new Student();               
                  System.out.println(s);   \\打印结果是地址值   
      }                    
}
class Student
{        
    private String name;   
     private int age;
}
我不明白的是 为什么str 和s 同时引用型变量,字符串打印结果为什么不是地址值呢??求指教

8 个回复

正序浏览
首先,Object中的toString()是所有类的基本的功能函数,其他类要么继承这个函数要么覆写这个函数。
然后,str是String类类型的引用,其继承了Object 并且覆写了toString()函数 ,其返回值类型就是他本身(字符串即String)。
其次,s是Student类类型的引用,虽然也是Object的子类但是没有覆写toString()函数,Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())
回复 使用道具 举报
String重写了toString()方法,而你的Student类没有重写toString()方法。
回复 使用道具 举报
魏亮 中级黑马 2012-9-21 07:27:07
7#
谢谢上面各位吗,明白了。。。。
回复 使用道具 举报
你把Student类重写toString方法,在打印s就不会出现地址了。
回复 使用道具 举报
重写了toString()方法。在打印的时候都会调用toString()方法。
回复 使用道具 举报
从API找来的资料,看println(String x)和println(Object x)到底是怎样执行的?
println(String x)是这样操作的:如果参数为 null,则打印字符串 "null"。否则,按照平台的默认字符编码将字符串的字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。可以看出字符串打印是按照默认字符编码转换后直接写到控制台的方式操作,显示的时候再解码。
println(Object x):此方法首先调用 String.valueOf(x) 获取打印对象的字符串值(打印对象时,先进行这一步操作,比打印String多了这一步,所以是你看到的结果。),然后的行为如同先调用 print(String) 再调用 println() 一样;

String 的valueOf方法的定义:
String valueOf(Object obj)返回 Object 参数的字符串表示形式。
参数:
obj - 一个 Object
返回:
如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。

toString怎么操作的?
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

看完了应该能明白了吧?
回复 使用道具 举报
这是因为str 是String(字符串)类型的,String其实是一个字符串对象,它里面覆写了Object中toString的方法,返回的就是字符串本身。
而Student类中并没有覆写Object中的toString方法,所以会使用Object中的toString方法,返回该对象的字符串表示形式。getClass().getName() + '@' + Integer.toHexString(hashCode())

回复 使用道具 举报
string类型 s 重写了toString()方法
而 str 没有重写 toString()方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马