前言
在前面我们刚学了继承和接口的内容,通过继承和接口等技术我们可以提取一些子类中共有的一些特性。这节我们基于之前学习到的内容开始进入到多态知识点的学习。
多态是Java面向对象非常重要的特性之一。在好多的教程中关于的多态的概念我觉得都很模糊,不是特别好理解,尤其对于初学者。
今天我们将通过这篇文章,通过一些案例代码帮助大家掌握多态。
正文
概念
多态从字面意思上可以理解成对于同一对象可以有多种形态。转换到Java中的概念就可以理解成声明一个引用类型的变量然后可以绑定多个不同的引用。这句话可能和官方的概念有点区别。这是我理解总结成的一句话。
通过同一引用类型的变量可以去调用到不同对象的属性和方法。
实现
在Java中通过继承和接口实现都可以实现多态的概念。总结如下:
- 继承:子类继承父类后,可以重写父类中的方法,使得子类对象在调用这些方法时表现出不同的行为。
- 接口实现:接口定义了一组方法,但不实现它们。实现接口的类必须实现接口中的所有方法。通过接口,可以实现更广泛的多态性。
- 方法重写:子类可以重写从父类继承的方法,使其具有不同的实现。这是多态性实现的核心。
- 向上转型:将一个子类的对象赋值给其父类类型的变量。这是多态性在Java中使用最常见形式。
示例
我们来写一段多态实现的代码:
先声明一个接口,接口中有一个抽象方法,有两个int型的参数。
public interface NumInterface {
void doecho(int a,int b);
}
创建两个类分别实现这个接口,一个类实现的方法输出a+b,一个输出a*b
public class NumDoOne implements NumInterface{
@Override
public void doecho(int a, int b) {
System.out.println(a+b);
}
}
public class NumDoTwo implements NumInterface{
@Override
public void doecho(int a, int b) {
System.out.println(a*b);
}
}
创建主类,然后在main函数中实现多态应用:
public class NumMain {
public static void main(String[] args) {
NumInterface numDoOne = new NumDoOne();
NumInterface numDoTwo = new NumDoTwo();
numDoOne.doecho(1,2);
numDoTwo.doecho(1,2);
}
}
通过这个列子,我们通过接口实现、方法重写、向上转型的方式应用了多态的概念。
NumInterface numDoOne = new NumDoOne(); 这句代码就是向上转型的应用,通过将子类的实例去绑定父类的引用,然后也可以调用到子类的方法。
多态的优势
- 提高代码的灵活性:多态性允许我们编写更加灵活和通用的代码,因为我们可以使用父类类型的引用变量来操作不同的子类对象。
- 增强代码的可扩展性:当需要添加新的子类时,只需确保它继承自父类或实现相应的接口,并重写必要的方法,就可以在不修改现有代码的情况下扩展功能。
- 降低代码之间的耦合度:多态性允许我们在不同的类之间建立一种松散的耦合关系,提高了代码的模块化和可重用性。
- 简化代码:通过使用多态性,我们可以避免编写大量的条件判断语句来区分不同的对象类型,从而使代码更加简洁和易于维护。