Object类 与 Object类中的常用方法及方法源码

目录

1.Object类的概述

2.Object类中的常用方法

1.toString()

注意:

2.equals()

注意:

3.hashCode()

注意:



1.Object类的概述

  Object类在java里面是一个比较特殊的类,java语言开发者为了让这个类组织结构比较方便,它提供了一个最上层的类,相当于所有的类都是从这个类继承,这个类就叫Object类。所以Object类是所有java类的根基类,是所有java类的老祖宗。所有的类,不管是谁,都是从它继承下来的,如下图所示。

d927af6cf5a340ae83dda0ebbc8cdd4c.png

Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。

显式继承:

public class demo extends Object{

}

隐式继承:

public class demo {

}

Object类是所有java类的祖先(根基类)。每个类都使用 Object 作为超类(父类)。所有对象(包括数组)都实现这个类里所包含的方法。

2.Object类中的常用方法

1.toString()

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

public class Student {
    private  String name;//姓名
    private  int age;//年龄
    private  int num;//学号

    public Student(){//无参构造方法

    }

    public Student(String name, int age, int num) {//有参的构造方法
        this.name = name;
        this.age = age;
        this.num = num;
    }

    
}

首先创建一个Student类,随便声明几个成员变量和构造方法

public class Test {
    public static void main(String[] args) {
        Student stu1 = new Student("张三",10,100001);//先创建一个Student类的对象
        System.out.println(stu1.toString());
        System.out.println(stu1);

    }
}

再创建一个测试类Test,在Test类中创建main方法,用有参构造方法创建一个Student的对象stu1,并输出student对象e72b1bec7d4c4942a69332c97e37e59e.png

 在这可以看到,我们在Student类中并没有定义toString()方法,但是我们调用toString()的时候也没有报错,也可以执行。这是因为Student类继承Object类,而根据我们在继承那学到的,当时用一个方法时,如果子类中没有重写的话,会默认调用父类中的方法,在这块,我们就是使用的是Object类中的toString()方法。还有就是直接输出student对象和调用toStudent()方法,效果是相同的,即就是直接输出student时会默认调用toString()方法。

现在我们看一下我们到底用的是不是Object类中的toString()方法(不会查看源码的同学去我的博客里找一下查看源码的方法)

fcfe899406b64001a33fcc64ed72b50d.png

 toString()方法体中

return getClass().getName() + "@" + Integer.toHexString(hashCode());

其中getClass()方法是获得创建stu1对象的Student类的Class类对象(这个就比较难,现在不会也没关系,有兴趣的可以百度学习),简单理解就是getClass()方法可以获得到Student类的所有信息。getClass().getName()可以得到该类的路径;然后后面加的"@"符号是开发者自己定义,在后面的Integer.toHexString(hashCode()),先讲括号里的hashCode()方法,这个方法的作用就是从内存中拿到stu1对象的地址,而1b6d3586看起来怪怪的是因为通过类名Ingeter调用toHexString()方法,将hashCode()方法获得到的内存地址转换成16进制(为什么用16进制而不用其它进制?我认为是转化为16进制比较短,方便肉眼对比两个或多个物理地址是否相同)

注意:

String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息

2.equals()

Object类中的equals() 方法用于比较两个对象是否相等。

equals() 方法比较两个对象,是判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等"=="是一个效果。

还使用上面创建的Student类

public class Student {
    private  String name;//姓名
    private  int age;//年龄
    private  int num;//学号

    public Student(){//无参构造方法

    }

    public Student(String name, int age, int num) {//有参的构造方法
        this.name = name;
        this.age = age;
        this.num = num;
    }

    
}

首先创建一个Student类,随便声明几个成员变量和构造方法

public class Test {
    public static void main(String[] args) {
        Student stu1 = new Student("张三", 10, 100001);//先创建一个Student类的对象stu1
        Student stu2 = new Student("张三", 10, 100001);//再创建一个Student类的对象stu2
        //此时stu1与stu2的内容相同

        //因为Student类没有重写equlas(),所以我们调用的就是Object类中的equlas()方法
        System.out.println(stu1==stu2);
        System.out.println(stu1.equals(stu2));
    }
}

再创建一个测试类Test,在Test类中创建main方法,用有参构造方法创建Student的对象stu1和stu2,用"=="和equals()方法比较一下stu1和stu2,并输出。afb0b3fed1954732b01ec150c7b65547.png

 可以看出两个效果相同,查看一下Object类中equals()方法的源码(不会的同学在我博客里找)

2c56db3da10542cfb04fba835c759b02.png

 return (this == obj);

其中的this就是指的是stu1,obj就是stu2,所以Object类中equals()底层源码就是用"=="号

注意:

这是说的equals()方法是Object类中的,而java中的大部分类都把equals()方法重写,例如String、Date、File、包装类等都重写了Object类中的equals()方法。

3.hashCode()

Object类中的hashCode() 方法用于获取对象的 hash 值。

还使用上面创建的Student类

public class Student {
    private  String name;//姓名
    private  int age;//年龄
    private  int num;//学号

    public Student(){//无参构造方法

    }

    public Student(String name, int age, int num) {//有参的构造方法
        this.name = name;
        this.age = age;
        this.num = num;
    }

    
}

首先创建一个Student类,随便声明几个成员变量和构造方法

public class Test {
    public static void main(String[] args) {
        Student stu1 = new Student();
        Student stu2 = new Student();
        System.out.println(stu1.hashCode());
        System.out.println(stu2.hashCode());
    }
}

再创建一个测试类Test,在Test类中创建main方法,用有参构造方法创建Student的对象stu1和stu2,通过引用变量调用hashCode(),并输出。

8beebc5906ce4144a093f13fad44467c.png

 输出就是stu1与stu2在内存中的地址,查看源码6eca0a66e97c4140b858faf91ba95030.png

 可以看到这个方法是没有方法体的,就像抽象方法一样,这个给大家普及一下,这是本地方法就是电脑操作系统的方法,是由C语言或者C++实现的,java只是负责调用,本地方法native关键字修饰。

注意:

因为hashCode()是本地方法,所以就没有重写这一说。

最后,觉得有用的话,可以点赞、收藏,加关注哟,要不下次就找不见了哟!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值