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中的方法。
如果没有想要的结果,则进行复写。
剩下的方法将在下面一一讲解。
线程,集合