本文主要是介绍两分钟“手撕”Object类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、什么是Object类
二、Object常见的类
1.toString()方法
2.equals()方法
3.hashcode()方法
一、什么是Object类
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。简单来讲:Object类是所有类的父类。
class Person{}
class Student{}public class Test {public static void main(String[] args) {Func(new Person());Func(new Student());}public static void Func(Object obj){System.out.println(obj);}
}
//执行结果
ObjectPratice.Person@3b07d329
ObjectPratice.Student@404b9385
既然可以向上转型,那就说明Person和Student继承于Object这个类。
二、Object常见的类
1.toString()方法
这是一个常见的方法,如果要打印对象中的内容,可以直接重写Object类中的toString()方法。
怎么重写:右键generate->toString();
// Object类中的toString()方法实现:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
2.equals()方法
在Java中,==进行比较时:
a.如果==左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}
}public class Test {public static void main(String[] args) {int a = 10;int b = 10;Person person1 = new Person("zhangsan", 4);Person person2 = new Person("zhangsan", 4);System.out.println(a==b);System.out.println(person1==person2);System.out.println(person1.equals(person2));}
}
//执行结果
true
false
false
Person类重写equals方法后,然后比较:
import java.util.Objects;class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (obj == null) {return false;}if (this == obj) {return true;}
// 不是Person类对象if (!(obj instanceof Person)) {return false;}
//因为传值过去是向上转型,这时候不能使用子类的name,需要向下转型Person person = (Person) obj; // 向下转型,比较属性值return this.name.equals(person.name) && this.age == person.age;}
}
public class Test {public static void main(String[] args) {int a = 10;int b = 10;Person person1 = new Person("zhangsan", 4);Person person2 = new Person("zhangsan", 4);System.out.println(a==b);System.out.println(person1==person2);System.out.println(person1.equals(person2));}
}
//执行结果
true
false
true
结论:比较对象中内容是否相同的时候,一定要重写equals方法。
3.hashcode()方法
hashCode()这个方法,他帮我算了一个具体的对象位置,我们不大正规的可以说它是个内存地址。
hashcode方法源码:(该方法是一个native方法,底层是由C/C++代码写的。我们看不到。)
public native int hashCode();
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例 代码:
class Person {public String name;public int age;
public Person(String name, int age) {this.name = name;this.age = age;
}
}
public class TestDemo4 {
public static void main(String[] args) {Person per1 = new Person("zhangsan", 20) ;Person per2 = new Person("zhangsan", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());
}
}
//执行结果
460141958
1163157884
注意事项:两个对象的hash值不一样。
但是若两个对象,他们名字和年龄一样的话,在我们的业务逻辑中,我们可以认为他们是同个人 ,用同一个hash值。
像重写equals方法一样,我们也可以重写hashcode()方法。此时我们再来看看:
class Person {
public String name;public int age;
public Person(String name, int age) {this.name = name;this.age = age;
}
//重写hashCode方法
@Override
public int hashCode() {return Objects.hash(name, age);
}
}
public class TestDemo4 {
public static void main(String[] args) {Person per1 = new Person("gaobo", 20) ;Person per2 = new Person("gaobo", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());
}
}
//执行结果
460141958
460141958
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
这篇关于两分钟“手撕”Object类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!