harshcode要和Equals的结果相同。
分割线
String toString()
用于获取调用对象的字符串形式,该方法的默认返回的返回的字符串为:包名.类名@哈希码值的十六进制 为了返回更有意义的数据,需要重写该方法。 使用print或者println打印引用或者字符串拼接都会自动调用该方法。
比如可以代替写show方法
用姓名作为判断标准,就不能简简单单的把getid变为getname,因为getid是一个int类型,而getname是一个String类型,是一个引用类型,需要再加上.equals,因为String里面已经重写了这个equals,让他可以比较地址里面的内容。
package task11;
public class Student {
private int id;
private String name;
Student(){}
Student(int id,String name){
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>0){
this.id = id;
}else{
System.out.println("学号不合理");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//为了比较两个对象的内容,也就是学号信息需要重写该方法
//Student this = s1;
//Object obj = s2;就是多态,父类类型引用指向子类对象 要强转才能引用子类的方法
@Override
public boolean equals(Object obj) {
//当调用对象不为空而参数对象为空的时候,则内容一定不相同,就不用判断了
if(obj == null){
return false;
}
//当调用对象和参数对象指向同一个对象时,一定相同
if (obj == this){
return true;
}
//强转之前先判断一下obj是不是指向Student
if (obj instanceof Student) {
//用一个Student的ts接着
Student ts = (Student) obj;
//return this.getId() == ts.getId();
//这是以学号为基准判断两个对象是否相等 int是基本数据类型
//内存的是数据本身,因此==可以判断是否相等
//return this.getName() == ts.getName();
//但是String是引用数据类型,里面存放的是地址,使用==是在判断地址
//也就是是否指向同一块区域,但是即使不指向同一块区域,名字也可以相等
//也能返回true
//需要再调用一次equals,用来比较地址里面的内容。
return this.getName().equals(ts.getName());
// String类型引用.equals xxx
}
//否则类型不一致,没有可比性,内容一定不相同
return false;
}
//为了使得该方法的结果与equals方法的结果保持一致,从而满足java官方的常规协定,需要重写该方法。
@Override
public int hashCode() {
//return getId();
int type = 12;
//return type*31 +getId();
return type*31 +getName().hashCode();
}
//为了返回更有意义的字符串数据,则需要重写该方法
@Override
public String toString() {
return "Student[id="+getId()+",name="+getName()+"]";
}
}
package task11;
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student(1001,“zhangfei”);
Student s2 = new Student(1002,“zhangfei”);
boolean b1 = s1.equals(s2);
System.out.println(“b1=”+b1);
System.out.println(s1 == s2);
System.out.println("---------------------");
//调用从Object继承下来的hashCode
int ia= s1.hashCode();
int ib= s2.hashCode();
System.out.println(“ia=”+ia+" “+“ib=”+ib);
System.out.println(”++++++++++++++++++++++");
//下面调用从Object类中继承下来的toString方法
//获取调用对象的字符串形式:包名.类名@哈希码值的十六进制
//当Student类中重写toString方法后,则调用重写后的版本
//即为:str1=Student[id=1001,name=zhangfei]
String str1 = s1.toString();
System.out.println(“str1=”+str1);
//输出 task11.Student@55d
//当打印一个引用变量时会自动调用toString方法
System.out.println(s1);
//字符串拼接引用会自动调用该方法
String str2 = “hello” + s1;
System.out.println(“str2=”+str2);
}
}