'); } '); } Object类中的方法 | Journey to paradise

Object类中的方法


Object类中的方法

Object是JDK类库的根类,所有类都直接或间接继承了Object,下面简要介绍Object类中常用的的几个方法:String toString():将对象转化成字符串形式,boolean equal():判断两个对象是否相等,protected Object clone():负责对象克隆,int hashCode():获取对象哈希值,protected void finalize():垃圾回收器调用...


toString()

要点

1、源代码长什么样?
public String toString(){
    return this.getClass().getName() + "@" + Integer.toHexString (hashcode());
}
源代码上toString()方法的默认实现是:返回对象的字符串表示形式:
    类名@对象的内存地址转换为十六进制的形式

2、建议所有的子类都重写toString()方法,返回你想要的字符串
3、System.out.println(引用)输出引用时会自动调用该引用的toString()方法
4、String类中默认覆写toString()方法,返回String类对象的内容。
5、idea可以直接生成toString()方法(覆写过)

equals()

要点

1、equals方法的源代码
public boolean equals(Object obj){
    return (this==obj);
}
源代码上equals()方法的默认实现是:
比较两对象的内存地址是否相等("=="比较的是内存地址)
2、一般equals()方法会被覆写,用来比较两对象的内容是否相等。
3、基本数据类型用"=="来比较是否相等,引用数据类型用equal()方法来比较是否相等,"=="比较的是内存地址是否相等。
4、String类默认覆写equals()方法,比较String类对象的内容是否相同,判断字符串是否相等最好不要用"==",要调用字符串对象的equals方法。
5、equals()方法的覆写要彻底。
    当覆写A类的equals()方法要调用B类的equals()方法,那么B类的equals()方法也要被覆写。
    建议所有类的equals()方法都覆写。
6、idea可以直接生成equal()方法(覆写过)

实例

class MyTime{//extends Object{
    int year;
    int month;
    int day;

    public MyTime(){}
    public MyTime(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    //默认的equals方法
    /*
    public boolean equals(Object obj){
    return (this==obj);
    }
    */
    //覆写equals()方法
    public boolean equals(Object obj){
        //如果this和obj保存的内存地址相同则它两指向的堆内存的对象肯定是一个,直接返回true
        if(this==obj){return true;}
        
        //如果obj是空或obj不是MyTime类的,返回false。
        if(obj==null || !(obj instanceof MyTime)){return false;}

        //程序执行到此说明obj不是null是MyTime类型
        //obj向下转型为MyTime类
        MyTime t = (MyTime)obj;

        //返回this和obj的内容是否相同
        return this.year == t.year && this.month == t.month && this.day =t.day ;
    }

finalize()

要点

1、在Object类中的源代码:
protected void finalize() throws Throwable{ }
GC:负责调用finalize()方法。

2、finalize()方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。
finalize()只需要重写,重写完将来自动会有程序来调用。

3、finalize() 方法的执行时机:
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用

4、finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。

5、静态代码块的作用是什么?
static {...}
静态代码块在类加载时刻执行,并且只执行一次。
这是一个SUN准备的类加载时机。

6、java中的垃圾回收器不是轻易启动的,拉圾太少,或者时间没到,种种条件下,有可能启动,也有可能不启动。

实例

public class Test{
    public static void main (String[] args){
        /*
        //创建对象
        Person p=new Person();
        //怎么把Person对象变成垃圾?
        p=null;
        */
        //多造点垃圾
        /*
        for(int i=0;i< 100000000;i++){
            Person p = new Person();
            p = null;
        }
        */
        for(int i=0;i<1000;i++){
            Person p = new Person();
            p=null;
            //有一段代码可以建议垃圾回收器启动。
            System.gc();//建议启动垃圾回收器。(只是建议,可能不启动,也可能启动。启动的概率较大
        }
    }
}
    //项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间!!!
    //记录对象被释放的时间点,这个负责记录的代码写到哪里?写到finalize()方法中       

class Person{
    //重写finalize()方法
    //Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用:p.finalize();
    protected void finalize()throws Throwable{
        //this代表当前对象
        System.out.println (this +"即将被销毁!");
    }
}

hashCode()

要点

1、在Object中的hashCode方法源码是怎样的?
    public native int hashcode();
    这个方法不是抽象方法,带有native关键字,底层调用c++程序。

2、hashCode()方法返回的是哈希码:
    实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。

不多讲,以后再说,查文档看详细用法。

clone()

要点

不多讲,用的少,查文档看详细用法(可以了解一下深克隆浅克隆)。

文章作者: 涂爽
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 涂爽 !
评论
 上一篇
数组简介 数组简介
数组简介 示例一 要点 main方法上面的String[] args数组主要是用来接收用户输入参数的, 用户可以在控制台上输入参数,这个参数自动会被转换为&q
2021-09-29
下一篇 
匿名内部类 匿名内部类
匿名内部类 内部类 要点 1、什么是内部类? 内部类:在类的内部又定义了一个新的类。被称为内部类。 2、内部类的分类: 静态内部类:类似于静态变量 实例内部类:类似于实例变量
2021-09-23
  目录