初学者问问关于java的一个小问题,代码如下!!
\\以下是代码部分
import java.util.*;
/**
* This program demonstrates equals test
* @author Wuchangyu
* @version 1.11 2004-02-21
*/
class EqualsTset {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Employee alice1=new Employee("Alice Adams",75000,1987,12,15);
Employee alice2=alice1;
Employee alice3=new Employee("Alice Adams",75000,1987,12,15);
Employee bob=new Employee("Bob Brandson",50000,1989,10,1);
System.out.println("alice1==alice2: "+(alice1==alice2));
System.out.println("alice1==alice3: "+(alice1==alice3));
System.out.println("alice1.euqals(alice3): "+alice1.equals(alice3));
System.out.println("alice1.equals(bob): "+alice1.equals(bob));
System.out.println("bob.toString: "+bob);
Manager carl=new Manager("Carl Cracker",80000,1987,12,15);
Manager boss=new Manager("Carl Cracker",80000,1987,12,15);
boss.setBonus(5000);
System.out.println("boss.toString: "+boss);
System.out.println("carl.equals(boss): "+carl.equals(boss));
System.out.println("alice1.hashCode(): "+alice1.hashCode());
System.out.println("alice3.hashCode(): "+alice3.hashCode());
System.out.println("bob.hashCode(): "+bob.hashCode());
System.out.println("carl.hashCode(): "+carl.hashCode());
}
}
class Employee
{
public Employee(String n,double s,int year,int month,int day)
{
name=n;
salary=s;
GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
hireDay=calendar.getTime();
}
public double getSalary()
{
return salary;
}
public Date getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
salary*=1+byPercent/100;
}
public boolean equals(Object otherObject)
{
//a quick test to see if the objects are identical
if(this==otherObject)return true;
//must return false if the explicit parameter is null
if(otherObject==null)return false;
//if the classes don't match, they can't be equal
if(getClass()!=otherObject.getClass())return false;
//now we know otherObject is a non-null Employee
Employee other=(Employee) otherObject;
//test whether the fields have identical values
return name.equals(other.name)&&salary==other.salary&&hireDay.equals(other.hireDay);
}
public int hashCode()
{
return name.hashCode()+new Double(salary).hashCode()+hireDay.hashCode();
}
public String toString()
{
return getClass().getName()+"[name="+name+",salary="+salary+",hireDay="+hireDay+"]";
}
private String name;
private double salary;
private Date hireDay;
}
class Manager extends Employee
{
public Manager(String n,double s,int year,int month,int day)
{
super(n,s,year,month,day);
bonus=0;
}
public double getSalary()
{
double baseSalary=super.getSalary();
return baseSalary+bonus;
}
public void setBonus(double b)
{
bonus=b;
}
public boolean equals(Object otherObject)
{
if(!super.equals(otherObject))return false;
Manager other=(Manager) otherObject;
//super.equals checked that this and other belong to the same class
return bonus==other.bonus;
}
public int hashCode()
{
return super.hashCode()+new Double(bonus).hashCode();
}
public String toString()
{
return super.toString()+"[bonus="+bonus+"]";
}
private double bonus;
}
\\后面是问题:
public int hashCode()
{
return name.hashCode()+new Double(salary).hashCode()+hireDay.hashCode();
}
返回salary的哈希码的时候,为什么不是直接写salary.hashCode();?为什么编译不过去呢?
[解决办法]
double salary是基本类型的,不存在哈希方法,需要将其封装成封装类Double才可以调用hashcode方法。
[解决办法]
String 比较特别(因为其封装对象名也为String),可以当基本类型用,也可以当封装类型用,所以name可以直接调用hashCode
[解决办法]
楼主你好,把你的代码看完了,也说两句吧,其实问题一楼和二楼说出意思了,hashCode是Object超类的方法,也可以说是引用类型的方法,所有引用类型都具备这个方法,而八种基本类型是不具备Java对象的方法的,它们充当的仅仅是值,不存在对象,可以这么说,可以用new来创建的Java对象都是继承了Object的所有方法的。