Object类常用的四个方法:
1.getClass():返回对象执行时的class实例(返回运行时的类);
2.toString():将对象返回为字符串的形式;
3.hashCode():返回该对象的哈希码值,用来比较两个对象是否相等;
4.equals():用来比较两个对象是否相等。
一.getClass()方法
getClass():返回对象执行时的class实例(返回运行时的类)。
public class Demo01 extends Object {
public static void main(String[] args) {
Object[] obs = new Object[4];//
obs[0] = new Object();//将创建的对象赋值给数组
obs[1] = new String("字符串");
obs[2] = new Integer(8);//Integer:int类型的包装类
obs[3] = new Demo01();
System.out.println("====遍历数组====");
//ob只是一个变量名,可随便取
//foreach格式:for(数据类型 变量名: 要遍历的数组){}
for (Object obj : obs ){
System.out.println(obj+"\t"+obj.getClass());
}
}
}
运行结果:
二.toString()方法(★★★)
toString():将对象返回为字符串的形式。
Object类中的toString()方法:
public String toString() {
//Integer.toHexString(hashCode()) 输出十六进制数
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
(1)不重写toString()方法,hashCode()方法自动调用,默认输出该对象的地址。例如:
public class Person extends Object {
String name;//名字
String id;//身份证
public static void main(String[] args) {
//toString()
Person person1 = new Person();
person1.name = "桃子";
person1.id = "123456";
//两者一样 默认输出地址:com.ruandy.VIP06_OPP.day0723object.Person@1b6d3586
System.out.println(person1);//默认输出地址
System.out.println(person1.toString());//默认输出地址
//hashCode()
}
}
运行结果:
(2)重写toString()方法,默认输出对象的内容。例如:
public class Person extends Object {
String name;//名字
String id;//身份证
/**
* 覆盖重写Object类中的toString()方法
* toString()方法格式固定
* 设计依据:
* 1.如果输出对象时,想看到哪些属性的值,就可以将属性拼接在return后面
* 2.保证拼接后的结果为String类型即可
* 3.拼接的格式自定义
*/
@Override
public String toString(){
return "姓名:"+name+",身份证号:"+id;
}
/**
* hashCode()设计依据:
* 1.尽量使用到对象的属性
* 2.保证最终的返回值类型是int类型,return后面的结果为int类型
* 3.return后面的公式自定义:只要保证结果为int类型即可
*
* 注意:hashCode()方法是自动调用,无需手动调用(在没有重写toString()方法时才有效)
* 如果重写了toString()方法,hashCode()方法就不会自动调用了
*/
@Override
public int hashCode(){
System.out.println("我是hashCode的方法");
return 1;
}
public static void main(String[] args) {
//toString()
Person person1 = new Person();
person1.name = "桃子";
person1.id = "123456";
//两者一样,如果不重写toString()方法,
//默认输出地址:com.ruandy.VIP06_OPP.day0723object.Person@1b6d3586
System.out.println(person1);//默认输出地址
System.out.println(person1.toString());//默认输出地址
//hashCode()
}
}
运行结果:
三.hashCode()方法
hashCode():返回该对象的哈希码值,用来比较两个对象是否相等;
如:Map集合(key,value);用来提高搜索效率。
Object类中的hashCode()方法:
public native int hashCode();
四.equals()方法
equals():用来比较两个对象是否相等。
Object类中的equals()方法:
public boolean equals(Object obj) {
return (this == obj);
}
父类Object比较对象的规则:Object中equals()方法还是使用的是双等号==比较。
重写equals()方法:
public class Person extends Object {
String name;//名字
String id;//身份证
/**
* 覆盖equals()方法的意义:
* 改变父类比较对象的规则(父类Object比较对象的规则:Object中equals()方法使用的还是双等号==比较)
* Object obj:要和当前对象进行比较
* this:当前对象
*
* 内容相同返回true,否则返回false
*/
@Override
public boolean equals(Object obj){
//1.判断obj是否为空
if(obj == null){
return false;
}
//2.判断obj是否为本身
if(obj == this){
return true;
}
//3.判断obj对象是否是Person类或者子类的对象
if(obj instanceof Person){//子类或者类,或者实现类的实例
//3.1将obj类型转换成Person类型(强转)
Person person = (Person) obj;
//3.2自定义比较规则:id相同的两个Person对象,就看做同一个对象
//this.id person.id是否相同
//3.3比较两个字符串是否相等
boolean b = this.id.equals(person.id);
return b;
}
//4.其余结果全部返回false
return false;
}
public static void main(String[] args) {
//toString()
Person person1 = new Person();
person1.name = "桃子";
person1.id = "123456";
//hashCode()
//equals()
Person person2 = new Person();
person2.name = "猕猴桃";
person2.id = "123456";
//==:作用在基本数据类+String类型上,比较的就是数值
System.out.println(6 == 6);//true
//==:作用在对象上,比较的是他们的地址
//两者一样
System.out.println(person1 == person2);//false
System.out.println(person1.equals(person2));//true
Demo01 demo = new Demo01();
System.out.println(person1.equals(demo));//false
}
}
运行结果:
五.hashCode()方法与equals()方法联合使用(注意使用前提)
用来比较两个对象是否相等:
1.要先比较hashCode()方法是否相等
如果不等,那么就没必要往后面进行比较,直接判断两个对象不相等;
如果相等,接下来就需要比较两个对象的equals()方法。
2.比较两个对象的equals()方法是否相等
如果equals()方法相等,那么这两个对象就相等;
如果equals()方法不想等,那么这两个对象就不等。
public class Person1 {
String name;//名字
String id;//身份证
@Override
public int hashCode(){
System.out.println("我是hashCode()方法");
return id.length();//字符串的长度=字符串.length()
}
public static void main(String[] args) {
//toString()
Person1 person1 = new Person1();
person1.name = "桃子";
person1.id = "123456";
Person1 person2 = new Person1();
person2.name = "猕猴桃";
person2.id = "123456";
Person1 person = person1;
//hashCode()和equals()的联合运用
//如果两个对象相同,那么他们的hashCode()值一定要相同;(前提:hashCode和equals都不重写)
System.out.println(person.equals(person1));
System.out.println(person.hashCode());
System.out.println(person1.hashCode());
//如果两个对象的hashCode()值相同,那么他们并不一定相同,因为还是要比较equals方法(只重写hashCode()方法)
System.out.println("============================");
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
System.out.println(person1.equals(person2));
}
}
运行结果: