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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聖手`书生 中级黑马   /  2013-4-23 20:58  /  1755 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们都知道,java的Object提供了个toString方法,返回该对象的字符串表示。

而String类中已经复写了该方法,返回String对象本身;所以我们调用String类对象时,直接打印String类对象的引用就可以打印该字符串对象。

从我学习的经验来看,如果某个类复写了toString()方法,那么打印该类对象的引用,就可以直接输出toString方法的返回值。

问:我这样理解是否正确??给点意见哈。

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

6 个回复

倒序浏览
这个得看情况,如果是自定义类对象,那么重写toString后,可以选择返回自定义对象的某些属性,比如,自定义了Persson类,有学号id,姓名name这两个属性,这个时候如果直接打印Person类的对象,输出的会是Person类名跟地址。

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

回复 使用道具 举报
当你用System.out.println(对象)时:
(API)
用的是:public void println(Object x)
          打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。
而String类中:
    static String valueOf(Object obj)
          如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
   obj.toString():调用了你传入的对象所属类的toString()方法,该方法从 Object继承/被复写.

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

回复 使用道具 举报
如果重写了toString()会返回一个期望的字符串, 如果不重写, 返回的是 类名@hashCode()
class Test {
        public static void main(String[] args) {
                Student s = new Student("张三", 14);
                //就是将对象信息以字符串的形式打印, 其实就是自定义的的toString()方法
                System.out.println(s);        //这里的s其实就是s.toString();
        }
}
class Student {
        String name;
        int age;

        Student(String name, int age) {
                this.name = name;
                this.age = age;
        }

        //重写toString()
        public String toString() {
                //这里可以返回任意一个字符串, 但是一般返回的是这个对象的属性信息
                return "姓名: " + this.name + " 年龄: " + this.age;
        }
}

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
  1. public void println(Object x) {
  2.         String s = String.valueOf(x);
  3.         synchronized (this) {
  4.             print(s);
  5.             newLine();
  6.         }
  7.     }
复制代码
我们知道System。out是PrintStream的对象。println方法的源代码就是上面那个;
String的valueOf的源代码是这个:
  1. public static String valueOf(Object obj) {
  2.         return (obj == null) ? "null" : obj.toString();
  3.     }
复制代码
在看Object的toString源代码:
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
这样应该一目了然了吧,源代码都是这样的了,还能有错嘛,就是你说的那样;
如果是空就打印null,如果out.println(obj);obj覆盖了toString的方法就调用它,输出他的返回值;
如果没有就用父类Object的返回值;

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
你这样理解非常正确。
回复 使用道具 举报
hmr8 中级黑马 2013-5-1 10:11:30
7#
这是多的,这就是多态的特性!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马