import java.util.*;
public class java12 {
private static List created=new ArrayList();
private String s;
private int id=0;
java12(String str)
{
s=str;
created.add(s);
Iterator it=created.iterator();
while(it.hasNext())
{
if(it.next().equals(s))
id++;
}
}
public String toString()
{
return "String: "+s+" id: "  + id+" hashCode():"+hashCode();
}
public int hashCode()
{
int result=17;
result=37*result+s.hashCode();
result=37*result+id;
return result;

}
public boolean equals(Object o)
{
return(o instanceof java12)&&s.equals(((java12)o).s)&&id==
((java12)o).id;
}
public static void main(String[]args)
{
Map map=new HashMap();
java12[] cs=new java12[10];
for(int i=0;i<cs.length;i++)
{
cs[i]=new java12("hi");
map.put(cs[i],new Integer(i));
}
System.out.println(map);
for(int i=0;i<cs.length;i++)
{
System.out.println("Looking up"+cs[i]+" value==");
System.out.println(map.get(cs[i]));
}}
}
请问 这个程序中的toString() ,hashCode(),eaquals()方法时如何调用的,程序中没有调用这些函数,为什么能自动调用呢?

解决方案 »

  1.   

    因为这几个方法是Object类中的public方法,所以所有的类都继承了这些方法,所以可以随便调用,有些类重写了,有些类没有重写。
      

  2.   

    System.out.println(xxx); 会调用xxx的toString方法,如果xxx没有重写toString方法,就会调用父类或根类Object的toString方法
    map.put(xxx, yyy);会调用xxx的equals和hashCode方法,来判断xxx是否是相同的
      

  3.   

    是java的自身处理机制,就像如果你定义一个类不声明派生于哪个类的话,它就会认为是派生于java.lang.Object,只是没有显式声明而已,toString() ,hashCode(),eaquals()是Object类的方法,Object类是所有类的基类,所以任何类都可以调用或者重写这些方法。
      

  4.   

    打印的时候,System.out.println(XXX)中,不用写xxx.toString(),就可以直接调用吗,为什么,就算有那些方法,为什么可以自动调用呢
      

  5.   

    系统自带的Map类中的代码会调用这些方法
      

  6.   

    因为System.out.println的内部实现就是会调用xxx.toString,LZ可以查看java的源代码
    就好像
    class A {
        public static void print(B b) {
            String s = b.toString();
            System.out.println(s);
        }
    }class B {
        public String toString() {return "I am B";}
    }public class Test {
        public static void main(String[] args) {
            B b = new B();
            A.print(b); //你问为什么A.print会调用b.toString,那么请参考A的print的代码
                           //原因就是A的print的实现代码调用了b.toString方法
                           //System.out.println的道理是一样的
        }
    }
      

  7.   

    你查看一下java的HashMap类和System.out.println中的源代码不就知道了