【JavaSE篇】—— Object类

目录

🎈Object类

🚩获取对象信息  

🚩对象比较equals方法

🚩hashcode方法

🎈Object类

Object Java 默认提供的一个类。 Java 里面除了 Object 类,所有的类都是存在继承关系的。默认会继承 Object 父类。即所有类的对象都可以使用Object 的引用进行接收。
我们自己写的所有类的父类都是Object类,即使我们没有写上externed Object,都会默认继承Object类。
class A{
}
class B{
}
public class Test1 {
    public static void func(Object obj){
//向上调整 子类的A到父类的Object
    }
    public static void main(String[] args) {
        func(new A());
        func(new B());
    }
}
范例:使用 Object 接收所有类的对象

所以在开发之中,Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法。如下:

对于整个 Object 类中的方法需要实现全部掌握。

本小节当中,我们主要来熟悉这几个方法: toString() 方法, equals() 方法, hashcode() 方法

🚩获取对象信息  

如果要打印对象中的内容,可以直接重写Object类中的toString()方法,之前已经讲过了,此处不再累赘。

// Object类中的toString()方法实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

如果我们打印Student的属性值,我们需要自定义toString方法

class Student{
    int age;
    String name;

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

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


🚩对象比较equals方法

❗Student类

class Student{
    int age;
    String name;

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

❗运行区

public class Test1 {
    public static void func(Object obj){
    }
    public static void main(String[] args) {
       Student student1=new Student(10,"chen");
       Student student2=new Student(10,"chen");
        System.out.println(student1.equals(student2));
    }
}

我们看到即使是相同的姓名和相同的年龄最终运行的结果是false错误,这是为什么呢?

我们按照程序来调试一遍

我们看到底层的equal的方法是按照俩者的地址来判断的。如果我们不根据地址判断,我们需要用判断年龄相等并且姓名相等,我们就认为这俩个学生相等。需要我们自己自定义一个equal方法。

    @Override
    public boolean equals(Object obj) {
       if(obj ==null){
           return false;
       }
       if(this==obj){
           return true;
       }
       //不是Student类
        if(!(obj instanceof Student)){
            return false;
        }

        Student student=(Student) obj;
        if(this.name.equals(student.name) && this.age==((Student) obj).age){
            return true;
        }else {
            return false;
        }
    }

 我们肯定疑惑为什么name属性直接使用equal方法,因为String字符串类型底层写了自己的equal,所以我们直接判断即可,至于age直接判断。

以后我们写自定义类型(比如Student类型),那么要注意重写equal方法。

结论:比较对象中内容是否相同的时候,一定要重写equals方法。


🚩hashcode方法

我们看到了 hashCode() 这个方法,他帮我算了一个具体的 对象位置 ,这里面涉及数据结构,但是我们还没学数据结构,没法讲述,所以我们只能说它是个内存地址。然后调Integer.toHexString() 方法,将这个地址以 16 进制输出。
hashcode 方法源码:
public native int hashCode ();
该方法是一个 native 方法,底层是由 C/C++ 代码写的。我们看不到。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写 hashcode() 方法,我们可以来看示例代码:
class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class TestDemo4 {
public static void main(String[] args) {
Person per1 = new Person("chenle", 20) ;
Person per2 = new Person("chenle", 20) ;
System.out.println(per1.hashCode());
System.out.println(per2.hashCode());
}
}
//执行结果
460141958
1163157884
注意事项:两个对象的 hash 值不一样。
像重写 equals 方法一样,我们也可以重写 hashcode() 方法。此时我们再来看看
class Person{
    int age;
    String name;

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

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

注意事项:哈希值一样。
结论:
1 hashcode 方法用来确定对象在内存中存储的位置是否相同
2 、事实上 hashCode() 在散列表中才有用,在其它情况下没用。在散列表中 hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

我们一直next即可创建默认的方法,可以去掉默认的,自己重写。

事情总是一件一件一件的完成的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值