1.Object類
Object類是Java中所有類的基類
1.1toString方法
返回對象的字符串表示形式褒颈。 一般來說诵姜, toString方法返回結(jié)果應(yīng)該是一個簡明扼要的表達姆泻,容易讓人閱讀身诺。 建議所有子類覆蓋此方法锭环。該toString類方法返回是一個哈希碼值(地址)。
package com.wyx.a_object;
class Person {
String name;
int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
}
}
這個toString方法會在打印時候自動調(diào)用科侈,new對象時候不會調(diào)用载佳。
1.2equals方法
public boolean equals(Object obj) { return (this == obj); }
Object類下面的equals方法比較的是兩個對象的地址,不看內(nèi)容兑徘。
String類下面的equals方法比較的是內(nèi)容刚盈∠勐澹可以看出String類下面的equals方法重寫了Object類下面equals方法
需求:聲明一個Sutdent類挂脑,new兩個對象,判斷兩個對象內(nèi)容是否相等欲侮,相等輸出true
idea給我們提供了快捷鍵重寫equals方法崭闲,下面是作者自己寫的,沒有使用快捷鍵
package com.wyx.a_object;
import java.util.Objects;
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof Student) {
Student stu = (Student)o;
return this.name.equals(stu.name) && this.age == stu.age;
}
return false;
}
}
public class Demo2 {
public static void main(String[] args) {
Student stu1 = new Student("小明",12);
Student stu2 = new Student("小明",12);
System.out.println(stu1.equals(stu2));
}
}
使用快捷鍵equals寫法
package com.wyx.a_object;
import java.util.Objects;
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
}
public class Demo2 {
public static void main(String[] args) {
Student stu1 = new Student("小明",12);
Student stu2 = new Student("小明",12);
System.out.println(stu1.equals(stu2));
}
}
1.3hashCode()方法
int hashCode();
哈希碼值:在Object類下面威蕉,將內(nèi)存地址(十六進制的值)轉(zhuǎn)為十進制的值刁俭,此時這個十進制的值就叫hash碼。
package com.wyx.a_object;
class Teacher{
}
public class Demo3 {
public static void main(String[] args) {
Teacher teacher1 = new Teacher();
Teacher teacher2 = new Teacher();
System.out.println(teacher1.hashCode());
System.out.println(teacher2.hashCode());
}
}
在String類下面的hashCode()方法是不一樣的韧涨,因為重寫了父類的方法牍戚。
package com.wyx.a_object;
public class Demo4 {
public static void main(String[] args) {
String str1 = new String("a");
String str2 = new String("b");
System.out.println(str1.hashCode());//97
System.out.println(str2.hashCode());//98
}
}
注意:
如果根據(jù)equals(Object)方法兩個對象相等,
則在兩個對象中的每個對象上調(diào)用hashCode方法虑粥,
須產(chǎn)生相同的整數(shù)結(jié)果如孝。如果兩個對象的hash值一樣,對象是不一定一樣
的娩贷。但是如果兩個對象內(nèi)容相等那么hash值一定相等所以重寫equals方法時候也要重寫hashCode方法第晰,
以便維護hashCode方法的通用合同,該方法規(guī)定
相等的對象必須具有相等的哈希嗎。