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 ...
随机推荐
- Centos6.8安装mysql 步骤
第1步.查看CentOS下是否已安装mysql 输入命令 :yum list installed | grep mysql 第2步.删除已安装mysql 输入命令:yum -y remove mysq ...
- Linux中级之lvs三个模式的图像补充(nat,dr,tun)
负载均衡(Load Balance)集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. (1)单台计算机无法承受大规 ...
- 在 Ubuntu 上安装 .NET SDK 或 .NET 运行时
在wsl Ubuntu 20.04上面安装dotnet链接 https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu Ubun ...
- SpringMVC学习笔记-REST风格请求实现
RESTful概念及功能 RESTful的概念:RESTful是 一种资源定位及资源操作的风格,其本身既不是标准也不是协议,而是一种设计风格,可以使得软件整体层次更加分明.代码更加简洁,并且有利于实现 ...
- Ubuntu下安装与卸载Nginx
1.Ubuntu下安装Nginx比较简单 敲入下列命令即可: sudo apt-get update sudo apt-get install nginx 2.Ubuntu下卸载,稍不注意就会入坑 s ...
- 一:windows10开启虚拟化服务(也可用于部署docker提前准备)
查看虚拟化已开启: 如果未启用,则需要添加虚拟化功能:控制面板 -> 启用或关闭Windows功能 选择Hyper-V的所有功能,确定: 系统会自动搜索并安装功能.安装完毕即可. 完结,撒花~~
- SpringMVC=>解决JSON乱码问题
<!-- 解决JSON乱码问题 --> <mvc:annotation-driven> <mvc:message-converters register-defaults ...
- 『动善时』JMeter基础 — 37、将JMeter测试结果写入Excel
目录 1.环境准备 (1)引入操作Excel文件的基础JAR包 (2)引入封装自定义操作Excel文件的JAR包 2.准备测试需要的数据 3.测试结果写入Excel演示 (1)测试计划内包含的元件 ( ...
- OneFlow 概念清单
OneFlow 概念清单 本文将对 OneFlow 中涉及到的,常用的一些概念/名词做一个概括性的解释.主要内容针对算法工程师和框架开发者分为以下两部分: 算法开发 框架开发 在算法开发部分,将解释深 ...
- MEMS传感器作为变革的驱动力
MEMS sensors as drivers for change 物联网(IoT)正在改变与周围世界互动的方式.每个人,每件事,都是相互联系的,很快就会相互联系.微机电系统(MEMS)设备和传感器 ...