Java中,所有的类都继承自Object类,因此万物皆对象?也没错!

那有人会问,我的子类继承的是父类不是Object,怎么说?

如果一个类没用显示的继承某一个类,那么他就会隐式的继承 Object

接下来说重点:我在进这家公司面试的时候问道,“Object类包含了哪些方法?”,犹记得当时一脸懵逼的样子,倒不是说这道题多难,而是那时候弟弟刚大四,虽然是老师直接推荐过去的,但紧张呀。而且还有一些扩展问题,今天就统一总结一下。

  1. protected Object clone() throws CloneNotSupportedException 创建并返回对象的副本(拷贝)

    《阿里巴巴Java开发手册》建议:慎用Objectclone()方法来拷贝对象,因为Objectclone()方法默认是浅拷贝,即拷贝对象在内存中的地址的引用。如果需要深拷贝,需要重写clone()方法。

    即:

    x.clone() != x;
    x.clone().getClass() == x.getcalss();
    x.clone.equals(x); // true

    如果对象的类不支持Cloneable接口,重写clone()方法则会报此异常。Object类本身并不实现接口Cloneable ,因此在类别为Object的对象上调用clone()方法将导致运行时抛出异常.

  2. public String toString() 返回此对象的字符串表示形式。

    《阿里巴巴 Java 开发手册》强制规定:POJO 类必须重写 toString 方法;比如:

    public class QueryParamInfo {
    private Long startTime;
    private Long endTime;
    private String operator;
    private Integer currentPage;
    private Integer size; @Override
    public String toString() {
    return "QueryParamInfo{" +
    "startTime=" + startTime +
    ", endTime=" + endTime +
    ", operator='" + operator + '\'' +
    ", currentPage=" + currentPage +
    ", size=" + size +
    '}';
    }
    }

    这些代码都是插件或者编辑器可以快捷生成的,不用害怕,要养成习惯。那好处是什么呢?很简单,方便在抛出异常时调用POJOtoString()打印其属性值,便于排查问题。

    POJO(Plain Ordinary Java Object)指简单的 Java 对象,也就是普通的 JavaBeans,包含一些成员变量及其 getter / setter ,没有业务逻辑。有时叫做 VO (value - object),有时叫做 DAO (Data Transform Object)。

  3. public final Class<?> getClass() 返回Object运行时类。

    在运行时可以获取对象对应类的信息,详见反射.

    A a = new A();
    Class b = a.getClass();
    System.out.pringtln(b.getName()); // 输出A
  4. public int hashCode() 返回对象的哈希值。

    hashCode()是一个native方法,返回值是整形。该方法将对象在内存中的地址作为哈希码返回,可以保证不同对象的返回值不同。

    hashCode通常在哈希表中起作用,比如hashMap.

    native方法顾名思义就是本地方法,不同平台上的方法不同,有JVM调用实现。比如Thread中的start()方法其实就是调用nativestart0().自己可以在IDE上点进代码看一下。

  5. protected void finalize() throws Throwable 当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法.

    此方法在JDK9中标注deprecated,所以不多说。

  6. public boolean equals(Object obj) 判断两个对象是否相等

    • == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
    • equals()也是判断两个对象是否相等,它有两种使用情况:
      1. 类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
      2. 类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

    举例:

    public class test1 {
    public static void main(String[] args) {
    String a = new String("ab"); // a 为一个引用
    String b = new String("ab"); // b为另一个引用,对象的内容一样
    String aa = "ab"; // 放在常量池中
    String bb = "ab"; // 从常量池中查找
    if (aa == bb) // true
    System.out.println("aa==bb");
    if (a == b) // false,非同一对象
    System.out.println("a==b");
    if (a.equals(b)) // true
    System.out.println("aEQb");
    if (42 == 42.0) { // true
    System.out.println("true");
    }
    }
    }
    • String 中的 equals 方法是被重写过的,因为 objectequals 方法是比较的对象的内存地址,而 Stringequals 方法比较的是对象的值。
    • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

    《阿里巴巴 Java 开发手册》上强调:由于 Objectequals 方法容易抛出空指针异常,所以应该使用常量或者确定不为 null 的对象来调用 equals

    String a = null;
    "test".equals(a); //false
    a.equals("test"); // 抛出异常 // 推荐用法
    Objects.equals(a,"test"); //false
    // 具体原因和使用看java.util.Objects#equals的源码
  7. wait()notify()notifyAll()

    这三个放在一起说是因为,大家都熟悉而且使用场景一致。就是在多线程加同步锁时等待、通知唤醒方法。没错他们不是Thread中的方法是Object的。

总结:

虽然终极父类是Object,但那8个基本类型不在其列。

本篇文章主要就是让大家对Object的印象更加深刻一点,并拓展了一些知识和自己的理解。如有不当之处,望批评指正。对大家有帮助的话点个赞,Wink~~

浅谈Java Object的更多相关文章

  1. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  3. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  4. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  5. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

  6. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  7. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  8. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  9. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

随机推荐

  1. maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。

    注:本文来源于:杨四郎2018  <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...

  2. csp 201903-3 损坏的RAID5

    问题描述 试题编号: 201903-3 试题名称: 损坏的RAID5 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 答题栏     核

  3. 洛谷 P5614题解

    吐槽:数据好像有点水,直接枚举到200可以得80 points. 另:我还是太弱了,比赛的时候只有90 points,#7死卡不过去,最后发现是没有判断 \(z_1\) 和 \(z_2\) 的范围-- ...

  4. 第09组 Alpha冲刺(5/6)

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络请求,前端 ...

  5. JMeter的基本使用

    什么是Jmeter JMeter是Apache基于Java开发的压力测试工具,通俗的说,你想知道你的接口有多猛,你的服务器是否耐揍,这个家伙可以用数据告诉你.原来学过JMeter的基本使用,发现想不起 ...

  6. Mongoose 入门以及实现数据的增、删、改、查

    mongoose 介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具.Mongoose 是 NodeJS 的驱动,不能作为其他语言的驱动. Mong ...

  7. Fluent Meshing生成空心球体网格(空心部分不生成网格)

    原视频下载地址: https://pan.baidu.com/s/1OJdHuIJd7pAr7cHgVCD_0g 密码: puiq

  8. HTTP协议之multipart/form-data

    HTTP协议之multipart/form-data REST API可以用multipart/form-data,来上传文件. 在最初的 http 协议中,没有上传文件方面的功能. rfc1867为 ...

  9. 均值为1的独立指数随机Y1,Y2,组合成的Y=Y1-(Y2-1)^2/2 在Y>0的条件下也是指数随机变量

    均值为1的独立指数随机Y1,Y2,组合成的Y=Y1-(Y2-1)^2/2  在Y>0的条件下也是指数随机变量 另一个条件分布 13题有错误,应该是P{x<X<x+dx,y<Y& ...

  10. docker配置阿里云的仓库源以及安装docker-compose

    [root@localhost mnt]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://3la ...