自学内容网 自学内容网

Java方法重写和多态

前言

多态在程序中是一种偏抽象的概念,在前期我们主要理解为主,在代码量提上去之后,自然而然就融会贯通了。在面向对象编程中。比较对象的相等性是一个常见的需求。Java中有两种方式用于比较对象的相等性,即"=="运算符和equals()方法。本文将介绍它们的使用场景和区别,并深入探讨equals方法的重写以及多态性的应用。

一、== 与 equals

  • == 在值(基本)类型中,是比较值是否相等
  • == 在引用类型中,是比较引用是否相等,也就是说是否指向同一个对象。
  • equals是Object类的方法,所以所有的类都有equals方法。
  • 在引用类型中,equals方法跟==作用相等。
  • String类型比较特殊,String类中重写了equals方法,变成比较字面值是否相等

二、equals重写

如果我们的实际编程中,需要改变equals的判断是否相等的规则,则就需要重写equals方法。
例:如果一个Person类的两个对象 姓名和年龄都相等,就视为相等。

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override//重写equals
    public boolean equals(Object obj){
        if(obj == null){//判断obj是否为空
            return false;
        }
        if(!(obj instanceof Person)){//instanceof判断obj是否是Person的实例
            return false;
        }
        Person eqObj  = (Person)obj;//强制转换
        if(this.name.equals(eqObj.name) && this.age==eqObj.age){
            return true;
        }
        return false;
    }

    public Person() {
    }

    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;
    }
}

public class TestPerson {
    public static void main(String[] args) {
        Person p1 = new Person("张三",20);
        Person p2 = new Person("张三",20);
        System.out.println(p1.equals(p2));
    }
}
  • 两个对象通过equals判断为true,则表示两个对象相等,那么两个对象hashCode()返回的哈希码一定相等。
  • 两个对象的hashCode()返回的哈希码相等,equals不一定返回true。

三、多态

多态:父类的引用指向子类的对象
给它不同的实例,它就会产生不同的行为

好处:代码的维护性和扩展性增强(要符合开闭原则)
多态是运行时发生的行为,编译器找的是父类的同名方法

多态的核心条件是要有重写
父类的方法正常情况来说没有实现的意义,但是要求子类必须实现,所以通常情况下,父类的方法设为抽象方法abstract

例:定义一个Person2类,有三个人种Chinese,American,Japanese,四个类都有一个swim方法,

public class Person2 {
    public void swim(){
        System.out.println("默认游泳");
    }
}
public class American extends Person2{
    public void swim(){
        System.out.println("自由泳");
    }
}
public class Chinese extends Person2{
    public void swim(){
        System.out.println("仰泳");
    }
}
public class Jpanese extends Person2{
    public void swim(){
        System.out.println("蛙泳");
    }
}

这时候我们可以写一个SwimManger类来管理游泳。

public class SwimManager {
    public void start(Person2 p){
        p.swim();
    }
}

测试类SwimTest

public class SwimTest {
    public static void main(String[] args) {
        Chinese c=new Chinese();
        American a=new American();
        Jpanese j=new Jpanese();

        SwimManager m = new SwimManager();
        m.start(c);
        m.start(a);
        m.start(j);
        //父类的引用指向子类的对象
        //给它不同的实例,它就会产生不同的行为
    }
}

上述代码展示了面向对象编程中的多态性的应用,具体来说是通过方法重写(override)实现的。
分析:

  • 对于 Person2 类中的 swim() 方法而言,它是一个默认的游泳方法实现。在子类 American、Chinese 和Japanese 中,它们通过方法重写(override)来重新定义了 swim() 方法的具体实现,覆盖了父类 Person2中的默认实现。
  • 这里的代码复用是指子类继承了父类的 swim()
    方法的声明和基本结构,而不需要重新编写方法的签名和方法体。子类只需要关注实现自己特定的游泳方式,而无需重复编写整个方法的结构。

1.代码复用:通过继承和方法重写,子类可以重用父类的代码逻辑,不需要重复编写相同的方法实现。

2.可扩展性:如果需要新增一种国籍的人,并定义其游泳方式,只需创建一个新的子类并重写 swim() 方法即可,不需要修改现有的代码。

3.灵活性:通过将不同子类对象传递给
SwimManager 的 start() 方法,实现了对不同国籍人的统一管理,根据不同的实例调用相应的方法,实现了多态性。

四、abstract抽象

  1. 包含抽象方法的类一定是抽象类
  2. 抽象类中可以没有抽象方法,只有普通方法。
  3. 抽象类不能被实例化,
  4. 抽象类的作用主要是让子类来重写父类的抽象方法;子类必须要重写父类的所有的抽象方法,否则子类也只能是抽象类

总结

首先介绍了"==“运算符和equals()方法在比较对象相等性时的不同行为。对于基本类型,”==“比较的是值是否相等;而对于引用类型,”==“比较的是引用是否指向同一个对象。equals方法是Object类的方法,因此所有的类都具有equals方法,它在引用类型中的作用与”=="相同。然而,String类型是一个特殊情况,它重写了equals方法,用于比较字面值是否相等。

接下来,讨论了equals方法的重写。当我们需要改变equals方法判断相等的规则时,就需要对equals方法进行重写。通过一个Person类的例子,展示了如何重写equals方法来判断两个对象是否相等。在重写equals方法时,需要考虑空引用判断、类型判断和属性值比较等因素。

随后,介绍了多态性的概念和应用。多态性指的是父类的引用可以指向子类的对象,从而产生不同的行为。通过方法重写和继承,可以实现多态性的应用。以一个SwimManager类和多个子类(Chinese、American、Japanese)为例,展示了如何通过多态性管理不同国籍人的游泳行为。多态性提高了代码的维护性和扩展性,并遵循开闭原则。
最后,简要介绍了抽象类的概念和用途。抽象类包含抽象方法,可以没有抽象方法,但可以有普通方法。抽象类不能被实例化,其主要作用是让子类重写父类的抽象方法。子类必须重写所有的抽象方法,否则子类也必须是抽象类。
通过本文,对于对象相等性的比较、equals方法的重写、多态性的应用以及抽象类的使用有了更加深入的理解。这些概念和技术在面向对象编程中非常重要,对于编写高质量的Java程序


原文地址:https://blog.csdn.net/qq_61102168/article/details/136549189

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!