最近在自学java,看得是张孝祥的书。
恳求大哥大姐们帮忙啊,困扰好久了!以下是程序,
class HashtableTest是测试Hashtable类的,通过自己编写的类对Hashtable的关键字和值分别返回。
class MyKeyTest是测试equals()方法的,自己编写的覆盖Object中的equals// Date: 2007/1/4
// From page 229 and 141-142;
import java.util.*;class MyKey
{
private String name;
private int age;
public MyKey(String name, int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return new String( name + "," + age);
}


public boolean equals(Object obj)/////////88
{
    // MyKey newObj = (MyKey)obj;
    // if(name == newObj.name && age==newObj.age);
    
    //public boolean equals(MyKey obj) 
    //if(name.equals(obj.name) && age==obj.age)
    
         if(name.equals(((MyKey)obj).name) && age==((MyKey)obj).age)///99
return true;       // name.equals()调用的是谁的equals()??
   else
return false; 
}


public int hashcode()
{
return (name.hashCode() + age);
}
}class HashtableTest
{
public  void test()
{
Hashtable numbers = new Hashtable();
numbers.put(new MyKey("ZhangSan",18),new Integer (1)); 
numbers.put(new MyKey("LiSi",19),new Integer (2));
numbers.put(new MyKey("WangWu",20),new Integer (3));
Enumeration e = numbers.keys();
while(e.hasMoreElements())
{
MyKey key = (MyKey)e.nextElement();
System.out.print(key.toString() + " = ");
System.out.println(numbers.get(key));   
4444 // get(key)输出的顺序不是put()时候的顺序,并且输出顺序还不固定??
System.out.println(key.hashcode());
}            
// 得到关键字Key
Enumeration f = numbers.elements();
while(f.hasMoreElements())
{
 Integer ele = (Integer)f.nextElement();
 System.out.println(ele.intValue());
} }
// 得到值Value
}
}class MyKeyTest
{
MyKey p = new MyKey("LaoLi",30);
MyKey q = new MyKey("LaoLi",30);
public void test()
{
if(p.equals(q))
     System.out.println("p = q");
else
  System.out.println("p != q");
}
}
public class HashTable_Equals_Test
{
public static void main(String[] args)
{
HashtableTest hashTest = new HashtableTest();
hashTest.test();

MyKeyTest keyTest = new MyKeyTest();
keyTest.test();
}
}问题
1--编译通过后但是会有以下提示,为什么?
/****
Note: C:\java\HashTable_Equals_Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
******/ 
2-- “//////88”那行的equals()覆盖时候,为什么传入的参数Object obj必须转换成MyKey类型才行,否则会报错误---找不到name 和 age变量??
大家可以试试看,程序中注释掉的大家可以去掉注释运行(多种方法均可).
3-- equals()中if语句
if(name.equals(((MyKey)obj).name) && age==((MyKey)obj).age)///99
的name的比较用equals()和==都可以,这是怎么回事?
用equals(((MyKey)obj).name),此时的equals()调用的是Object.equals()
还是MyKey.equals(),还是其他的?4.  44444// 那行,问题已经写在上面了