Object类位于java.lang包,是所有Java类的祖先。Java中的每个类都是由这个类扩展而来。
定义Java类时如果没有显式的指明父类,那么就默认继承了Object类。
public class Demo {//默认继承了Object类 //... }
在Java中,只有基本类型不是对象。例如数值,字符和布尔型的值都不是对象,是基本数据类型。而所有的数组类型,不管是对象数组还是基本类型数组都是继承了Object类。
int[] intArr=new int[]{1,2,3}; System.out.println(intArr.equals(null));//intArr数组对象调用了父类Object的equals()方法
Object类中定义了一些有用的方,由于是根类,所以这些方法都在其他类中存在,一般是进行了重载或者覆盖,实现了各自自己的具体功能。
比如String类就覆盖了Object类的equals()方法。
equlas()方法
Object类中的equlas()方法用来检测两个对象是否等价,查看Object源码为:
public boolean equals(Object obj) { return (this == obj); }
用的是==比较符。
在Java中,数据等价的基本含义是指两个数据的值相等。在通过Object的equals()方法比较可以看出实际上是“==”来进行比较。对象比较的是引用,即对象在内存中的内存地址,而基本数据类型比较的是值。
在String类中,就重写(覆盖)了Object的equals()方法,String类比较的是字符串是否相等,也就是值相等即可。查看源码可以得知:
//重写了Object类中的equlas()方法 public boolean equals(Object anObject) { //判断两个字符串的内存地址是否相等,如果相等,就说明这两个字符串是同一个 if (this == anObject) { return true; } //判断参数对象是不是String类型的 if (anObject instanceof String) { //如果是,就向上转型成一个String对象 String anotherString = (String)anObject; //对字符串逐个字符进行比较,每个字符都相等,返回true int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
hashCode()方法
散列码(hashCode)是按照一定的算法由对象得到的一个数值,散列码没有规律。如果 x 和 y 是不同的对象,x.hashCode() 与 y.hashCode() 基本上不会相同。hashCode() 方法主要用来在集合中实现快速查找等操作,也可以用于对象的比较。
简单的说,如果两个对象相同,那么它们的hashCode值一定相同;如果两个对象的hashCode值相同,它们并不一定相同。在Java规范里面规定,一般是重写equals()方法应该连带着重写hashCode()方法。
toString() 方法
toString()方法是Object类中定义的一个重要方法,是对象的字符串表示形式,查看源码:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
返回值是String类型,用于描述当前对象的有关信息。Object类中实现的toString()方法是返回当前对象的类型和内存地址信息,但在一些子类(如String、Date等)中进行了重写,也可以根据需要在用户自定义类中重写这个方法。
除了显式的调用对象的toString()方法外,在进行String与其他类型数据的连接操作时,会自动调用toString()方法,而在输出每个对象时,也是自动调用toString()方法。
public class Test { public static void main(String[] args) { String str="123456"; System.out.println(str); System.out.println(str.toString()); A a=new A(); System.out.println(a); System.out.println(a.toString()); } } class A { @Override public String toString() { return "我是A类的toString()方法的返回值"; } }
运行结果为:
123456 123456 我是A类的toString()方法的返回值 我是A类的toString()方法的返回值