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

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

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

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

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

    《阿里巴巴Java开发手册》建议:慎用Object的clone()方法来拷贝对象,因为Object的clone()方法默认是浅拷贝,即拷贝对象在内存中的地址的引用。如果需要深拷贝,需要重写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 +
    '}';
    }
    }

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

    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()方法其实就是调用native的start0().自己可以在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 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
    • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

    《阿里巴巴 Java 开发手册》上强调:由于 Object 的 equals 方法容易抛出空指针异常,所以应该使用常量或者确定不为 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. 状压dp专题复习

    状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...

  2. maven 左边空了

    看一下maven: 解决方法:进入maven的配置,把maven的路径配置一下,就好了: 结果:

  3. Javascript Date构造函数和比较 (二)

    JavaScript Date对象 构造函数实例 Date构造函数中没有参数,将返回当前日期 var currentDate = new Date(); writeLine(currentDate.t ...

  4. pg数据库中时间查询的方式

    方法一:select * from user_info where create_date>= '2015-07-01' and create_date < '2015-08-15'; 方 ...

  5. BaiduPCS-Go的安装及使用

    BaiduPCS-Go的安装及使用 linux下会提示输入验证码,浏览器打开验证码url,多输入几次 Contents [hide] 一. 软件下载及安装 二. 软件的使用 1. 账号登录与退出 2. ...

  6. 【C++】C++中重载运算符和类型转换

    输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...

  7. layui中的table中toolbar自定义过程

    自己挖过的坑需要自己来填. layui的table默认表头工具栏右边有3个操作,分别是过滤字段.导出excel.打印功能. 在js中代码添加toolbar即可实现上面的效果: table.render ...

  8. GBDT学习笔记

    GBDT(Gradient Boosting Decision Tree,Friedman,1999)算法自提出以来,在各个领域广泛使用.从名字里可以看到,该算法主要涉及了三类知识,Gradient梯 ...

  9. Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法

    转: Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法  更新时间:2018年02月14日 17:13:03   投稿:wdc   我要评论   Java开发中 ...

  10. Ubuntu 上多版本软件管理方法

    https://linuxize.com/post/how-to-install-gcc-compiler-on-ubuntu-18-04/ sudo apt install software-pro ...