⑴ 什么是多态性,使用多态有什么好处
什么是多态?
可以这么回答:
父类引用
引用子类对象
父类和子类有同名的覆盖方法
通过父类引用调用这个重写的方法的时候。多数的话就可以称为多态,单数可以说运行时绑定。
使用多态有什么好处?
类调用者对类的使用成本进一步降低
封装是让类的调用者不需要知道类的实现细节,多态能让类的调用者连这个类的类型是什么都不必知道,只需要知道这个对象具有某个方法即可。因此,多态可以理解成是封装的更进一步,让类调用者对类的使用成本进一步降低。
能够降低代码的“圈复杂度”,避免使用大量的if-else
多态在代码中的体现:
输出结果:
猫吃鱼
猫吃鱼(因为描述的是真正的是一只猫)
拓展:
多态性:同一操作作用于不同的对象,可以用不同的解释,产生不同的执行结果,这就是多态性。
多态性通过派生类覆写基类中的虚函数的方法来实现。
多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。
编译时的多态性:编译时多态是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数,返回的类型等信息决定实现何种操作。
运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。
⑵ java为什么要用多态,什么是多态
多态性在Java编程中是一种核心概念,它允许使用同一类名的变量引用多种不同类型的对象,从而实现代码的复用和灵活性。多态性主要分为两种类型:重载和重写。
重载式多态,也称为编译时多态,指的是在同一类中方法的重载。通过不同的参数列表来区分不同的方法,编译器在编译时就能确定调用哪个方法。例如,一个类可以有多个同名的方法,但参数不同,编译器会根据传入的参数类型和数量自动选择相应的方法调用。
重写式多态,也称为运行时多态或动态多态,指的是子类继承父类后,重写父类中的方法。在运行时,父类引用指向子类对象时,会根据实际的对象类型动态调用相应的方法。这种多态性是通过动态绑定(dynamic binding)实现的,即在执行期间根据实际对象类型调用方法,确保调用的是子类的特定实现。
实现多态性需要满足三个条件:继承、接口和方法重写。当父类引用指向子类对象时,通过向上转型(upcasting)可以访问到子类继承自父类的方法。然而,向上转型丢失了子类特有的方法,因此,若想调用子类独有的方法,需要进行向下转型(downcasting)。
以下是一个简单的示例,展示了多态性在Java中的应用。通过代码,我们可以看到不同对象调用相同方法时的动态行为:
在示例中,我们创建了一个`Animal`类和两个子类`Cat`和`Dog`。当使用父类引用调用`eat()`方法时,会根据实际对象类型调用相应的子类实现。向上转型允许使用父类引用访问子类对象,但会丢失子类特有的方法。向下转型则可以通过强转`cast`恢复子类特有的方法。最后,我们通过一个面试题进一步加深对多态性的理解,展示了向上转型和向下转型的用法以及它们各自的限制。
总的来说,多态性是Java中一种强大的特性,它允许我们编写更加灵活、易于维护和扩展的代码。通过合理利用多态,我们可以避免硬编码特定对象类型,提高代码的复用性和适应性。