一、简要介绍

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()方法,如下图所示:

Java 判断 对象类型 java判断object对象的类型_JVM


随后自动生成了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对象被回收了