黑马程序员技术交流社区

标题: 求高手指教 [打印本页]

作者: 小草君    时间: 2014-3-6 09:31
标题: 求高手指教
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和强转的作用是一样的吗?
作者: 牛头人图腾    时间: 2014-3-6 13:38
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类对象的。
作者: 小草君    时间: 2014-3-6 17:22
牛头人图腾 发表于 2014-3-6 13:38
1、你直接打印一个对象的引用,它会打印该对象的字符串表现形式。例:p是person类对象一个引用System out p ...

但是这个我打印的是p.next()这也属于对象Person的引用?

作者: syusikoku    时间: 2014-3-6 17:30
toString是将对象给转换成了字符串,如果打印的话其实打印的是内存地址。而强转不一样的,转换出来的有可能是它的父类有可能是它的子类。
作者: 牛头人图腾    时间: 2014-3-6 18:35
小草君 发表于 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) );
你打印引用打印的是引用所指向的对象的字符串的表现形式,而你直接打印对象也是打印对象的字符串表现形式。呵呵,我也在学习所陈述的是自己的观点,有可能是错的,但刚才我验证是这样才回复的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2