一、简要介绍
1、 超类、基类,所有类的直接或间接父类,位于继承树的最顶层
2、任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
3、Object类中所定义的方法,是所有对象都具备的方法
4、 Object类型可以存储任何对象
1) 作为参数,可接受任何对象
2) 作为返回值,可返回任何对象
二、主要方法
1、getClass()方法
public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型(即,返回值是class类型)
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
//new两个student对象
Student s1 = new Student("张三",20);
Student s2 = new Student("李四",18);
// getClass返回 class类型
// 判断s1 和 s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.getClass();
if(class1==class2){
//s1 和 s2都是Student类型,因此输出这个
sout("s1和s2是同一个类型");
}else{
sout("s1和s2不是同一个类型");
}
2、hashCode()方法【哈希码】
public int hashCode(){}
- 返回该对象的哈希码值
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的值
- 一般情况下相同对象返回相同哈希码
仍然使用上个方法中的s1和s2,因为s1和s2是两个不同的对象,它们在内存中开辟的空间不同,因此哈希码一定不同。
s1.hashCode();
s2.hashCode();
// s1、s2哈希码不同
Student s3 = s1; // 此时s3的hashCode与s1相同
3、toSring()方法
public String toSring(){}
- 返回该对象的字符串表示(表现形式)
- 可以根据程序需求覆盖该方法(即,重写这个方法),如:展示对象各个属性值
直接在主类中引用toSring()方法:
sout(s1.toString()); // 直接打印包+类名+哈希值
这个打印出来的结果就是s1的包+类名+哈希值,在实际项目中没有太大用处,我们可以重写这个方法。
在student类中 alt + enter + s
,重写toSring()方法,如下图所示:
随后自动生成了toSring()方法,代码如下:
@override
public String toString(){
return "Student [name = " + name + ", age = " + age + "]";
}
此时在主方法中进行调用,代码和控制台输出结果如下所示:
sout(s1.toString());
sout(s2.toString());
//控制台输出结果
Student [name = 张三, age = 20]
Student [name = 李四, age = 18]
4、equals()方法
public boolean equals(Object obj){}
- 默认实现为
(this == obj)
, 比较两个对象 地址是否相同 - 可进行覆盖(重写),比较两个对象的内容是否相同
// 判断两个对象是否相等
sout(s1.equals(s2)); // false
Student s4 = new Strudent("小明", 17);
Student s5 = new Strudent("小明", 17);
sout(s4.equals(s5)); // false,因为堆中地址不同
// 重写,比较两个对象的实际内容是否相同
/*
在student类中alt + enter + s ,重写equals()方法
步骤 1. 判断两个引用是否指向同一个对象
2. 判断obj是否为null
3. 判断是否是同一种类型
4. 强制类型转换
5. 依次比较各个属性值是否相同
*/
@override
public boolean equals(Object obj){
// 1.判断两个引用是否指向同一个对象
if(this == obj){
return true;
}
// 2.判断obj是否为null
if(obj == null){
return false;
}
// 3.判断是否是同一种类型
// if(this.getClass() == obj.getClass()){}
// instanceof 判断对象是否是某种类型,此处判断obj是否是Student类型
if(obj instanceof Student){
// 4.强制类型转换
Student s = (Student)obj;
// 5. 比较属性
if(this.name.equals(s.getName()) && this.age == s.getAge()){
return true;
}
}
return false;
}
5、finalize()方法
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象
- 垃圾回收:由gc销毁垃圾对象,释放数据存储空间
- 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
- 手动回收机制:使用
System.gc();
通知JVM执行垃圾回收
在student类中重写finalize()方法:
@Override
protected void finalize() throws Throwable{
sout(this.name + "对象被回收了");
}
在主类中引用:
psvm(String[] args){
Student s1 = new Student("aaa", 29); // 不是垃圾
new Student("bbb", 30); // 是垃圾,会被回收
//回收垃圾
System.gc();
}
//控制台输出内容
bbb对象被回收了