Java常用类:Object类

Object类

  • Object是所有类的父类,是继承树的最顶层,所有类默认继承Object,或简介继承Object
  • 所有类都具有Object中的定义的方法
  • Object类型可以存储任何对象
    • 作为参数,可以接受任何对象
    • 作为返回值,可以返回任何对象

getClass()

  • 返回引用中存储的实际对象类型
  • 常用于判断两个引用中实际存储对象类型是否一致
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("b",13);
//判断s1和s2是不是一个类型
System.out.println(stu1.getClass().equals(stu2.getClass()));//true

hashCode()

  • 用于返回该对象的哈希值
  • 哈希值根据对象的地址或字符串或数字使用hash算法出的int类型的数值
  • 一般情况下,相同对象返回相同的哈希值
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("a",12);

System.out.println(stu1.hashCode());//460141958
System.out.println(stu2.hashCode());//1163157884
Demo01 stu3 = stu1;//stu3和stu1是不同变量指向的相同地址,指向同一个对象
System.out.println(stu3.hashCode());//460141958

stu1stu2是两个不同的变量指向的不同对象,指向的地址和对象都不相同,虽然内容相同,但哈希值不同

stu1stu3是两个不同的变量指向的相同对象,指向的地址也相同,内容相同,哈希值相同。

toString()

  • 返回该对象的字符串表示(表现形式)
  • 可以根据程序需求重写方法

toString源码:类名+@+hashCode的转换

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());

使用测试:输出哈希值为十六进制

System.out.println(stu1.toString());//com.chachan53.class8common.object.Demo01@1b6d3586
System.out.println(stu2.toString());//com.chachan53.class8common.object.Demo01@4554617c

默认toString

  • toString是Object的方法,作用是返回当前对象的内存地址
  • 对象返回的内容与toString返回的内容相同,重写toString可以改变对象返回的内容
Day d = new Day();//Day为简单测试类
System.out.println(d.toString());
System.out.println(d);

输出结果同为该对象的地址(哈希值)

com.chachan53.pack.Day@1b6d3586
com.chachan53.pack.Day@1b6d3586

重写toString

  • 在简单测试类中对toString进行重写,输出类的其他信息
class Day{
    public int day;

    //有参构造器
    public Day(int day) {
        this.day = day;
    }

    //对toString进行重写,使其输出内容为day
    @Override
    public String toString() {
        return "day=" + day ;
    }
}

应用测试

public class demo02 {
    public static void main(String[] args) {
        //toString
        Day d = new Day(7);
        System.out.println(d.toString());
        System.out.println(d);
    }
}

//运行结果======================================
day=7
day=7

equals()

  • 比较两个参数指向的地址是否相同 this == obj,判断是否为同一对象
  • 可以进行重写,修改比较内容
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("a",12);

System.out.println(stu1.equals(stu2));//false
System.out.println(stu1.equals(stu3));//true

默认比较地址,即使内容相同,指向不同对象,也判断为true

重写equals()为比较属性

  1. 比较两个引用是否指向同一个对象
  2. 判断obj是否为null
  3. 判断两个引用指向的实际对象类型是否一致:getClass()instanceof都是判断变量指向对象的类型是否相等
  4. 强制类型转换:在3中所得到的一致类可能是多态的类,因此对其进行强制转换
  5. 依次比较各个属性值是否相同
@Override
public boolean equals(Object obj) {
    //1. 判断两个对象是否是同一个引用
    if(this == obj){ return true; }
    //2. 判断obj是否为null
    if(obj == null){ return false; }
    //3. 判断是否为同一个类型
    //instanceof判断对象是否为某种类,判断是否有继承关系
    if(obj instanceof Demo01){
        //4. 强制类型转换
        Demo01 s = (Demo01)obj;
        //5. 比较属性
        if(this.name.equals(s.getName()) && this.age == s.getAge()){
            return true;
        }
    }
    return false;
}

重写后:属性相同的比较结果为 true

Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("a",12);

System.out.println(stu1.equals(stu2));//true
System.out.println(stu1.equals(stu3));//true

finalize()

  • 当对象被判定为垃圾对象是,JVM自动调用此方法,用以标记垃圾对象,进入回收队列
  • 垃圾对象:没用有效引用指向此对象
  • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间
  • 自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象
  • 手动回收机制:使用 System.gc(),通知JVM执行垃圾回收
posted @ 2022-03-27 11:06  chachan53  阅读(66)  评论(0编辑  收藏  举报