黑马程序员技术交流社区

标题: 集合疑问 [打印本页]

作者: 空心祭    时间: 2014-3-18 09:26
标题: 集合疑问
在看视频的时候发现一个问题,到现在没有想明白...
那就是集合里面传入的类,直接迭代打印出来的是类对应的地址值
那么为什么字符串打印出来的直接就是字符串呢?而建立别的类比如学生等出来的都是地址值啊
为什么字符串直接就出来字符串了,而不是地址值呢?

作者: 虎牛龙马    时间: 2014-3-18 09:59
package cn.itcast.day7;

import java.util.ArrayList;
import java.util.List;

public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                Person p = new Person();
                List list = new ArrayList();
                list.add(p);
                list.add("abc");
               
                System.out.println(list.get(0));
                System.out.println(list.get(1));
        }

}

class Person {
       
}
结果:
cn.itcast.day7.Person@4f1d0d
abc
你是这个意思吧!

你是在集合里面传入的类的具体实例的引用对象吧!一个引用对象本来就是一个地址,你在打印它的时候会自动调用toString()方法,结果就是一个地址;而如果传入的是一个字符串,比如“abc”,它是一个字符串的实体对象,在打印它的时候也默认调用toString()方法,结果就是abc。
作者: 张贺    时间: 2014-3-18 10:04
在自定义类里面重写Object类提供的toString方法就可以实现你想输出的内容!
作者: yunzhongzhuhuo    时间: 2014-3-18 10:06
所有类都默认是java.lang包中的Object类的子类或间接子类。Object类中有一个public方法public String toString(),一个对象通过调用该方法可以获得该对象的字符串表示。一个类可以通过重写toString()方法来获得该类的对象想要的字符串表示。如java.util包中的Date类就重写了toString()方法,使得Date对象调用toString()方法得到的字符串是有日期信息组成的字符序列。如果一个类没有重写toString()方法,那么该类所创建的对象调用toString()方法得到的字符串格式为:类型@对象的引用

而String重写了toString()方法,输出的就是其值
  1. import java.util.Date;


  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 Date date=new Date();
  6.                 String str="abced";
  7.                
  8.                 Student2 stu=new Student2("zhangsan",55);
  9.                 TV tv=new TV("电视机",555);
  10.                
  11.                 System.out.println(date);
  12.                 System.out.println(str);
  13.                 System.out.println(stu);
  14.                 System.out.println(tv);
  15.         }

  16. }

  17. class Student2{
  18.         String name;
  19.         double score;
  20.        
  21.         Student2(String name,double score){
  22.                 this.name=name;
  23.                 this.score=score;
  24.         }
  25.        
  26.         public String toString(){
  27.                 return "姓名:"+name+",分数"+score;
  28.         }
  29. }

  30. class TV{
  31.         String name;
  32.         double price;
  33.         TV(String name,double price){
  34.                 this.name=name;
  35.                 this.price=price;
  36.         }
  37. }
复制代码



QQ截图20140318100507.png (1.59 KB, 下载次数: 5)

QQ截图20140318100507.png

作者: Alexander    时间: 2014-3-18 11:17
本帖最后由 Alexander 于 2014-3-18 11:19 编辑

一般来说,对象默认的都有toString()方法,即打印该对象的信息,如果系统没有对toString()方法进行重写,那么打印出的形式为:对象类型@对象的引用像你说的String类型的toString方法已经实现了



作者: osully    时间: 2014-3-18 11:30
Object类中的toString方法中写的其实也很清楚
建议所有子类都重写此方法。

也就是说
重写了此方法,你写什么打印什么
否则就调用了Object的toString()
getClass().getName() + '@' + Integer.toHexString(hashCode())

作者: 房建斌    时间: 2014-3-18 11:51
toString()方法的问题啊,你自己写一个学生类,把toString重写了就行了




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