Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类。这里主要总结Object类中的三个常用方法:toString()、equals()、hashCode()。
1.取得对象信息的方法:toString()
该方法在打印对象时被调用,将对象信息变为字符串返回,默认输出对象地址。
1 class Student 2 { 3 String name = "Mary"; 4 int age = 21; 5 } 6 7 public class Text{ 8 public static void main(String[] args) 9 { 10 Student s = new Student(); 11 System.out.println("姓名:"+s.name+",年龄:"+s.age);//输出对象属性 12 System.out.println(s);//直接输出对象信息 13 System.out.println(s.toString());//调用父类方法输出对象信息 14 } 15 }
输出结果:
姓名:Mary,年龄:21
ClassNotes.Student@15db9742
ClassNotes.Student@15db9742
上述结果看出编译器默认调用toString()方法输出对象,但输出的是对象的地址,我们并不能看懂它的意思。那么就要通过重写Object类的toString()方法来输出对象属性信息。
1 class Student 2 { 3 String name = "Mary"; 4 int age = 21; 5 public String toString() 6 { 7 return "姓名:"+name+",年龄:"+age; 8 } 9 }
输出结果:姓名:Mary,年龄:21。这样对象信息就更加清晰了。
2.对象相等判断方法:equals()
该方法用于比较对象是否相等,而且此方法必须被重写。
1 class Student 2 { 3 String name; 4 int age; 5 public Student(String name,int age) 6 { 7 this.name=name; 8 this.age=age; 9 } 10 } 11 12 public class Text{ 13 public static void main(String[] args) 14 { 15 Student s1 = new Student("Mary",21); 16 Student s2 = new Student("Mary",21); 17 System.out.println(s1.equals(s2));//输出一个boolean值 18 System.out.println(s1.equals(s2)?"s1和s2是同一个人":"s1和s2不是同一个人");//?:条件运算符 19 } 20 }
输出结果:s1和s2不是同一个人。
很明显输出的结果是错误的,因为equals()方法比较的是两个对象的地址,所以必须重写方法才能到达目的。
1 //重写父类(Object类)中的equals方法 2 public boolean equals(Object o) 3 { 4 boolean temp = true; 5 Student s1 = this; 6 if(o instanceof Object) 7 { 8 Student s2 = (Student)o; 9 if(!(s1.name.equals(s2.name)&&s1.age==s2.age)) 10 { 11 temp = false; 12 } 13 } 14 else 15 { 16 temp = false; 17 } 18 return temp;//返回一个布尔值 19 }
上面的是书上的例子,不太好理解,我自己编了一个equals()方法,简单但不知道对不对:
1 class Student 2 { 3 String name; 4 int age; 5 //重写父类(Object类)中的equals方法 6 public boolean equals() 7 { 8 boolean temp; 9 Student s1 = new Student(); 10 s1.name="张三";s1.age=12; 11 Student s2 = new Student(); 12 s2.name="张三";s2.age=12; 13 if((s1.name.equals(s2.name))&&(s1.age==s2.age)) 14 { 15 temp = true; 16 } 17 else 18 { 19 temp = false; 20 } 21 return temp; 22 } 23 } 24 25 public class Text{ 26 public static void main(String[] args) 27 { 28 Student s3 = new Student(); 29 System.out.println(s3.equals()?"是同一人":"不是同一人"); 30 } 31 }
***在Eclipse偶然发现一个快捷键,按住ctrl+/会注释当前行
3.对象签名:hashCode()
该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保相等的两个对象拥有相等的.hashCode。
1 class Student 2 { 3 String name; 4 int age; 5 //重写父类(Object类)中的equals方法 6 public boolean equals() 7 { 8 boolean temp; 9 Student s1 = new Student(); 10 s1.name="张三";s1.age=12; 11 Student s2 = new Student(); 12 s2.name="张三";s2.age=12; 13 System.out.println("s1的哈希码:"+s1.hashCode()); 14 System.out.println("s2的哈希码:"+s2.hashCode()); 15 if((s1.name.equals(s2.name))&&(s1.age==s2.age)) 16 { 17 temp = true; 18 } 19 else 20 { 21 temp = false; 22 } 23 return temp; 24 } 25 //重写hashCode()方法 26 public int hashCode() 27 { 28 return age*(name.hashCode()); 29 } 30 } 31 32 public class Text{ 33 public static void main(String[] args) 34 { 35 Student s3 = new Student(); 36 System.out.println(s3.equals()?"s1和s2是同一人":"s1和s2不是同一人"); 37 } 38 }
输出结果:
s1的哈希码:9298668
s2的哈希码:9298668
s1和s2是同一人