1、getClass():返回对象执行时的实例,也就是获取变量的类型。返回结果形式为:class 包名 类名。
2、toString():将对象返回为字符串的形式。
说明:在代码中,如果用输出语句直接输出对象,将会自动调用 toString()方法。
public class ObjectDemo01 extends Object{
public static void main(String[] args) {
//创建可以装任意类型数据的数组
Object[] arr = new Object[4];
arr[0] = new String("ff");
arr[1] = new Integer(8);
arr[2] = new Object();
arr[3] = new ObjectDemo01();
System.out.println(arr[0].getClass()+" "+arr[0].toString());
//class java.lang.String ff
System.out.println(arr[1].getClass()+" "+arr[1].toString());
//class java.lang.Integer 8
System.out.println(arr[2].getClass()+" "+arr[2].toString());
//class java.lang.Object java.lang.Object@15db9742
System.out.println(arr[3].getClass()+" "+arr[3].toString());
//class Test_1.ObjectDemo01 Test_1.ObjectDemo01@6d06d69c
}
}
重点观察toString()方法输出的结果上,源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
而arr[0]、arr[1]所输出结果与以上格式不相同,是因为在String与Integer类中已经重写了toString()方法。
3、hashCode():用来比较两个对象是否相等。
4、equals():用来比较两个对象是否相等。
类似“==”的作用,比较两个引用类型的“地址”;
toString()方法设计依据:
1.如果输出对象时,想要看到哪些属性的值,就可以将属性拼接在return后面。
2.保证拼接后的结果为String类型
3.拼接的格式自定义
hashCode()方法的设计依据:
1.尽量使用到对象的属性(*)
2.保证最终的返回值类型为int类型,return后面的结果为int类型
举例:
//规则:id相同并且age相同,就说两个对象相等
public class Person {
String id;
String name;
int age;
@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}
if(this == obj){//this和obj都表示的是地址值,所以==比较的是两个对象的地址值是否相同
return true;
}
//判断obj是否属于Person类
if(obj instanceof Person){
//将obj类型转换成Person类型
Person person = (Person) obj;
//自定义比较规则
//id相同并且age相同,就说两个对象相等,也就是返回true
boolean b1 = this.id.equals(person.id);//这里的equals()方法比较的是两个字符串是否相同
boolean b2 = this.age == person.age;
boolean b3 = this.name.equals(person.name);
return b1 && b2 && b3;
}
return false;
}
}
特别的,equals作用到字符串上时:
public class Test {
public static void main(String[] args) {
String str1 = "123";
String str2 = "123";
System.out.println(str1.equals(str2));//true
String str3 = new String("123");
System.out.println(str1.equals(str3));//true
String str4 = new String("123");
System.out.println(str3.equals(str4));//true
}
}
1、
public class Person {
String id;
String name;
int age;
public static void main(String[] args) {
Person person1 = new Person();
person1.id = "1001";
person1.name = "ff";
person1.age = 17;
System.out.println(person1.toString());
Person person2 = person1;
System.out.println(person1.hashCode());//366712642
System.out.println(person2.hashCode());//366712642
}
}
结论:(equals、hashCode都不重写)如果两个对象相同,那么他们的hashCode的值一定相等。
2、
public class Person {
String id;
String name;
int age;
@Override
public int hashCode() {
// TODO Auto-generated method stub
return age;
}
public static void main(String[] args) {
Person person1 = new Person();
person1.id = "1001";
person1.name = "ff";
person1.age = 17;
System.out.println(person1.toString());
Person person2 = new Person();
person1.id = "1001";
person1.name = "dd";
person1.age = 17;
System.out.println(person1.hashCode());//17
System.out.println(person2.hashCode());//17
System.out.println(person1.equals(person2));//false
}
}
结论:(重写了hashCode)如果两个对象的hashCode相同,这两个对象也不一定相同。
(为了提高效率吧)
比较两个对象是否相同:
先看hashCode值是否相同
1.如果hashCode值相同,那么看equals方法是否相同,如果equals也相同,那么两个对象就相同
2.如果hashCode值不相同,那么两个对象就不相同,就没必要去比较equals方法