10.9-Object类
Java默认继承object类,Java类都继承了object类的属性及方法
toString()
默认返回值为string类型 类名全称@0x(hashcode值)
例子
package day10_9;
import java.util.Arrays;
public class ObjectDemo {
public static void main(String[] args) {
int[] ary = {1,2,3};
//此处默认调用了object类中的toString方法
System.out.println(ary/*.toString()*/);
//输出ary数组的内容
System.out.println(Arrays.toString(ary));
}
}
equals()
与==
作用相同,均为比较引用地址是否相等
引用相等:比的是对象的引用地址,比得是是否为同一个对象
对象相等:比的是对象中的数据,比的是对象中的内容
注意:一般情况下,在子类中需要重写equals(),以实现对象内容(对象数据)的比较
覆盖规则:
自反性:自己与自己比结果要返回true
x.equals(x)->true
对称性:
x.equals(y)->true
y.equals(x)->true
传递性:
x.equals(y)->true
y.equals(z)->true
z.equals(x)->true
一致性:
x.equals(y)
一开始的结果为true,后期只要不对x, y的属性做出任何的修改,再次使用x.equals(y)结果依旧为true
hashCode()
原则上不同的对象调用object类中的hashcode()返回的值是不同的
hashCode()
要与equals()
一同覆盖当两个对象
equals()
比较为true时,应该具有相同的hashCode值当两个对象
equals()
比较为false时,应具有不同的hashCode值hashCode值要稳定,一个对象创建以后就不应该再发生变化
一般使用对象的OID值作为hashCode值,OID是对象的唯一编号,在项目中都是根据数据生成一个OID,就是数据库的主键(唯一约束性)
综合例子
package day01;
import java.util.Arrays;
public class ObjectDemo {
public static void main(String[] args) {
int[] ary = {1,2,3};
//此处默认调用Object类中的toString()方法
System.out.println(ary/*.toString()*/);
//输出ary数组的内容
System.out.println(Arrays.toString(ary));
String s = "abc";
String s3 = "abc";
/*
* String类型的字面量保存在内存的常量池中
* 常量池有常量优化机制,会把相同的字面量
* 优化同一个,所以s和s3引用的是同一个"abc"
*/
System.out.println(s==s3);//true
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2);//false
/*
* String类已经重写Object类中的equals()
* 重写之后的equals()比较的是两个字符串的
* 内容是否相等
*/
System.out.println(s1.equals(s2));//true
int[] ary1 = {1,2,3};
System.out.println(ary==ary1);//false
//此处默认调用Object类中的equals()
System.out.println(ary.equals(ary1));//false
Aoo a1 = new Aoo(23);
Aoo a2 = new Aoo(23);
System.out.println(a1==a2);//false
System.out.println(a1.equals(a2));//true
System.out.println(a1.hashCode()==a2.hashCode());
}
}
class Aoo{
int age;
public Aoo(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Aoo other = (Aoo) obj;
if (age != other.age)
return false;
return true;
}
//重写Object类中的equals()
// @Override
// public boolean equals(Object obj) {//this
// if(obj==null) {
// return false;
// }
// if(this==obj) {
// return true;
// }
// if(obj instanceof Aoo) {
// Aoo aoo = (Aoo)obj;
// return this.age==aoo.age;
// }
// return false;
// }
}
最后更新于