重写equals方法

前言:

重写equals方法能够学习到多态、instanceof

代码实现:

1、仿照String类equals方法:

public class Super{
    static class MyString{
        private final char value[];
        MyString(char[] value){
            this.value = value;
        }
        @Override
        public boolean equals(Object obj) {
            if(obj == this){
                return true;
            }
            if(obj == null){
                return false;
            }
            if(obj instanceof MyString){
                MyString anotherString = (MyString)obj;
                int n = value.length;
                if(n == anotherString.value.length){
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while(n-- != 0){
                        if(v1[i] != v2[i]){
                            return false;
                        }
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    }
    public static void main(String[] args) {
        char[] c1 = new char[]{'s','c','d'};
        char[] c2 = new char[]{'s','c','d'};
        Super.MyString s1 = new Super.MyString(c1);
        Super.MyString s2 = new Super.MyString(c2);
        System.out.println(s1.equals(s2));
    }
}

2、通用型equals方法:

public class Super{
    public static void main(String[] args) {
        Super.User1 user1 = new Super.User1();
        Super.User2 user2 = new Super.User2();
        System.out.println(user2.equals(user1));
    }
    interface IUser{
        int number = 0;
        String name = "里斯";
        public void doing();
        public void toDo();
    }
    static class User1 extends User2{
        private int studentId = 1342432423;
        private String studentClass = "二班";

        public int getStudentId() {
            return studentId;
        }

        public void setStudentId(int studentId) {
            this.studentId = studentId;
        }

        public String getStudentClass() {
            return studentClass;
        }

        public void setStudentClass(String studentClass) {
            this.studentClass = studentClass;
        }

        public void doing(){
            System.out.println("User1类正在做");
        }
        public void toDo(){
            System.out.println("User1类已经做过");
        }
    }

    static class User2 implements IUser{
        private int studentId = 1342432423;
        private String studentClass = "二班";

        public int getStudentId() {
            return studentId;
        }

        public void setStudentId(int studentId) {
            this.studentId = studentId;
        }

        public String getStudentClass() {
            return studentClass;
        }

        public void setStudentClass(String studentClass) {
            this.studentClass = studentClass;
        }

        public void doing(){
            System.out.println("User2类正在做");
        }
        public void toDo(){
            System.out.println("User2类已经做过");
        }
        //使用Object的原因是它是所有类的父类,于是有了Obejct obj = new User1();把User1类向上转型为obj对象
        public  boolean equals(Object obj){
            //如果比较的是自己本身
            if(obj == this){
                return true;
            }
            //考虑到程序的健壮性,在方法的形参是引用类型的时候,建议做非null处理
            if(obj == null){
                return false;
            }
            // 两个对象的类型都不一致,对象肯定不一致
            if (getClass() != obj.getClass())
                return false;

            // 检查obj是否是User2的实例。
            // 无论对象是否经过向上转型或向下转型,instanceof检查都是有效的。
            if(obj instanceof User2){
                // 将obj向下转型为User2。注意,只有当对象原本就是这个子类(User2)或其子类的实例时,向下转型才是有效的。
                User2 user = (User2) obj;
                // 添加我们想要检查的条件。
                // 在这个情况下,我们想检查'this'对象和'user'对象的'studentClass'和'studentId'是否相同。
                if(this.getStudentClass().equals(user.getStudentClass()) && this.getStudentId() == user.getStudentId()){
                    // 如果'studentClass'和'studentId'都相等,那么返回true。
                    return true;
                }
            }
            return false;
        }

    }

}

总结:

instanceof左边必须是右边的类或者是子类的实现对象
向上转型和向下转型实际上都是指向```子类对象````(子类对象的引用)。

posted @ 2023-11-14 19:31  news_one  阅读(44)  评论(0编辑  收藏  举报