编程语言
首页 > 编程语言> > 【Java高级】深入浅出谈Object类

【Java高级】深入浅出谈Object类

作者:互联网


作者:Beyong
    
出处:https://blog.csdn.net/weixin_45965358/article/details/116533572?spm=1001.2014.3001.5502
    
本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

文章目录

一.什么是Object类

Object是java中每一个类的“始祖”,每一个类都是由它扩展而来的。就像我们常说我们人类的祖先是亚当,夏娃,那就是我们都是由亚当夏娃衍生而来的。

在这里插入图片描述

在Java中,只有基本数据类型不是对象,其他类型都是对象,都扩展了Object类。

在这里插入图片描述

二.Object的特点

Object类位于java.lang包中,因为java.lang包在编译时自动导入,所以我们的Object类也会自动导入。

Object有两种继承的方式:
显示继承:
在这里插入图片描述
隐式继承:
当我们没有显示继承任何类时,都默认继承了Object。
在这里插入图片描述

三.Object类的方法

1.equals

Object.equals方法是比较两个对象是否相等,也就是比较两个对象引用指向的是不是同一个对象,当然也就是比较两个对象的内存地址是否相等。

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 17:02
 * @ Description: TODO
 */
public class ExtendsTest {
    public static void main(String[] args){
        Object s1 = new Object();
        Object s2 = new Object();
        Object s3 = s1;
        System.out.println("s1 equals s2 is : " + s1.equals(s2));
        System.out.println("s1 equals s3 is : " + s1.equals(s3));
    }
}

在这里插入图片描述

在这里插入图片描述

然而,在实际的开发过程中,判断两个对象的引用是否相等并没有什么实际的意义。所以我们的许多方法都重写了equals方法,但要注意如果子类重写了 equals() 方法,就需要重写 hashCode() 方法,比如String类就重写了equals(),用来判断两个字符串是否相等。

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 17:43
 * @ Description: TODO
 */
public class ExtendsTest2 {
    public static void main(String[] args){
        String s3 = new String("java");
        String s4 = new String("python");
        String s5 = new String("java");
        String s6 = s5;
        System.out.println("s3 equals s4 is : " + s3.equals(s4));
        System.out.println("s3 equals s5 is : " + s3.equals(s5));
        System.out.println("s5 equals s6 is : " + s5.equals(s6));
    }
}

在这里插入图片描述

补充:我们重写equals要符合一定的规范:

2.hashCode

Object hashCode() 方法用于获取对象的 hash 值。
(简单说一下hash值,Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。hash值保证逻辑上的唯一性,比如字符串相同,则hash值相同,而地址值保证地址的唯一性,地址值是由系统分配的,不可能相同)

hashCode与equal的关系:
如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必须与 y.hashCode( ) 具有相同的值

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 17:43
 * @ Description: TODO
 */
public class ExtendsTest2 {
    public static void main(String[] args){
        String s3 = new String("java");
        String s4 = new String("python");
        String s5 = new String("java");
        String s6 = s5;
        System.out.println("s3:" + s3.hashCode());
        System.out.println("s4:" + s4.hashCode());
        System.out.println("s5:" + s5.hashCode());
        System.out.println("s6:" + s6.hashCode());
        System.out.println("s3 equals s4 is : " + s3.equals(s4));
        System.out.println("s3 equals s5 is : " + s3.equals(s5));
        System.out.println("s5 equals s6 is : " + s5.equals(s6));
    }
}

在这里插入图片描述

3.toString

Object.toString() 方法用于返回对象的字符串表示形式。

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 21:24
 * @ Description: TODO
 */
public class ExtendsTest3 {
    public static void main(String[] args){
        MyTest s4 = new MyTest();
        System.out.println(s4.toString());
    }
}
class MyTest{

}

在这里插入图片描述

返回类型为:对象的 class 名称 + @ + hashCode 的十六进制字符串

4.一些线程操作

void notify()
唤醒在该对象上等待的某个线程

void notifyAll()
唤醒在该对象上等待的所有线程

void wait()
让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

void wait(long timeout)
让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。

void wait(long timeout, int nanos)
与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。

四.API

java.lang.Object:

Class getClass( )
返回包含对象信息的类对象。

boolean equals(Object otherObject )
比较两个对象是否相等

String toString( )
返冋描述该对象值的字符串。

java.lang.Class:

String getName( )
返回这个类的名字

Class getSuperclass( )
以 Class 对象的形式返回这个类的超类信息。

标签:深入浅出,Java,String,s3,Object,equals,s5,println
来源: https://blog.csdn.net/weixin_45965358/article/details/116533572