Object类
Object类是类层次结构的根。每个类都有 Object作为超类。所有对象,包括数组,实现这个类的方法,任何类都是该类的直接或间接子类。
boolean equals(Object obj) --用于判断调用对象是否与参数对象相等
该方法默认比较俩个对象的地址 ,与==运算符结果相同。
package com.day01.ObjectTest;
package com.day01.ObjectTest;
/*
* //student类的封装
*
* */
public class Student {
//第一步,私有化成员变量
private String name;
private int id;
//有参数的构造方法
public Student(String name, int id) {
super();
setName(name);
setId(id);
}
//无参的构造方法
public Student() {
super();
}
//2.提供公有的get,set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>0) {
this.id = id;
}else {
System.out.println("学号不合理!!!!");
}
}
//自定义成员方法实现打印特征
public void show() {
System.out.println("我的名字叫:"+getName()+",学号为:"+getId());
}
//为了使得equals比较对象的内容,而不再是比较对象的地址,则需要进行重写
@Override
public boolean equals(Object obj) {
/*
* //1.当调用对象与参数对象地址相同时,则内容一定相同 if(this==obj) { return true; }
* //2.当调用对象不为空,而参数对象为空时,则内容一定不相同 if(null==obj) { return false; }
* //3.当参数类型对象和调用对象类型相同时,才需要获取里面的内容进行比较 if(obj instanceof Student) {
* if(this.getId()==((Student) obj).getId()) { return true; }else { return
* false; } } //4.类型不相同,直接返回false啊 return false;
*/
if(this==obj) return true;
if(null==obj) return false;
if(obj instanceof Student) {
return this.getId()==((Student) obj).getId();
}
return false;
}
//如果你重写了equals方法,则为了保持常规协定,需要对hashcode也要进行重写
public int hashCode() {
return getId();
}
}
public class StudentTest /* extends Object */{
public static void main(String[] args) {
Student s1=new Student("张无忌",22);
s1.show();
System.out.println("-----------------------");
Student s2=new Student("张无忌",22);
s2.show();
//调用从Object类中继承下来的equals方法,默认比较的是俩个对象的地址
boolean b=s1.equals(s2);
//this 代表当前正在调用的对象,也就是谁在调用equals,即是s1,obj就是s2
/*
* public boolean equals(Object obj) { return (this == obj); }
*/
System.out.println("b= "+b);
System.out.println(s1==s2);
System.out.println("------------------------------");
//调用从Object继承下来的hashcode方法,得到对象地址的内存编号
int m=s1.hashCode();
int n=s2.hashCode();
System.out.println("m= "+m);
System.out.println("n= "+n);
/*
* Student s1=new Student("张无忌",22); s1.show();
* System.out.println("-----------------------");
*
* Student s2=new Student("张无忌",22); s2.show();
*
* boolean b=s1.equals(s2); System.out.println("b= "+b); //b=false,改的是成员变量的值,但你equals比较的是地址啊
* System.out.println(s1==s2); //false
*/
}
}
若equals方法重写后,则应该重写hashCode来维护hashCode方法的常规协定;
int hashCode() 用于获取调用对象的哈希码值(内存地址的编号) | |
---|---|
- 若调用equals方法的结果相等,则各自调用hashCode方法的结果相同。因为内存地址编号相同;
- 若调用equals方法的结果不相等,则各自调用hashCode方法的结果不相同。