原文链接: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类详解相关推荐

  1. Java基础:volatile详解

    Java基础:volatile详解 1.volatile保证可见性 1.1.什么是JMM模型? 1.2.volatile保证可见性的代码验证 1.2.1.无可见性代码验证 1.2.1.volatile ...

  2. java之Pattern类详解

    在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Pattern  声明: ...

  3. JAVA的StringBuffer类详解

    JAVA的StringBuffer类详解 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer ...

  4. Java的java.lang.String类详解

    String类详解 String(字符串常量)概述 在API中是这样描述: String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. ...

  5. 1.2 Object类详解

    Object类概述 Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 Object类中的功能(属性.方法)就 ...

  6. JAVA基础-Object类(简单说明),String类,.equals()方法

    Object类 1.object类是所有Java类的根父类; 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性 ...

  7. java object 详解_Java基础之Object类详解

    类Object是类层次结构的根类.每个类都直接或者间接地继承Object类.所有对象(包括数组)都实现这个类的方法.Object类中的构造方法只有一个,并且是无参构造方法,这说明每个类中默认的无参构造 ...

  8. java 抽象类,接口,object类详解

    抽象类: 如果一个类没有足够的信息去描绘一个具体的对象,那么这个类就可以叫做抽象类. 也可以叫做:可声明抽象方法的类==>抽象类 注意: <1>抽象类不可以实例化对象,所以它只能被继 ...

  9. Java Object类详解

    Object 是 Java 类库中的一个特殊类,也是所有类的父类.也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量.当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 O ...

最新文章

  1. iclr 2020 | Geom-GCN:几何图神经网络
  2. python小项目实例流程-公司内项目对接钉钉审批流程(python)
  3. phpStorm 2016.1 最新版激活方法
  4. luogu P1231 教辅的组成
  5. 离群点(oulier)挖掘详解
  6. 方立勋_30天掌握JavaWeb_JDBC、SQL防注入(一)
  7. php的pdo如何访问SQLserver_php使用pdo连接sqlserver示例分享
  8. php自动加载机制的实现
  9. java人种_实在看不出藏族有大量矮黑血统
  10. 3.1_ _2_ 内存管理的概念
  11. scanf和printf在c语言中的作用,C语言中的scanf与printf
  12. 接收不到其他机器发来的报文_TCP/IP报文格式,康康就知道了
  13. 监听者模式 java_java监听者模式
  14. mysql 强项_mysql数据目录迁移
  15. VC利用GDI+显示透明的PNG图片
  16. IDC:阿里云安全能力和IaaS市场份额双项领先
  17. 大数据技术原理与应用学习笔记(九)
  18. 高频电子线路张肃文第五版详解_高频电子线路第五版张肃文主编学习课件(上).ppt...
  19. OpenCV 源码中分水岭算法 watershed 函数源码注解
  20. 固定资产管理系统能帮助企业做哪些工作?

热门文章

  1. python怎么进入虚拟环境_Python 中如何使用 virtualenv 管理虚拟环境
  2. 人过青年,我们的黄金时代过去了吗?
  3. 中文的括号和英文的括号区别_小括号、中括号、大括号,英文怎么说?
  4. 云之讯短信验证视频php,云之讯短信接口GO实现
  5. edge浏览器什么相当于ie的中低_Edge和IE的区别,Edge浏览器和IE哪个更好用呢?
  6. Java教程!Java标识符与关键字的区别是什么?
  7. oracle日文全角变化,日文windows系统 oracle数据库乱码的处理
  8. 疫情信息填表-----auto.js 2.0版
  9. FreeCodeCamp学习--Slasher Flick
  10. 国内SSD品牌如何异军突起