2021-04-05

在这里插入图片描述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);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值