Object概述

java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。

如果一个类没有特别指定父类, 那么默认则继承自Object类。

常用方法

public String toString():返回该对象的字符串表示。

代码举例:

定义person类

package demo01;

public class Person {
    //创建成员变量
    private String name;
    private int age;
    //getXxx setXxx方法

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //直接打印对象名是输出对象的内存地址值,没有意义。我们要重写toString方法,输出我们想要的内容。

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

定义测试类

package demo01;

public class Demo01ToString {
    public static void main(String[] args) {
        //创建person对象
        Person person = new Person();

          /*java.lang.Object`类是Java语言中的根类,即所有类的父类。
        `public String toString()`:返回该对象的字符串表示。
         */
        //直接打印 对象名 其实就是调用对象的ToString方法。默认输出的是内存地址值
        System.out.println(person);// 等价于    System.out.println(person.toString());

    }
}

执行结果:

注意:

  1. 看一个类是否重写了toString方法,只需要直接打印对象名即可。如果输出结果是内存地址值,那么此类就没有重写toString方法
  2. 在IntelliJ IDEA中,可以点击Code菜单中的Generate,也可以使用快捷键alt+insert,点击toString()选项。选择需要包含的成员变量并确定。

public boolean equals(Object obj):比较其他某个对象是否与此对象“相等”。参数:object obj :可以传递任意的对象。

查看equals源码:

 public boolean equals(Object obj) {
            // 默认是使用== 运算符 去判断2个对象是否相等
            return (this == obj);
        }

分析源码:

this是谁?

谁调用此方法,this就是哪个对象。谁是参数,obj就代表谁。例如:

        Person p1 = new Person("张三", 18);
        Person p2 = new Person("李四", 19);
        boolean b = p1.equals(p2); // this就是p1,obj参数就是p2 , this == obj 等价于 p1 = p2
        System.out.println(b);//false

又因为:

== 比较运算符,返回的是一个布尔值 true false。根据数据类型的不同,比较的内容不同。

