频道栏目
首页 > 资讯 > Java > 正文

Java编程思想-多态

17-09-01        来源:[db:作者]  
收藏   我要投稿

多态

多态?是一种动态绑定、后期绑定或者是运行时绑定。那我们就要仔细研究下什么是动态绑定。这也就跟方法的上转型相关。

1、方法覆写

什么是方法覆写?在继承中,子类将父类的方法重新定义,方法名称、返回类型、权限属性、参数基本都一致,但方法体不同。也有返回类型不同的情况称作协变返回类型—需要返回类型具有继承关系。

2、动态绑定

当类之间向上转型时,调用一个在子类中被覆写的父类方法。这个时候是执行的子类的方法。一个问题是父类调用该方法时实发已经确定了是调用自己的方法还是子类的方法。实际是在运行时根据对象的类型进行动态绑定的,也就是后期绑定。Java中除了private方法和final方法是编译时确定的,其他都是后期绑定的。因此Java中的方法是通过动态绑定来实现多态这个事实的。

3、工厂模式

这种模式就是充分利用了Java的多态的特性。一个抽象的父类方法,子类根据自己的特性覆写父类的方法,然后通过工厂加工返回具有特定特征的类型。

4、缺点

在子类和父类之间,子类无法覆写父类的属性和静态方法,所以也就不存在静态方法的重载问题了。

5、构造器和多态

在有继承关系的类中,类的初始化方式为:

1) 父类构造方法;

2) 导出类(子类)的构造方法。

那么问题来了,显然子类实在父类对象构建之前被构建的,那么父类构造方法调用了在子类中被覆写的方法,该如何执行?按照类的初始化顺序应该是父类的方法。但实际上调用的是被覆写的方法,也就是说子类没有被完全构建完全,其方法也是可以执行的。为什么呢?使我们的假设不正确,我们假设了只有执行完构造方法才能确定对象被构造了,这个假设显然跟实际结果不相符合。那说明当我们使用new关键字去为类开辟内存空间时,对象已经出现了,但此时还未被初始化,所有的成员变量都是默认二进制的零。如果这样的话肯定会出现一种情况:

父类调用覆写的方法,而子类覆写时使用了自身的属性或者变量,那么此时使用到的变量的值和在子类中初始化的值是不同的。经过测试,的确是这样。

那就是说实际的初始化过程是:

1) 在任何事物发生之前,将分配给对象的存储空间初始化为二进制的零;

2) 调用基本(父类)构造方法;

3) 初始化子类的成员变量;

4) 调用子类的构造方法。

6、向下转型

当一个子类向上转型为父类对象后,子类中新增的属性和方法就不能被使用,但是可以强制再转为子类类型,这样子类的新的方法和属性都可以重新被启用。这个类型转化是不安全的,因此需要强制转化。这个过程中,如果有向下,则必须要有对应的向上转型,否则运行时会出现类型转换异常。因为在程序运行过程中,同样会对对象的类型做检查。

相关TAG标签
上一篇:Python集合的学习
下一篇:python基础学习——混合数据类型
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站