Java基础--object类详解
原文链接:https://www.cnblogs.com/zhangyinhua/p/7715486.html
阅读目录(Content)
- 一、clone()方法
- 1.1、clone与copy的区别
- 1.2、Shallow Clone与Deep Clone
- 1.3、clone方法的保护机制
- 1.4、clone方法的使用
- 二、toString()方法
- 三、getClass()方法
- 四、finalize()方法
- 五、equals()方法
- 六、hashCode()方法
- 七、wait()方法
- 八、notify()方法
- 九、notifyAll方法
大家都知道Object是所有类的父类,任何类都默认继承Object
理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类。由于所有的类都继承在Object类,因此省略了extends Object关键字。
该类中主要有以下方法: toString(),getClass(),equals(),clone(),finalize(), 其中toString(),getClass(),equals是其中最重要的方法。
注意:
Object类中的getClass(),notify(),notifyAll(),wait()等方法被定义为final类型,因此不能重写。
回到顶部(go to top)
一、clone()方法
保护方法,实现对象的深复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法(实现深复制)。
创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。
1.1、clone与copy的区别
假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000)
通常我们会有这样的赋值Employee cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,
这样cindyelf或者tobby的一个操作都可能影响到对方。打个比方,如果我们通过cindyelf.raiseSalary()方法改变了salary域的值,那么tobby通过
getSalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候
我们就可以使用Clone来满足我们的需求。Employee cindy=tobby.clone(),这时会生成一个新的Employee对象,并且和tobby具有相同的属性值和方法。
1.2、Shallow Clone与Deep Clone
Clone是如何完成的呢?Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。这样,问题就来了咯。
以Employee为例,它里面有一个域hireDay不是基本数据类型的变量,而是一个reference变量,经过Clone之后就会产生一个新的Date型的reference,
它和原始对象中对应的域指向同一个Date对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的,过程下图所示:
这个时候我们就需要进行deep Clone了,对那些非基本型别的域进行特殊的处理,例如本例中的hireDay。我们可以重新定义Clone方法,对hireDay做特殊处理,如下代码所示:
class Employee implements Cloneable { public Object clone() throws CloneNotSupportedException { Employee cloned = (Employee) super.clone(); cloned.hireDay = (Date) hireDay.clone() return cloned; } }
1.3、clone方法的保护机制
在Object中Clone()是被声明为protected的,这样做是有一定的道理的,以Employee。
类为例,通过声明为protected,就可以保证只有Employee类里面才能“克隆”Employee对象
1.4、clone方法的使用
Clone()方法的使用比较简单,注意如下几点即可:
什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable
调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException
更加详细的解释:点击查看
回到顶部(go to top)
二、toString()方法
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
该方法用得比较多,一般子类都有覆盖。
例子:
public class Test1 { public static void main(String[] args){ Object o1 = new Object(); System.out.println(o1.toString()); }
}
结果:java.lang.Object@7852e922
回到顶部(go to top)
三、getClass()方法
返回此Object的运行时类类型。
不可重写,要调用的话,一般和getName()联合使用,如getClass().getName();
回到顶部(go to top)
四、finalize()方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
关于垃圾回收,有三点需要记住:
1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。
2、垃圾回收并不等于“析构”。
3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。
finalize()的用途:
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。
不过这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。
回到顶部(go to top)
五、equals()方法
Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,
所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的hi同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false。
注意:即便是内容完全相等的两块不同的内存对象,也返回false。
如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false
如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equal方法
String类已经重写了object中的equals方法(这样就是比较内容是否相等了)
回到顶部(go to top)
六、hashCode()方法
返回该对象的哈希码值
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
回到顶部(go to top)
七、wait()方法
1)wait()
2)wait(long timeout)
3)wait(long timeout,int naos)
什么意思呢?
方法中的异常:
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,
如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
回到顶部(go to top)
八、notify()方法
该方法唤醒在该对象上等待的某个线程。
回到顶部(go to top)
九、notifyAll方法
该方法唤醒在该对象上等待的所有线程。
Java基础--object类详解相关推荐
- Java基础:volatile详解
Java基础:volatile详解 1.volatile保证可见性 1.1.什么是JMM模型? 1.2.volatile保证可见性的代码验证 1.2.1.无可见性代码验证 1.2.1.volatile ...
- java之Pattern类详解
在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Pattern 声明: ...
- JAVA的StringBuffer类详解
JAVA的StringBuffer类详解 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer ...
- Java的java.lang.String类详解
String类详解 String(字符串常量)概述 在API中是这样描述: String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. ...
- 1.2 Object类详解
Object类概述 Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 Object类中的功能(属性.方法)就 ...
- JAVA基础-Object类(简单说明),String类,.equals()方法
Object类 1.object类是所有Java类的根父类; 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性 ...
- java object 详解_Java基础之Object类详解
类Object是类层次结构的根类.每个类都直接或者间接地继承Object类.所有对象(包括数组)都实现这个类的方法.Object类中的构造方法只有一个,并且是无参构造方法,这说明每个类中默认的无参构造 ...
- java 抽象类,接口,object类详解
抽象类: 如果一个类没有足够的信息去描绘一个具体的对象,那么这个类就可以叫做抽象类. 也可以叫做:可声明抽象方法的类==>抽象类 注意: <1>抽象类不可以实例化对象,所以它只能被继 ...
- Java Object类详解
Object 是 Java 类库中的一个特殊类,也是所有类的父类.也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量.当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 O ...
最新文章
- iclr 2020 | Geom-GCN:几何图神经网络
- python小项目实例流程-公司内项目对接钉钉审批流程(python)
- phpStorm 2016.1 最新版激活方法
- luogu P1231 教辅的组成
- 离群点(oulier)挖掘详解
- 方立勋_30天掌握JavaWeb_JDBC、SQL防注入(一)
- php的pdo如何访问SQLserver_php使用pdo连接sqlserver示例分享
- php自动加载机制的实现
- java人种_实在看不出藏族有大量矮黑血统
- 3.1_ _2_ 内存管理的概念
- scanf和printf在c语言中的作用,C语言中的scanf与printf
- 接收不到其他机器发来的报文_TCP/IP报文格式,康康就知道了
- 监听者模式 java_java监听者模式
- mysql 强项_mysql数据目录迁移
- VC利用GDI+显示透明的PNG图片
- IDC:阿里云安全能力和IaaS市场份额双项领先
- 大数据技术原理与应用学习笔记(九)
- 高频电子线路张肃文第五版详解_高频电子线路第五版张肃文主编学习课件(上).ppt...
- OpenCV 源码中分水岭算法 watershed 函数源码注解
- 固定资产管理系统能帮助企业做哪些工作?
热门文章
- python怎么进入虚拟环境_Python 中如何使用 virtualenv 管理虚拟环境
- 人过青年,我们的黄金时代过去了吗?
- 中文的括号和英文的括号区别_小括号、中括号、大括号,英文怎么说?
- 云之讯短信验证视频php,云之讯短信接口GO实现
- edge浏览器什么相当于ie的中低_Edge和IE的区别,Edge浏览器和IE哪个更好用呢?
- Java教程!Java标识符与关键字的区别是什么?
- oracle日文全角变化,日文windows系统 oracle数据库乱码的处理
- 疫情信息填表-----auto.js 2.0版
- FreeCodeCamp学习--Slasher Flick
- 国内SSD品牌如何异军突起