Object:所有类的根类
Object是不断抽取而来,具备所有对象都具备的共性内容
常用的共性内容:
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方法(这样就是比较内容是否相等了)
下面这段代码是调用equals比较两个对象
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
/* public boolean equals(Object obj){
Person2 p=(Person2)obj;
return this.age==p.age;
}*/
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
System.out.println(p1==p2);
System.out.println(p1.equals(p2));
}
}
/*结果:
false
false
*/
当只比较对象内容时,一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否相同的依据,当此方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须有相同的哈希码
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
public boolean equals(Object obj){
if(!(obj instanceof Person2)){ //判断对象类型是否相同
throw new ClassCastException("类型错误");
}
Person2 p=(Person2)obj; //向下转型,实现特有方法
return this.age==p.age;
}
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
System.out.println(p1==p2);
System.out.println(p1.equals(p2));
}
}
/*结果:
false
true
*/
hashCode
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
}
}
/*结果:
1163157884
1956725890
*/
重写hashCode方法
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
public int hashCode(){
return age;
}
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
}
}
/*结果:
20
20
*/
getClass
返回Object的运行时类
当class文件装载进内存时,堆内存就会产生字节码文件对象,之后创建的new对象都是由字节码文件对象产生的,getClass返回的就是所属的字节码文件对象
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
Class calss1=p1.getClass();
Class calss2=p2.getClass();
System.out.println(calss1==calss2);
System.out.println(calss1.getName());
}
}
/*结果:
true
com.monfolld.Person2
*/
toString
返回对象的字符串表示形式。 一般来说, toString
方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。
该toString
类方法Object
返回一个由其中的对象是一个实例,该符号字符`的类的名称的字符串@
”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
System.out.println(p1);
System.out.println(p1.getClass().getName()+"$"+Integer.toHexString(p1.hashCode()));
}
}
/*结果:
com.monfolld.Person2@4554617c
com.monfolld.Person2$4554617c
/
重写特有方法
package com.monfolld;
class Person2{
private int age;
Person2(int age){
this.age=age;
}
public String toSring(){
return "Person2:"+age;
}
}
public class ObjectDemo {
public static void main(String[] args){
Person2 p1=new Person2(20);
Person2 p2=new Person2(20);
System.out.println(p1.toSring());
System.out.println(p1.getClass().getName()+"$"+Integer.toHexString(p1.hashCode()));
}
}
/*结果:
Person2:20
com.monfolld.Person2$4554617c
/