浅谈java多态
在最初学习java的时候,人们都知道,java这种面向对象的语言,一共有四大特征,分别是:封装、继承、抽象、多态。
这些词经常被人们提及,那么,到底什么是多态呢?
一:多态是什么
在java里,多态是同一个行为具有不同表现形式或形态的能力,即对象多种表现形式的体现,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
如上图所示:使用手机扫描二维码支付时,二维码并不知道客户是通过何种方式进行支付,只有通过二维码后才能判断是走哪种支付方式执行对应流程。
二:多态的好处
使用多态,我们可以很好的完成代码的解耦和工作,加强代码的可扩展性,是代码更加灵活,在不改变原有接口方法的情况下简化流程等,总结一下就是:
1、减耦合
2、增强可以替换性
3、可扩展性
4、灵活性等...
使用多态必须满足三个必要条件。
1、继承
2、重写
3、父类引用指向子类
在编写代码期间使用多态调用方法时,IDE首先会检查父类中是否有该方法,如果没有,则会编译报错。如果有父类中调用子类的同名方法。
三:编写一个简单的多态案例
/**
* 支付抽象类或者接口
*/
public abstract class Pay {
abstract public String pay();
}
/**
* 支付宝支付
*/
public class AliPay extends Pay {
@Override
public String pay() {
System.out.println("支付宝pay");
return "success";
}
}
/**
* 微信支付
*/
public class WeixinPay extends Pay {
@Override
public String pay() {
System.out.println("微信Pay");
return "success";
}
}
/**
* 银联支付
*/
public class YinlianPay extends Pay {
@Override
public String pay() {
System.out.println("银联支付");
return "success";
}
}
测试支付
public static void main(String[] args) {
/**
* 测试支付宝支付多态应用
*/
Pay pay = new AliPay();
pay.pay();
/**
* 测试微信支付多态应用
*/
pay = new WeixinPay();
pay.pay();
/**
* 测试银联支付多态应用
*/
pay = new YinlianPay();
pay.pay();
}
------>输出结果如下:
支付宝pay
微信Pay
银联支付
四:抽象类和接口
在上面,我们定义了一个抽象类,抽象类中有一个抽象方法pay(),然后其他具体支付类继承这个抽象类重写它的pay()方法。但是,在实际开发中,我们很少去主动定义一个抽象类,我们每天写代码,更多的是创建一个接口,然后定义接口实现类,在实现类中做对应的业务逻辑处理。
那么,抽象类和接口有什么区别呢?前面说道多态的三个必要条件中有一个是继承,但是我们在定义接口时,是使用的实现,那么,继承和实现又是什么关系呢?为什么实现也能成就多态呢?
首先,我们先来聊一下抽象类和接口的相同点和不同点吧。
1、在java中,抽象类和接口都不能直接进行实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类既可以做方法申明,还可以做方法实现。
4、接口中的变量只能是静态的公共变量,抽象类中的变量是普通的变量,即常量。
5、抽象类中可以没有抽象方法
6、如果一个类中有抽象方法,那么这个类是一个抽象类
7、接口可以继承接口,并且可以多继承,但是类只能单继承。
等....如有描述不对之处,欢迎指点,以便于及时改正。
好了,那么我们再来看一下继承和实现的关系。
我们在讲解多态时,讲述过多态必须满足三大条件之一有一条是继承。但是,当接口有多个实现类时,也能构成多态。所以在这里我对这两者的理解是 实现是多态的另一种表现形式。这句话也能有很大的问题,也可能不对。
在网上查阅了一下相关资料,大都是讲解继承和实现的区别,基于表现形式上的及功能上的,但是对于继承和实现这一块的定义,又多态条件之一继承,这一块目前感觉自己可以进行功能区分,但是还是不能很好的去具体讲解。先不去钻这个牛角尖了。
2018年11月17日 22:19:33