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. 【luoguP4720】【模板】扩展卢卡斯

    快速阶乘与(扩展)卢卡斯定理 \(p\)为质数时 考虑 \(n!~mod~p\) 的性质 当\(n>>p\)时,不妨将\(n!\)中的因子\(p\)提出来 \(n!\) 可以写成 \(a* ...

  2. Vue绑定事件,双向数据绑定,只是循环没那么简单

    v-on对象处理 <p @mouseover = "doTish" @mouseout = "doThat"> 对象形式 </p> &l ...

  3. linux 所有命令无法使用

    配置nginx时,错误export之后linux 所有命令无法使用 出现这个问题是因为系统的环境变量没有正确配置造成的,造成这个原因有很多,比如系统升级,比如不正当操作等导致环境变量被覆盖修改,解决的 ...

  4. selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫

    #为了实时获取车辆信息,以及为了后面进行行使轨迹绘图,写了一个基于selelnium的爬虫爬取了车辆gps数据. #在这里发现selenium可以很好的实现网页解析和处理js处理 #导包 import ...

  5. 【cf比赛记录】Codeforces Round #600 (Div. 2)

    Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...

  6. spring的重试策略、发生异常会自动重新调用

    测试类以及测试代码.复制即可 package com.cms.util; import javax.swing.plaf.synth.SynthSpinnerUI; import org.spring ...

  7. 享元模式(Flyweight Pattern)

    定义: 采用一个共享来避免大量拥有相同内容对象的开销.这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效的支持大量的细粒度对象. 享元的英文是flyweight,是一个来自体育方面的专业 ...

  8. 如何将 普通代码变成 java lamband表达式

    public static void main(String[] args) { Map<String, String> map = new HashMap<>(); List ...

  9. MORMOT REST文件上传

    MORMOT REST文件上传 上传数据格式必须是:MULTIPART/FORM-DATA uses SynCommons 后端处理参照下列代码: 后端处理参照下列代码: procedure TWeb ...

  10. Ubuntu 17.10安装VirtualBox 5.2.2 及相关问题解决

    link:https://www.linuxidc.com/Linux/2017-11/148870.htm sudo apt update && sudo apt upgrade s ...