Object 中的默认方法
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 中的默认方法的更多相关文章
- Object中的clone方法
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象 ...
- JDK8.0接口中的默认方法和静态方法
我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的 ...
- Java 8 接口中的默认方法与静态方法
Java 8 接口中的默认方法与静态方法 1. 接口中的默认方法 允许接口中包含具有具体实现的方法,该方法称"默认方法",默认方法使用用 default 关键字修饰. public ...
- Java8接口中的默认方法
Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8 ...
- Java8新特性Optional、接口中的默认方法与静态方法
Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...
- 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?
写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...
- Java8中的默认方法
作者:汤圆 个人博客:javalover.cc 前言 大家好啊,我是汤圆,今天给大家带来的是<Java8中的默认方法>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻 ...
- Java8新特性_接口中的默认方法
默认方法由来猜想 1. Collection接口.Collections公共类. 同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...
- Object中的一些方法
Object.create()参数为一个对象,创建一个对象,其原型为参数,如果为null,则无原型. Object.keys()参数为对象,返回一个数组,为对象中所有可枚举的自有属性 Object.g ...
随机推荐
- TCP三次握手和四次挥手及对应端口状态
一.三次握手 1.第一次握手:Client 将标志位置为1,并向Server发送个seq=j,j为随机产生的数:等待Server回复,此时Client的端口状态为SYN_SENT. 2.第二次握手:S ...
- CyclicBarrier分析
简介 CyclicBarrier 是什么? CyclicBarrier 使用 CyclicBarrier 源码解析 CyclicBarrier 简单实现 barrierAction 是由哪个线程执行的 ...
- Windows 10, version 21H1 ARM64
请访问原文链接:https://sysin.org/article/windows-10-arm/,查看最新版.原创作品,转载请保留出处. Windows 10, version 21H1 (rele ...
- 如何彻底禁止 macOS Big Sur 自动更新,去除更新标记和通知
作者:gc(at)sysin.org,主页:www.sysin.org 请访问原文链接:https://sysin.org/article/Disable-macOS-Update/,查看最新版.原创 ...
- 处理SpringMVC中遇到的乱码问题
乱码在日常开发写代码中是非常常见的,以前乱码使用的是通过设置一个过滤器解决, 现在可以使用SpringMVC给提供的过滤器,在web.xml设置,这比我们自己写的过滤器强大的的多. 注意:每次修改了x ...
- Processing平台之PVector求角度
问题:在processing 平台,通过给定三个PVector向量,如何求他们之间的夹角,同时确定是在左侧还是右侧? 如图所示,在processing 平台中,PVector表示点的坐标是以原点为起点 ...
- 多视觉任务的全能: HRNet
多视觉任务的全能: HRNet HRNet是微软亚洲研究院的王井东老师领导的团队完成的,打通图像分类.图像分割.目标检测.人脸对齐.姿态识别.风格迁移.Image Inpainting.超分.opti ...
- Python脚本语言写法
Python脚本语言写法 脚本语言的开始行,是指文件中的代码用什么可执行程序去运行它,就这么简单. #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的pyth ...
- redis 记一次搭建高可用redis集群过程,问题解决;Node 192.168.184.133:8001 is not configured as a cluster node
------------恢复内容开始------------ 步骤 1:每台redis服务器启动之后,需要将这几台redis关联起来, 2: 关联命令启动之后 报错: Node 192.168.184 ...
- 性能监控工具之Grafana+Prometheus+Exporters
在本模块中,我将把几个常用的监控部分给梳理一下.前面我们提到过,在性能监控图谱中,有操作系统.应用服务器.中间件.队列.缓存.数据库.网络.前端.负载均衡.Web 服务器.存储.代码等很多需要监控的点 ...