zoukankan      html  css  js  c++  java
  • Java中的Object类

    Java中的Object类

    Object类简介

    Object类是Javajava.lang包下的核心类,Object类是所有类的父类,何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类;

    Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在程序编译期间自动导入

    以下两种类的定义的最终效果是完全相同的:

    class Person { }
    
    class Person extends Object { }
    

    使用Object类型接收所有类的对象

    Object per = new Person();
    
    Object stu = new Student();
    

    Object 类的结构图(Object提供了11 个方法)

    clone()

    保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

    getClass()

    final方法,返回Class类型的对象,反射来获取对象。

    toString()

    该方法用得比较多,一般子类都有覆盖,来获取对象的信息。

    finalize()

    该方法用于释放资源。在垃圾收集器执行的时候会调用被回收对象的此方法。

    equals()

    比较对象的地址或者内容(覆写)是否相等

    hashCode()

    该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

    wait()

    wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

    调用该方法后当前线程进入睡眠状态,直到以下事件发生。

    1. 其他线程调用了该对象的notify方法。
    2. 其他线程调用了该对象的notifyAll方法。
    3. 其他线程调用了interrupt中断该线程。
    4. 时间间隔到了。

    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

    notify()

    该方法唤醒在该对象上等待的某个线程。

    该方法用来通知那些可能等待该对象的对象锁的其他线程。如果有多个线程等待,则线程规划器任意挑选出其中一个 wait()状态的线程来发出通知,并使它等待获取该对象的对象锁(notify 后,当前线程不会马上释放该对象锁,wait 所在的线程并不能马上获取该对象锁,要等到程序退出 synchronized 代码块后,当前线程才会释放锁,wait所在的线程也才可以获取该对象锁),但不惊动其他同样在等待被该对象notify的线程们。当第一个获得了该对象锁的 wait 线程运行完毕以后,它会释放掉该对象锁,此时如果该对象没有再次使用 notify 语句,则即便该对象已经空闲,其他 wait 状态等待的线程由于没有得到该对象的通知,会继续阻塞在 wait 状态,直到这个对象发出一个 notify 或 notifyAll。这里需要注意:它们等待的是被 notify 或 notifyAll,而不是锁。这与下面的 notifyAll()方法执行后的情况不同。

    notifyAll()

    该方法唤醒在该对象上等待的所有线程。

    Object类的常用方法

    toString方法

    toString():取得对象信息,返回该对象的字符串表示

    在使用对象直接输出的时候,默认输出的是一个对象在堆内存上的地址值;如若要输出该对象的内容,则要覆写toString()方法 . toString( )的核心目的在于取得对象信息

    String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见String就执行了+,都要求其变为字符串后连接,而所有对象想要变为字符串就默认用toString( )方法

    System.out.println("hello" + 123);
    
    >>> 输出:hello 123
    

    为什么hello 和 123 (一个是字符串,一个是int类型的数据) 就可以直接拼接在一起呢?

    因为字符串的爸爸,在这个拼爹的时代,他有一个万能的爸爸Object

    换而言之,Object是所有类的父类,任意类都是继承Object类的。而Object中定义了 toString()方法,所以任意类中都包含了toString()方法,对象在实例化之后都可以调用。

    所以任意对象转字符串的输出,是通过覆写 toString()方法实现的。

    每一个类中都包含有toString(),但是并不是每一个类都覆写了toString()

    equals方法

    JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是这样写的:

    public boolean equals(Object obj) {
        //this - s1
        //obj - s2
        return (this == obj);
    }
    

    可以看到,这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。

    所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

    java当中的数据类型和“==”的含义

    • 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。

    • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

      对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

    字符串中的equals

    java.lang目录中找到String类,发现equals方法被重写如下:

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String) anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    

    上述代码可以看出,String类中被复写的equals()方法其实是比较两个字符串的内容。

  • 相关阅读:
    HTTP 状态码大全
    Redis Cluster数据分片机制
    redis 哨兵集群原理及部署
    python 连接 redis cluster 集群
    python连接redis哨兵集群
    Ubuntu设置终端操作行为的回收站
    实用Golang库
    实用的Python库
    Python 生成 JWT(json web token) 及 解析方式
    django 进行语言的国际化及在后台进行中英文切换
  • 原文地址:https://www.cnblogs.com/renxiuxing/p/15031976.html
Copyright © 2011-2022 走看看