1.Object类
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。
在Java中所有子类只能同时继承一个类,那所有类默认继承Object为什么还可以继承另一个类?
类似于 当前Student默认继承了Object类
当我们定义一个Person类让Student继承此时并不会报错
这是因为Person默认继承了Object类Student继承了Person等于间接继承Object类。
Obeject的使用
此时我们可以知道Obeject是所有子类的父类
我们可以使用Object接收所有类的对象
class Person{}
class Student{}
public class Test {
public static void main(String[] args) {
function(new Person());
function(new Student());
}
public static void function(Object obj) {
System.out.println(obj);
}
}
//执行结果:
Person@1b6d3586
Student@4554617c
例如 向上转型
所以在开发之中,Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法。如下:
getClass()是返回该类的类型的方法例如
此时对象student是什么类它就返回什么类
2. 对象比较equals方法
在Java中,进行比较时:
a.如果左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
Object类中的equals方法
this == student, obj == student1
当我们直接比较连个学生时
此时我们定义的年龄都是10 但是结果都是
这是因为两者都是引用对象都是比较其地址的
此时我们要想用equals通过年龄去比较就要重写equals方法
此时再运行就能比较了
**结论:**比较对象内容是否相等时要重写equals
3. hashCode方法
由于hashCode使用c++编写的我们不能看到源代码
了hashCode()这个方法,他帮我算了一个具体的对象位置,这里面涉及数据结构,但是我们还没学数据结构,没法讲述,所以我们只能说它是个内存地址。然后调用Integer.toHexString()方法,将这个地址以16进制输出。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例
代码:
此时可以看出两个对象的地址并不一样
此时我们在所有类当中重写hashCode方法就可以了
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的
散列码,进而确定该对象在散列表中的位置。