1.public final native Class<?> getClass()

getClass方法,返回该实例的java.lang.Class类,例如

Object obj = new Solution();

System.out.print(obj.getClass());

输出为

class Solution

2.public native int hashCode()

返回一个对象的哈希值。

无论在java程序运行时这个对象被调用多少次,如果该对象中的信息没修改的话,该方法都返回同一个int值。如果调用equal方法两个对象相等,那么调用它们hashcode方法返回的int值也相等。如果调用equal方法两个对象不等,它们的hashcode不一定不等,在它们不等时返回不同的hashcode可以提高hashtable的性能。

3.public boolean equals(Object obj)

表明这个对象是否和其他对象相等。对于非空对象引用有如下性质:

(1). 反身性 x.equals( x )    return true

(2). 对称性 x.equals( y ) 在有且只有y.equals(x) return ture 的情况下 return true

(3).传递性 如果x.equals( y ) return true 并且 y.equls( z ) return true,那么x.equals(z) return true

(4).一致性 只要对象信息没有被修改,无论多少次调用x.equals(y) 结果都是一致的。

当需要重写equals方法时,最好也重写hashcode方法,保证两个对象相等时hashcode返回的int值相等。

4.protected native Object clone()

创建并返回一个该对象的拷贝,对于任意对象:

1. x.clone() != x   return true;

2.x.clone().getClass() == x.getClass()  return true;

3.x.clone().equals(x)  return true ; 但这并不是绝对必须的

4.如果一个类并且所有它的父类都调用super.clone() ,那么有x.clone().getClass() == x.getClass()

5.按照惯例,克隆的对象和被克隆对象应该是独立的,为了实现这种独立性,可能需要修改clone返回对象的一个或多个字段,在克隆任何可变的具有深层结构的对象时,会将引用指向其拷贝。如果类只包含基本类型或者指向不可变对象的引用,那么super.clone()方法返回的对象中的属性不会改变。

6.具体操作是:

(1)如果该类没有实现Cloneable接口,那么抛出CloneNotSupportedException异常。

(2)所有的数组类型实现了Cloneable接口,返回T[]类型。

(3)然而这个方法创建了这个类的实例并使用和它对应属性初始化了该实例对应的所有属性,这些属性自身没有被克隆,所以clone()默认方法是浅拷贝的。

(4)Object本身并没有实现Cloneable接口,调用clone()会抛异常。

5.public String toString()

返回一串代表该类实例的字符串,这个字符串简介并具有带表性,可以让用户很容易理解。

建议所有子类重写该方法。默认输出为getClass().getName()+’@’+Integer.toHexString(hashCode())。

6.public final native void notify()

唤醒单个在监视并等待这个对象的线程。如果一些线程在等待这个对象,则选择其中一个并唤醒它。

在当前线程放弃这个对象的锁之前唤醒的线程不能够运行,唤醒的线程会在其他线程完成对这个对象的同步后完成。

这个方法只能被拥有该对象的监视器的线程调用,一个成为该方法监视器的线程有以下三种方法之一:

(1)通过执行一个该对象的同步实例方法。

(2)通过执行一个使该对象同步的同步体声明。

(3)Class类的对象通过执行作用在该类的静态同步方法。

7.public final native void notifyAll()

唤醒所有等待该对象的监视器,其他与notify相同。

8.public final native void wait(long timeout)

使当前线程处于等待状态直到其他线程调用该对象的notify()或notifyAll()方法,或者一个特定时间到期后。

当前线程一定要拥有该对象的监视器。

这个方法导致这个当前线程(称为T)将自己放入这个对象的等待集合,然后让出部分或所有对这个对象的同步要求。然后T在线程调度用途方面变得没有能力并进入休眠直到以下四个事件中一个发生:

(1)其他线程调用该对象的notify()方法,而线程T恰好被选到称为唤醒的线程。

(2)一些其他的线程调用该对象的notifyAll()方法。

(3)一些其他线程中断线程T( Thread.interrupt() )

(4)指定时间耗尽,如果输入的timeout时间为0,则该超时时间不考虑在内,然后线程会等待直到被唤醒。

然后线程T会从该对象的等待集合中移除,然后让T重新获取线程调度的权利。然后和其他线程通过通常的方法去竞争地获取该对象的同步权利。一旦获取了这个对象的使用权利,它所有的在该对象的同步要求都被恢复到现状。那就是说,在当wait()被调用后,然后线程T从wait()调用中返回,这时候,这个对象的同步状态和线程T的状态就和调用wait()前的状态一样。

