黑马程序员-Object类深入讲解

------- android培训java培训、期待与您交流! ----------

Object类:所有类的父类,即上帝般的存在。这个类就是由所有的类进行抽取,得出的最顶层的类。

所以里面的方法是所有类都具备的



这是object中的所有方法,都是抽取出来的。现在一个一个介绍

protected Object clone()

克隆方法:从返回值就可以看出该方法是返回一个对象的。

protected 修饰符,受保护的

这样我们的四种修饰符就总结出来了

public 表明公共的,权限最大

private 表示私有的,除了类自己之外,都不可以访问,即使是子女,朋友都不可以

protected 对于子女朋友是public 可以自由使用,没限制1.而对外部的就是private


public 在当前类(自己),同一个package(兄弟),子类(儿女),其他包的类(陌生人)都是可以访问的

protected  可以让自己,兄弟,儿女访问他

默认   可以让自己和兄弟访问

private 只能让自己访问


第二个方法equals

比较的是对象与对象之间是否相等,Object中的equals是毫无疑问的特例,用来比较对象的地址而非内容,即和"=="是相同的解释

其他的类也有很多复写过equals,比如String就复写过,其他的equals全部都是比较的是内容,所以Object类中的equals是个特例


其中对象比较时,也有两个特例:一个是Integer(享元) 一个是String

这两个类的equals进行对象创建时,都有其特殊的创建方式

Integer:当一个新的对象要创建时,会首先判断该值是否为127以外并且在对象中已经存在该值,如果为127以外,则进行创建。

如果小于127并且值相同,则不会创建新对象,而是引用指向已有对象,这时,使用equals比较时就会显示为true

String:同理,会先去判断是否存在相同的字符串,如果存在,则进行引用,而不去创建新对象。

关于String还有一点要说,那就是 String s = "abc";   String s1 = new String"abc";  这两个是不同的,为何?因为第一个仅仅是在字符串常量池开辟了abc空间,而第二种在堆中也new了一个空间,所以s是一个对象,而s1是两个对象,相比时会返回false


equals和==的区别

equals一般用于比较引用数据类型,也可以比较基本数据类型,不过基本数据类型要先封装成对象。除了Object中的equals其他的equals都比较的是内容

==  如果比较的是对象,会比较地址。这与它的比较原理有关,==只比较栈中的数据,所以只会比较对象在栈中创建的变量指向的地址值。

而equals比较的是堆中的内容。所以可以比较对象的内容

并且equals作为一个方法,是可以被复写的。

也经常被复写,因为对象默认的equals(类中没有复写equals方法)方法本身比较的是对象,并非我们开发时想要的。就可以进行复写。

这样以来 Object的优点之一也体现出来了,降低了耦合性。


使用equals的心得

首先观察equals所属的对象的类是否有复写过equals,如果没有,则要按自己的想法去复写他

如果仅仅比的是两个基本类型的值的大小,那么请用"=="

如果比较的是对象中的内容的大小,就要用equals了,当然一样要进行判断是否复写过,不符合自己心意就再次进行复写。


第三个方法getClass

Class<?> getClass

获取class字节码文件

当已知对象时,即可获取此字节码文件的对象。再次体现了万物皆对象的说法。字节码文件也可以封装成对象。

这个类留在反射中讲更好一些,因为经常会被反射所用到。还有一个地方,即同步。静态同步代码块使用的锁就是class文件。


第四个方法hashCode

返回的是整形的哈希值

这个类经常在集合中见到。我们前面也见过这个返回的哈希值。数组中,如果没有指定元素角标直接打印数组本身引用的话,返回的就是在栈中所指向的地址

这个地址@符号的后面一连串看不懂的数字就是哈希值!

这个值是独一无二的,使用哈希表的集合都会用它的唯一性来判断是否是同一个元素。

这个也留到集合中重点介绍。


把线程的方法全部留给线程时候讲,这里还有最后一个重要的方法

第五个方法:toString

这个方法返回的是一个字符串,返回的字符串是什么呢?

下面就是返回的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())
首先这里用到了对象的一个方法,getClass获取到了Class对象,然后调用了Class对象的方法getName 获取字节码文件名
然后打印一个@,后面的hashCode即上面描述的获取哈希值,然后将这个哈希值转换成十六进制的字符串形式。前面进制转换讲过这个方法。
这就是完整的toString打印的字符串的真面目
 
当然,这个方法返回的字符串不是我们想返回的怎么办?复写!
 
Object类中的方法使用时,需要注意几点
一定要在本来的对象所属的类上查看是否有复写过Object中的方法。
如果没有想要的结果,则进行复写。
 
剩下的方法将在下面一一讲解。
线程,集合



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值