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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小草君 中级黑马   /  2014-3-6 09:31  /  768 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package list;

import java.util.ArrayList;
import java.util.Iterator;

import snippet.Person;



public class Array {

        public static void main(String[] args) {
                ArrayList a=new ArrayList();
                a.add(new Person("lili",21));
                a.add(new Person("qiqi",22));
                a.add(new Person("wili",23));
               
                System.out.println(a);
                Iterator b=a.iterator();
                while(b.hasNext())
                {
                       
//                        System.out.println(((Person) b.next()).getName()+((Person) b.next()).getAge());
                        Person p=(Person) b.next();
                        System.out.println(p.getName()+p.getAge());
//                        System.out.println(b.next());
                }
        }

}
如果把上面代码中的强转即Person p=(Person) b.next();换掉就打印的是哈希值,再往Person类中加入//        public String toString()
//        {
//                return name+":"+age;
//        }
就又打印出来了,
我想问这个toString和强转的作用是一样的吗?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
1、你直接打印一个对象的引用,它会打印该对象的字符串表现形式。例:p是person类对象一个引用System out println(p)。其实就是System.out.println(p.toString())。该方法定义在object中,默认返回的格式:类名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode()),这就是我们平时看到的类名@哈希值。有些类复写了该方法,建立了自己的对象的特有表现形式。
2、在你问题中,你在Person类复写了该方法(返回姓名、年龄)。(1)System.out.println(b.next());
b.next()没加泛型时返回的是一个Object类的引用,该引用是指向Person类对象的,这里是多态了。你做了强转,输出的是Person类的toString方法的返回值,不做强转也是这样,因为在多态里调用的是对象所属类的toString方法,而不是引用所属类的方法。所以,你可以试试即使不做强转直接输出,它也是输出姓名年龄的,因为Person类中复写了toString的方法。
3、所以直接输出对象的引用,输出的是该引用所指向的对象所属的类的toString方法的返回值。例:Person p1 = new Person();Object obj = new Person().输出p1、obj都是调用Person类中的toString方法。因为引用p1和obj都是指向Person类对象的。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
牛头人图腾 发表于 2014-3-6 13:38
1、你直接打印一个对象的引用,它会打印该对象的字符串表现形式。例:p是person类对象一个引用System out p ...

但是这个我打印的是p.next()这也属于对象Person的引用?
回复 使用道具 举报
toString是将对象给转换成了字符串,如果打印的话其实打印的是内存地址。而强转不一样的,转换出来的有可能是它的父类有可能是它的子类。
回复 使用道具 举报
小草君 发表于 2014-3-6 17:22
但是这个我打印的是p.next()这也属于对象Person的引用?

不好意思,刚那里说错了。p.next()返回的是一个对象。
你可以试下打印对象和打印引用。
Person p = new Person("zhangsan",10);
Object obj = new Person("wangwu",30);
System.out.println(p);
System.out.println(obj);
System.out.println(new Person("lisi",20) );
你打印引用打印的是引用所指向的对象的字符串的表现形式,而你直接打印对象也是打印对象的字符串表现形式。呵呵,我也在学习所陈述的是自己的观点,有可能是错的,但刚才我验证是这样才回复的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马