Object类

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
/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值