Java基础教程(19)--Object类

        Object类位于类结构树的最顶端,所有的类都是它的直接或间接子类,因此所有的类都继承了Object类的方法,我们可以在需要的时候覆盖这些方法。下面是一些将会在本文中讨论的Object类的方法:

protected Object clone() throws CloneNotSupportedException

创建并返回此对象的副本。

public boolean equals(Object obj)

判断某个对象是否与这个对象“相等”。

protected void finalize() throws Throwable

当垃圾回收器将对象从内存中清理出去之前要做的清理工作。

public final Class getClass()

返回对象所属的类类型。

public int hashCode()

返回对象的hash值。

public String toString()

返回对象的字符串表示形式。

  下面的notify,notifyAll和wait方法在同步独立运行的线程的活动中扮演着不同的角色,本文不会去介绍它们,有关这一部分的内容将会在以后的文章中讨论:

public final void notify()

public final void notifyAll()

public final void wait()

public final void wait(long timeout)

public final void wait(long timeout, int nanos)

一.equals方法

Object了类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将会判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合乎情理的。然而,对于大多数类来说,这种判断并没有什么意义。我们在判断两个对象是否相等时,应该比较它们的内容,而不仅仅是判断它们是不是同一个对象。因此,大多数情况下,当我们需要使用equals方法时,都应该对它进行重写。

为了演示,我们首先编写一个Apple类:

publicclassApple{privateString color;privateintweight;publicvoidsetColor(String color){this.color = color;    }publicStringgetColor(){returncolor;    }publicvoidsetWeight(intweight){this.weight = weight;    }publicintgetWeight(){returnweight;    }}

  当两个苹果的重量和颜色一样时,我们就认为它们是相等的。因此,Apple类的equals方法可以这么写:

publicbooleanequals(Object obj){if(obj ==null) {returnfalse;    }if(this== obj) {returntrue;    }if(this.getClass() != obj.getClass()) {returnfalse;    }    Apple apple = (Apple) obj;returnweight == apple.getWeight() && Objects.equals(color, apple.getColor());}

为了防备color为null的情况,上面的例子中使用了Objects.equals(Object a,Object b)方法。如果a和b都是null,这个方法将会返回true;如果其中只有一个参数为null,则返回false;如果a和b都不为null,则会返回a.equals(b)的结果。

实际上,上面的equals还存在一定的问题。不过本文属于基础教程系列,因此不会深入讲解这其中的问题。有兴趣的读者可以查阅Java规范中对于equals方法的要求以及参考其他深入讨论equals方法的文章。

二.hashCode方法

  hashCode方法的返回值是根据对象本身所计算出来的散列值(也称哈希值)。如果两个对象是相等的,那么对它们调用hashCode方法得到的返回值也应该是相等的。如果重写了equals方法,那么默认的hashCode方法也不再适用。因此,如果重写了equals方法,则必须同时重写hashCode方法。在重写hashCode方法时,原则上只需要保证两个相等的对象的散列值是相同的即可。不过如何减少冲突以及编写更高效的哈希函数,可以参考其他文章或查阅计算机算法书中关于哈希的内容。下面编写了一个Apple类的hashCode方法作为示例:

publicinthashCode(){return7* (color ==null?0: color.hashCode()) +11* weight;}

三.clone方法

  如果一个类或它的某个超类实现了Cloneable接口,那么就可以使用clone()方法从这个类的实例上创建一个副本。在调用clone()方法时,编译器会检查这个类是否实现了Cloneable接口。如果没有,编译器将会抛出一个CloneNotSupportedException异常。有关异常的内容会在后面的文章中介绍,现在你只需要知道要覆盖clone()方法,必须将它声明为:

protectedObjectclone()throwsCloneNotSupportedException

publicObjectclone()throwsCloneNotSupportedException

如果调用clone方法的对象实现了Cloneable接口,则继承自Object类的clone()方法将会创建与原始对象相等的对象,使其具有与原始对象的相应成员变量相同的值。因此,如果想要让类可以clone,只需要将implements Cloneable添加到类的声明中即可。

对于某些类,Objects类的clone方法可以正常工作。但是,如果对象包含对外部对象的引用,则可能需要覆盖clone方法。否则,即使克隆的对象与元对象不是一个对象,但它们内部引用的还是相同的对象。这样一来,对内部对象所做的更改也会影响到另一个对象。如果需要克隆出一个完全与原对象隔离的新对象,则需要重写clone方法,将每个内部对象再拷贝一次。

四.finalize方法

  finalize方法用于定义在回收对象前要执行的清理工作。Object类的finalize方法什么也没做,只有一个空方法体,可以覆盖finalize方法来定义清理行为,例如释放资源等。finalize方法不需要也不建议手动调用,它会在垃圾回收器回收对象时自动调用。

五.toString方法

toString方法用于返回表示对象值的字符串。为每个类提供toString方法是一个良好的习惯。

下面是Object类的toString方法:

publicStringtoString(){returngetClass().getName() +"@"+ Integer.toHexString(hashCode());}

  可以看到,Object类的toString方法返回的是类名加对象的hashCode的十六进制表示,中间使用符号@隔开。不过在打印对象的信息时,这个方法的返回值并没有什么意义。因此,建议在编写的每一个类中都覆盖toString方法。例如为上面的Apple类编写toString方法:

publicStringtoString(){returngetClass().getName() +"[color = "+ color +",weight = "+ weight +"]";}

六.getClass方法

Class类是一个表示类的信息的类。对对象调用getClass方法会返回一个Class类的实例,用来表示当前对象所属对象的信息。由于getClass方法是final的,因此无法对它进行重写。

Class类提供了非常多的方法,例如获取类名的方法getSimpleName(),获取父类的方法geuSuperClass(),获取实现的接口的方法getInterfaces()等。例如,下面的方法会打印出对象的类名:

voidprintClassName(Object obj){    System.out.println("The object's"+" class is "+ obj.getClass().getSimpleName());}

  有关Class的内容会在后面有关反射的文章中进行介绍,这里只需要知道getClass方法的作用即可。



出处:https://www.cnblogs.com/maconn/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容