一(Object类的概念):
Java提供了一个Object类,它是所有类的父类,每个类都直接或间接继承Object类,因此Object类又称为“超类”。当定义一个类时,如果没有使用extends关键字为这个类显式指定父类,该类则会默认继承Object类。
二(Object类中的常用方法):
boolean eauals ( ) | 判断两个对象是否相等 |
int hashCode ( ) | 返回对象的散列码值 |
String toString ( ) | 返回对象的字符串表示形式 |
1.toString()方法的底层源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
根据上述源码,Object类型中toString返回的是"类名@16进制的hashCode",如果需要在输出对象时,返回的是对象中属性,需要重写toString()。
没重写toString()方法:
package Object类;
import java.util.Objects;
public class Demo1 {
public static void main(String[] args) {
User user=new User("李刚",20);
System.out.println(user.toString());
}
}
class User{
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o){
/*
什么情况下true
1.引用相同
2.属性相同
*/
if (this == o) {// 1.引用相同
return true;
}
//2.属性相同:需要判断o能不能转成User,如果可以则转为User然后比较内容
if(o instanceof User){//判断是否可以转User
//如果可以则直接转为User
User u=(User)o;
//比较属性值
return this.name.equals(u.name)&&this.age==u.age;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
重写tostring()方法后:
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
2.hashCode():散列码,是由对象导出的一个整数值,且散列码没有规律。由于hashCode()定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。
package Object类;
public class Demo2 {
public static void main(String[] args) {
String s1="abc";
StringBuffer sb1=new StringBuffer(s1);
System.out.println("s1的hashCode值:"+s1.hashCode()+",sb1的hashCode值:"+sb1.hashCode());
String s2=new String("abc");
StringBuffer sb2=new StringBuffer(s2);
System.out.println("s2的hashCode值:"+s2.hashCode()+",sb2的hashCode值:"+sb2.hashCode());
/*
s1和s2是相同的,因为String类重写hashCode方法,这个hashCode方法中的散列值是根据内容得出的
所以:内容相同,hashCode值相同
sb1和sb2的散列码不相同,因为StringBuffer没有重写hashCode方法,
它的散列码是有Object算出的,默认hashCode方法算出的是对象的地址
*/
}
}
注意:String类重写了hashCode()方法,StringBuffer类和StringBuilder类都没有重写。所以对于String类来说,hashCode()方法中的散列值是根据内容得出的 只要字符串内容相同,hashCode值相同。 其余类的散列码是由Object类算出的,默认hashCode方法算出的是对象的地址。
3.equals方法:
"==",若判断基本数据类型,比较的是值是否相同;如果比较对象,判断的是引用地址是否相同。
在Object类中,equals方法判断两个对象是否具有相同的引用(比较引用地址), 如果需要实现比较对象中的属性内容,要根据自己要求重写equals方法。
equals方法底层源码:
public boolean equals(Object obj) {
return (this == obj);
}
eg:
package Object类;
public class Demo3 {
public static void main(String[] args) {
User u1=new User("苍老师",19);
User u2=new User("小泽老师",18);
System.out.println(u1==u2);//false ;比较是u1和u2地址是否相同
User u3=new User("波多老师",20);
User u4=new User("波多老师",20);
System.out.println(u3==u4);//false;u3和u4地址不同
System.out.println(u3.equals(u4));//false;因为equals底层源码判断的是对象的引用地址是否相同
}
}