Object类

一(Object类的概念):

Java提供了一个Object类,它是所有类的父类,每个类都直接或间接继承Object类,因此Object类又称为“超类”。当定义一个类时,如果没有使用extends关键字为这个类显式指定父类,该类则会默认继承Object类。

二(Object类中的常用方法):

boolean eauals ( )判断两个对象是否相等
int hashCode   ( )返回对象的散列码值
String toString ( )返回对象的字符串表示形式

1.toString()方法的底层源码:

  public String toString() {
             return getClass().getName() + "@" + Integer.toHexString(hashCode());
          }

根据上述源码,Object类型中toString返回的是"类名@16进制的hashCode",如果需要在输出对象时,返回的是对象中属性,需要重写toString()。

没重写toString()方法:

package Object类;

import java.util.Objects;

public class Demo1 {
    public static void main(String[] args) {
        User user=new User("李刚",20);
        System.out.println(user.toString());

    }
}
class User{
    String name;
    int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o){
    /*
      什么情况下true
         1.引用相同
         2.属性相同
     */
        if (this == o) {// 1.引用相同
            return true;
        }
        //2.属性相同:需要判断o能不能转成User,如果可以则转为User然后比较内容
        if(o instanceof  User){//判断是否可以转User
            //如果可以则直接转为User
            User u=(User)o;
            //比较属性值
            return  this.name.equals(u.name)&&this.age==u.age;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

 重写tostring()方法后:

   @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

2.hashCode():散列码,是由对象导出的一个整数值,且散列码没有规律。由于hashCode()定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。

package Object类;

public class Demo2 {
    public static void main(String[] args) {

        String s1="abc";
        StringBuffer sb1=new StringBuffer(s1);
        System.out.println("s1的hashCode值:"+s1.hashCode()+",sb1的hashCode值:"+sb1.hashCode());

        String s2=new String("abc");
        StringBuffer sb2=new StringBuffer(s2);
        System.out.println("s2的hashCode值:"+s2.hashCode()+",sb2的hashCode值:"+sb2.hashCode());

        /*
        s1和s2是相同的,因为String类重写hashCode方法,这个hashCode方法中的散列值是根据内容得出的
            所以:内容相同,hashCode值相同

         sb1和sb2的散列码不相同,因为StringBuffer没有重写hashCode方法,
         它的散列码是有Object算出的,默认hashCode方法算出的是对象的地址

         */
    }
}

注意:String类重写了hashCode()方法,StringBuffer类和StringBuilder类都没有重写。所以对于String类来说,hashCode()方法中的散列值是根据内容得出的 只要字符串内容相同,hashCode值相同。 其余类的散列码是由Object类算出的,默认hashCode方法算出的是对象的地址。

3.equals方法:

"==",若判断基本数据类型,比较的是值是否相同;如果比较对象,判断的是引用地址是否相同。
在Object类中,equals方法判断两个对象是否具有相同的引用(比较引用地址), 如果需要实现比较对象中的属性内容,要根据自己要求重写equals方法。

equals方法底层源码:

 public boolean equals(Object obj) {
        return (this == obj);
    }

eg: 

package Object类;

public class Demo3 {
    public static void main(String[] args) {
        User u1=new User("苍老师",19);
        User u2=new User("小泽老师",18);
        System.out.println(u1==u2);//false ;比较是u1和u2地址是否相同

        User u3=new User("波多老师",20);
        User u4=new User("波多老师",20);
        System.out.println(u3==u4);//false;u3和u4地址不同
        System.out.println(u3.equals(u4));//false;因为equals底层源码判断的是对象的引用地址是否相同

    }
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值