  • 基本数据类型:比较的是数值
  • 引用数据类型:比较的是内存地址值

结论:

object 类中的equals方法,默认比较的是对象的内存地址值,没有意义。实际开发中我们需要重写equals方法比较对象的属性值。因为参数是object 是父类传递进来的是子类对象。多态弊端:无法使用子类特有的属性和方法,解决方法:向下转型。大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用Code菜单中的Generate…选项,也可以使用快捷键alt+insert,并选择`equals() and hashCode()进行自动代码生成。生成的equals方法代码如下:

 @Override
    public boolean equals(Object o) {
        // 如果内存地址,一样 那么必然相等,
        if (this == o)
            return true;
        /*getClass() != o.getClass()利用反射技术判断是p,是否是Person类型
        等价于obj  instanceof Person
        */
        if (o == null || getClass() != o.getClass())
            return false;
        Person person = (Person) o;
        //Objects.equals(name, person.name); 可以防止空指针异常,详解:Ojects类equals 源码
        return age == person.age && Objects.equals(name, person.name);

    }

这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。

 

类Object的更多相关文章

  1. java的eclipse操作和常用类Object的使用

    1.eclipse的快捷键: (1)alt + /   内容辅助. 如:main+alt + / 会出现完整的main方法. syso+alt+ / 会输出. 如编写某个方法时,只需写入方法名 + a ...

  2. JAVA 一个特殊的类 Object

    一个特殊的类Object:它是java中所有对象的直接或间接父类,根父类(基类),它里面定义的功能是所有对象都应该具备的(所有的类,都是继承这个类的) 记住:当定义一个新类时,没有指明要继承某类,它默 ...

  3. Java常用类object详解

    1.Object概述: 类Object是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括数组)都实现这个类的方法. 2.构造方法详细信息: Object只有一个无参构造方法,因为ob ...

  4. python 类(object)的内置函数

    python 类(object)的内置函数 # python 类(object)的内置函数 ### 首先 #### 以__双下划线开头的内置函数 __ #### __往往会在某些时候被自动调用,例如之 ...

  5. Java的常用类——Object类、String类

    Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...

  6. Java中特殊的类——Object类

    Java中特殊的类--Object类 1.Object类的概述 Object类是java默认提供的类.Java中除了Object类,所有的类都是有继承关系的.默认会继承Object类,即所有的对象都可 ...

  7. java常用类 --- Object

    Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: n ...

  8. java笔记--超级类Object多线程的应用+哲学家进餐算法内部类与多线程结合

    关于Object类中的线程方法: Object类是所有Java类的 父类,在该类中定义了三个与线程操作有关的方法,使得所有的Java类在创建之后就支持多线程 这三个方法是:notify(),notif ...

  9. C# - 系统类 - Object类

    Object类 ns:System 此类是所有.NET Framework中的类的基类 Type类就派生自Object类 C#提供了object关键字来表示一个类实例的类型 而无需使用Object作为 ...

  10. 【小白的java成长系列】——顶级类Object源代码分析

    首先来说一下api文档使用,api这个词对有一定开发经验的java编程人员来说是非常喜爱的~ java当然也提供了api开发文档,下载地址:http://www.oracle.com/technetw ...

随机推荐

  1. 关于Layer ui的加载层位置居中问题

    最近在项目中一直使用layerui的相应的提示框以及它的加载层,然而就在今天遇到了一个神奇的问题,我使用 var index = layer.load(0, {shade: false}); 结果一直 ...

  2. 使用 Moq 测试.NET Core 应用 -- 其它

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...

  3. Python基础(zip方法)

    zip函数: 描述:将zip函数中的两个可迭代对象参数按对应索引值进行匹配组合,得到zip对象.(拉链式函数) zip函数简单应用如下: #-----------------zip函数-------- ...

  4. 使用chan的时候选择对象还是指针

    使用chan的时候选择对象还是指针 今天在写代码的时候遇到一个问题,在创建一个通道的时候,不确定创建的通道是使用chan A还是chan *A. 思考了一下,觉得这个应该和函数一样是一个值传递还是参数 ...

  5. springcloud~服务注册与发现Eureka的使用

    服务注册与发现是微服务里的概念,也是一个基本的组件,负责服务组件的认证,即实现『你是谁』的功能,在服务注册与发现里,存在两种模式,即服务端发现和客户端发现,咱们今天说的eureka属于客户端发现! 下 ...

  6. 《C#并发编程经典实例》学习笔记—2.2 返回完成的任务

    问题: 如何实现一个具有异步签名的同步方法. 从异步接口或基类继承代码,但希望用同步方式实现方法. 解释一下所谓的异步接口和异步基类.例如如下代码 interface IMyAsyncInterfac ...

  7. 学JAVA第十八天,接口与抽象类进一步加深

    昨天老师讲了建网站,还要交钱买东西的,所以就没写,今天讲了接口与抽象类进一步加深 上完今天的课后,我才知道一个接口可以有多个实现类,一个实现类可以同时接多个接口. 现在就用代码来解释吧!!! 举例用人 ...

  8. 【wif系列】C#之单例模式(Singleton Pattern)最佳实践

    目录 前言 单例基类 单例提供者 总结 前言 在上一篇译文--<深入理解C#--在C#中实现单例模式>中,对在C#中实现单例模式进行了详细阐述.我们在日常的开发中可以采用解决方案4或解决方 ...

  9. webpack中使用DefinePlugin定义全局变量

    DefinePlugin可以在编译时期创建全局变量.DefinePlugin是webpack注入全局变量的插件,通常使用该插件来判别代码运行的环境变量.

  10. Django 传递额外参数及 URL别名

    传递额外参数到视图函数中 在 urls.py 文件中添加下面内容 from django.conf.urls import url urlpatterns = [ url(r'index', view ...