[Java]重学Java-多态
2021-08-20 本文已影响0人
AbstractCulture
从一个例子理解多态
对于一个不同特征的对象,使用接口可以隐藏子类的行为,对外暴露同一个接口,从而实现编程的解耦.
多态当然,这不一定是要用接口来实现,使用继承也是可以的。
这里我们其实也可以简单用if-else这样的结构来进行判断分发。
但是多态提供了高扩展性,如果此时再来一个广发银行
,只需要实现银行
这个接口,即可很好的扩展了,在运行时,JVM通过类型判断类决定调用哪个类的方法.
实战多态
现在我们来把上面的需求实现一下。
UML定义接口
- IBank
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 银行接口
* @author jaymin
* @since 2021/7/1
*/
public interface IBank {
/**
* 办理信用卡
*/
void applyCreditCard();
}
定义不同的实现类
- ZSBank
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 招商银行
* @author jaymin
* @since 2021/7/1
*/
public class ZSBank implements IBank{
@Override
public void applyCreditCard() {
System.out.println("办理信用卡送无线耳机");
}
}
- ChineseBank
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 中国银行
*
* @author jaymin
* @since 2021/7/1
*/
public class ChineseBank implements IBank {
@Override
public void applyCreditCard() {
System.out.println("办理信用卡送行李箱");
}
}
- PFBank
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 浦发银行
* @author jaymin
* @since 2021/7/1
*/
public class PFBank implements IBank{
@Override
public void applyCreditCard() {
System.out.println("办理信用卡送MP4");
}
}
Demo
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop <br>
* 理解多态
* @author jaymin
* @since 2021/7/1
*/
public class Polymorphism {
/**
* 传入实现同一个接口的不同实例,触发不一样的效果
* @param args
*/
public static void main(String[] args) {
applyCreditCard(new PFBank());
applyCreditCard(new ChineseBank());
applyCreditCard(new ZSBank());
}
private static void applyCreditCard(IBank bank){
bank.applyCreditCard();
}
}
Result
办理信用卡送MP4
办理信用卡送行李箱
办理信用卡送无线耳机
回顾继承
对于继承来说,也可以在方法上声明传入基类,然后传入不同的子类实例来实现多态,这属于"向上转型"。
在我的文章中,有对这种动态绑定的现象做了解释: 点我前往
面向接口编程
接口-interface
将对象之间传递消息与实现的逻辑进行了解耦,这样在做替换的时候,对于上层的调用方来说是无感的。
一些多态的陷阱
- 无法重写
private
方法. -
static
方法不具备多态性,原因是static
只跟类有关,与对象无关,多态是对象的行为. - 切记子类和父类不要定义一样名称的
field
.
总结
- 类可以实现多个接口,但是继承只能是单个继承的.
- 继承和接口都可以实现多态,多态是一种思想,而不是具体的某个表现.
- 为了在程序中有效地使用多态乃至面向对象的技术,就必须扩展自己的编程视野,不能只看到单一类中的成员和消息,而要看到类之间的共同特性和它们之间的关系。尽管这需要很大的努力,但是这么做是值得的。它能带来更快的程序开发、更好的代码组织、扩展性更好的程序和更易维护的代码。
但是记住,多态可能被滥用。仔细分析代码以确保多态确实能带来好处。
以上语录摘自《Java编程思想》