Object类的常用方法

Object类

Object类中的方法是所有子类通用的,任何一个类都直接或间接继承Object类。可以查阅java类库(API)的帮助文档来查看Object类中的方法。

1 toString方法

  • toString()方法的作用是将”java对象“转换为”字符串“的形式

  • toString()方法的默认实现是:类名@对象的内存地址转换位十六进制形式

  • API帮助文档建议所有子类都重写此方法,重写原则:简单且详实

    package com.objecthelp;
    
    public class MyTime {
        public static void main(String[] args) {
            // 实例化一个MyTime对象
            MyTime t1 = new MyTime(1970,1,1);
            // 如果不重写toString方法,运行结果为 com.objecthelp.MyTime@1b6d3586
            String str = t1.toString();
            System.out.println(str); // 运行结果:1970年1月1日
        }
        
        int year;
        int month;
        int day;
    
        // 重写toString方法
        public String toString() {
            return this.year + "年" + this.month + "月" + this.day + "日";
        }
        
        public MyTime() {
        }
    
        public MyTime(int year, int month, int day) {
            this.year = year;
            this.month = month;
            this.day = day;
        }
    }
  • System.out. println(引用);这里会自动调用“引用”的 toString()方法

  • String类重写了toString方法

2 equals方法

  • equals()方法的作用:equals方法是判断两个对象是否相等的

  • 判断两个java对象是否相等,不能使用“==”,因为双等号比较的是两个对象的内存地址

  • 在 Object类中的equals方法当中,默认采用的是“==”判断两个java对象是否相等,所以在子类中需要重写equals方法

  • String类重写了equals方法,比较两个字符串不能用“==”,要用equals方法,equals是通用的

    package com.objecthelp;
    
    public class MyTime {
        public static void main(String[] args) {
            // 实例化一个MyTime对象
            MyTime t1 = new MyTime(1970,1,1);
            // 如果不重写toString方法,运行结果为 com.objecthelp.MyTime@1b6d3586
            String str = t1.toString();
            System.out.println(str); // 运行结果:1970年1月1日
    
            // 如果不重写equals方法,运行结果为false
            MyTime t2 = new MyTime(1970,1,1);
            System.out.println(t1.equals(t2));
        }
    
        int year;
        int month;
        int day;
    
        // 重写toString方法
        public String toString() {
            return this.year + "年" + this.month + "月" + this.day + "日";
        }
    
    /*
        // 重写equals方法基本版
        public boolean equals (Object obj) {
            int year1 = this.year;
            int month1 = this.month;
            int day1 = this.day;
    
            if (obj instanceof MyTime) {
                // 向下强转类型
                MyTime mt = (MyTime)obj;
                int year2 = ((MyTime) obj).year;
                int month2 = ((MyTime) obj).month;
                int day2 = ((MyTime) obj).day;
                // 判断内容是否相等
                if (year1 == year2 && month1 == month2 && day1 == day2) {
                    return true;
                }
            }
            return false;
        }
    */
        // 重写equals方法改进版
        public boolean equals (Object obj) {
            // 如果obj为空,直接返回false
            if (obj == null) {
                return false;
            }
            // 如果obj不是MyTime类,直接返回false
            if (!(obj instanceof MyTime)) {
                return false;
            }
            // 如果obj和this保存的内存地址相同,直接返回true
            if (this == obj) {
                return true;
            }
            // 说明obj类型是MyTime,比较具体数值是否相等
            MyTime obj1 = (MyTime) obj;
            if (this.year == obj1.year && this.month == obj1.month && this.day == obj1.day) {
                return true;
            }
            return false;
        }
    
    
        public MyTime() {
        }
    
        public MyTime(int year, int month, int day) {
            this.year = year;
            this.month = month;
            this.day = day;
        }
    }
  • 结论:比较基本数据类型是否相等,使用“==”,比较引用数据类型是否相等,使用equals方法。

3 finalize方法

  • finalize()方法只有一个方法体,里面没有代码,而且这个方法是 protected修饰的。

  • finalize()方法的执行时机是:当一个java对象即将被垃圾回收器回收的时候,JVM的垃圾回收器GC负责调用finalize()方法,不需要程序员手动调用。

  • finalize()方法实际上是SUN公司为java程序员准备的一个时机:垃圾回收时机,finalize()方法的作用类似于静态代码块的作用,static静态代码块在类加载时刻执行,并且只执行一次。

    package com.objecthelp;
    
    public class FinalizeTest {
        public static void main(String[] args) {
            for (int i = 0; i < 100000; i++) {
                Person person = new Person();
                person = null;
            }
            System.gc(); //建议启动GC,可能启动,也可能不启动
        }
    }
        class Person {
            @Override
            protected void finalize() throws Throwable {
                System.out.println("即将被销毁!");
            }
        }

4 hashCode方法

  • hashCode()方法不是抽象方法,带有 native关键字,底层调用c++程序

  • hashcode()方法返回的是哈希值,实际上是一个java对象的内存地址,经过哈希算法,得出的一个值,所以 hashcode()方法的执行结果可以等同看做一个java对象的内存地址

    package com.objecthelp;
    
    public class HasnCodeTest {
        public static void main(String[] args) {
            Object o = new Object();
            int hashCode1 = o.hashCode();
            System.out.println(hashCode1);
    
            MyClass myClass = new MyClass();
            int hashCode2 = myClass.hashCode();
            System.out.println(hashCode2);
        }
    }
    
    class MyClass {
    
    }
    
    // 运行结果:
    460141958
    1163157884
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值