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()方法的返回值