目录
一、Object类型的概述
Object类是所有类型的顶层父类,所有类型的直接或者间接的父类;所有的类型中(包括数组)都含有Object类中的所有方法。
随意定义一个类型,不手动显式定义其父类,那么这个类的父类就是Object类。
二、Object类的构造方法
Object类的构造方法:Object()
1、可以自己创建对象。
2、让子类访问,所有子类都会直接或者间接的访问到这个顶层父类的构造方法。
3、Object类在执行构造方法时,不去访问自己的父类,因为没有父类了。
三、Object类的常见方法
1、hashCode方法
哈希码:Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来提高对HashSet 、HashMap、Hashtable哈希表存取对象的使用效率。
这个方法返回的是一个int类型的数字,这个数字可以用来确定对象应该存储在Hash表的哪个位置,这个数字并不是对象在内存对应的地址。
生成数字的原则:
同一个对象多次调用hashCode方法,【必须】返回相同的整数(程序多次运行不要求哈希码值保证一致)
使用equals方法判断相同的两个对象,【必须】返回相同的整数(equals方法是用于决定两个对象是否相同的方法)
使用equals方法判断不相同的两个对象,【尽量】返回不相同的整数(不做强制要求)
Object类型的hashCode,【确实】会根据不同的对象生成不同的整数。
生成hashCode常见的算法 MD4、MD5、SHA-1等。
public class ObjectDemo01 {
public static void main(String[] args) {
/*
1 同一个对象调用多次hashCode 要获得到相同的值
2 如果是指向同一个对象的多个引用 在调用hashCode时获得值时相同的(同一个对象hashcode值相同)
3 不同对象的hashcode值理论上不同(但没有强制要求,不能保证)
*/
User u1 = new User();
int num = u1.hashCode();
System.out.println(num); // 356573597
int num2 = u1.hashCode();
System.out.println(num2); // 356573597
User u2 = u1;
int num3 = u2.hashCode();
System.out.println(num3); // 356573597
User u3 = new User();
System.out.println(u3.hashCode()); // 1735600054
}
}
2、toString方法
返回当前对象的字符串表示。
1.Object类型中,这个方法的实现:全类名 + @ + 哈希码值的十六进制表示
简称这个内容为:对象的地址值
2.对象返回这样一个地址值的字符串,没有什么意义,因此对于子类而言,需要重写父类的这个方法。
//重写Object类的toString方法
public String toString() {
//return "xxx";
return id+"\t"+name+"\t"+age;
}
3、equals方法
用于比较两个对象是否相等的方法,比较的就是“调用者”和“参数”这两个对象
boolean equals(Object obj)
性质:
自反性:自己和自己相等
对称性:A和B相等,那么B就和A相等。A.equals(B)为true,那么B.equals(A)也为true
传递性:A.equals(B)为true,并且B.equals(C)为true,那么A.equals(C)也为true
一致性:A多次调用equals方法用于和B对象比较,应该返回相同的判断结果
在Object类型中,比较的是两个引用是否指向了同一个对象。如果是,才返回true。相当于是在比较两个对象的地址值是否相同。
实际应用中,比较两个对象的内存地址,没有什么意义。因此在自定义的子类中,都要重写这个方法。
public class User{
private int id;
private String name;
private int age;
public User(){
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
//重写equals方法
public boolean equals(Object obj){
//定义规则: User类对象的 id name age 都相同时,就返回true 其他返回false
// this 和 参数obj的比较
User u = (User)obj; // 强转
if(this.id==u.getId() && this.name.equals(u.getName()) && this.age==u.getAge()){
return true;
}else{
return false;
}
}
}
四、== 和 equals 方法的区别
==和equals都是用于比较数据是否相等的方式。
不同点:
1、比较内容的不同:
==可以比较任意数据类型,既可以比较基本数据类型,也可以比较引用数据类型;
equals方法只能比较引用数据类型。
2、比较规则不同:
==在比较基本类型的时候,比较的是数据的值;比较引用类型时,比较的是地址值;
equals方法在重写之前,比较的是两个对象的地址值;在重写之后,按照重写的方式对比。
Object类中的equals方法是只比较的是两个对象的地址是否一样,如果一样就 表示相等,否则就表示不相等.与==的做一样.
String类中的equals方法,只比较两个字符串的内容是否一样,如果一样就 表示相等,否则就表示不相等。
我们可以在子类中重写Object类中的这个方法,即使地址不一样,但是数据一样,也可以认为两个对象相等。
上一篇:(26)Java基础 --继承