线程也可以不被notified方法、中断或者超时唤醒,即所谓的“虚假唤醒”。虚假唤醒实际上并不常见,应用程序必须通过测试线程唤醒条件来避免虚假唤醒,如果条件不满足应该持续等待。换句话说,wait应该总是出现在循环之中,比如:

synchronized(obj) {

while ( condition does not hold  ) {

obj.wait(timeout);

}

}

如果当前线程在等待前或等待时被中断,那么会抛出一个InterruptedException。这个异常直到恢复到以上状态才不会抛出。

wait()会将当前想成加入到这个对象的等待集合中,只会放弃这个对象的锁,此时在这个线程的其他对象可能仍然拥有同步锁。

这个方法只能被拥有这个对象的监视器的线程调用。

9.public final void wait(long timeout,int nanos)

这个方法和上面的一个参数wait很像,但是它允许更精准的时间来等待notify,等待时长为1000000*timeout + nanos 纳秒。

10.public final void wait()

与wait(0)相同。

11.protected void finalize()

垃圾收集器作用于一个对象时,当垃圾收集器确定没有引用指向这个对象。它子类重写的这个方法会处理系统资源或者进行其他清理。

可以在使对象重新被一些线程使用。通常的作用是在回收时手动进行一些清理工作。

Object对象的finalize方法没有任何作用,方法里直接返回。

Java并不保证哪个线程会调用finalize方法,但它保证线程调用finalize方法不会持有任何用户可见的同步锁。如果一个未捕获的异常被finalize抛出,这个异常将会被忽略,终结将会结束。

在finalize方法被调用后,如果当虚拟机确定没有其他线程在能够访问这个对象后,便没有额外的动作执行。

Object 中的默认方法的更多相关文章

  1. Object中的clone方法

      Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象 ...

  2. JDK8.0接口中的默认方法和静态方法

    我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的 ...

  3. Java 8 接口中的默认方法与静态方法

    Java 8 接口中的默认方法与静态方法 1. 接口中的默认方法 允许接口中包含具有具体实现的方法,该方法称"默认方法",默认方法使用用 default 关键字修饰. public ...

  4. Java8接口中的默认方法

    Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8 ...

  5. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  6. 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...

  7. Java8中的默认方法

    作者:汤圆 个人博客:javalover.cc 前言 大家好啊,我是汤圆,今天给大家带来的是<Java8中的默认方法>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻 ...

  8. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  9. Object中的一些方法

    Object.create()参数为一个对象,创建一个对象,其原型为参数,如果为null,则无原型. Object.keys()参数为对象,返回一个数组,为对象中所有可枚举的自有属性 Object.g ...

随机推荐

  1. Java 中布尔(boolean)类型占用多少个字节

    为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就 boolean 类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean ...

  2. Bootstrap Bootstrap3 与 Bootstrap4 的区别

    Bootstrap3 与 Bootstrap4 官网地址 Bootstrap3 官网:https://v3.bootcss.com Bootstrap4 官网:https://v4.bootcss.c ...

  3. 05丨实验:安装MongoDB

    https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 源码安装 export PATH=$PATH:/data/mo ...

  4. window系统安装mysql

    下载地址(其他图形界面) https://dev.mysql.com/downloads/windows/installer/如果下载win7 64位,在下载后出现不兼容,可以在window窗口菜单中 ...

  5. scrapy异常状态码处理

    scrapy异常状态码处理 在setting.py中加入 scrapy  的 state 默认只处理200到300之间 # 403状态的响应不被自动忽略,对403 的响应做个性化处理 HTTPERRO ...

  6. Go基础结构与类型07---简单的数据类型转换

    package main import ( "fmt" "strconv" ) /* 类型转换强化 整型和浮点型可以直接强制转换 字符串和数值的转换用strco ...

  7. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

  8. MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral)

    MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral) Tracking by Instance Detection: A Meta-Learning Approach 论文链接:h ...

  9. 自主数据类型:在TVM中启用自定义数据类型探索

    自主数据类型:在TVM中启用自定义数据类型探索 介绍 在设计加速器时,一个重要的决定是如何在硬件中近似地表示实数.这个问题有一个长期的行业标准解决方案:IEEE 754浮点标准.1.然而,当试图通过构 ...

  10. 孟老板 BaseAdapter封装 (二) Healer,footer

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...