think in java第八章多态 总结随笔

来源:互联网 发布:美妙天堂知里绘画图片 编辑:程序博客网 时间:2024/04/27 08:57

多态:基于继承的向上转型功能,允许同一种类型同一行为有不同的表现。

多态的优点:多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序—即无论在项目最初创建时还是在需要添加新功能时都可以"生长"的程序。

多态的作用:消除类型之间的耦合关系。

再论向上转型

当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。举例:水杉是树的一种(树的子类),我们可以称水杉是树。

转机

public static void tune(Instrument i) {i.play(Note.MIDDLE_C);}

上面代码中tune()方法接受了一个Instrument引用。在这种情况下,编译器是怎么样知道Instrument引用指向的是A对象,而不是B对象或C对象。要解决这个问题需要了解绑定了。

绑定:将一个方法调用同一个方法主体关联起来。

前期绑定:程序在执行前进行绑定。

后期绑定:程序运行时根据对象的类型进行绑定,后期绑定也叫做动态绑定或运行时绑定。

Java中默认是动态绑定。特殊:static方法和final(private方法属于final方法)方法不存在多态性,不是动态绑定。

动态绑定好处:使得多态中的基类对象可以正确执行相应的导出类对象方法。

可扩展性:多态使得扩展新类型和扩展基类不会对已有代码(调用基类方法的代码)产生影响。它可以让程序员“将改变的事物与不变的事物分离开”。

不可以覆盖private方法。子类是否会覆盖父类方法,按照子类是否可以访问到父类该方法来决定是否可以覆盖。

域与静态方法:多态特性(动态绑定)只是针对方法的。域和静态方法不具有这种特性。

构造器和多态

构造器是隐式static方法,所以不具有多态特性。

构造器的调用顺序:(其实这个知识点在之前已经有提到了)

用例:

package test;class Dog {public Dog() { System.out.print("汪汪");}}class Cat {public Cat() { System.out.print("喵喵"); }}class Mouse {public Mouse() { System.out.print("滋滋"); }}class Animal {public Animal() {System.out.print("动物");  }}class Bird extends Animal {public Bird() { System.out.print("鸟"); }}class Sparrow extends Bird {public Sparrow() {System.out.print("麻雀");}}public class test extends Sparrow {private Dog dog = new Dog();private Cat cat = new Cat();private Mouse mouse = new Mouse();public test() { System.out.print("吱吱"); }public static void main(String[] args) {new test();}}
答案:动物鸟麻雀汪汪喵喵滋滋吱吱

基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每一个基类的构造器杜能得到调用。

继承与清理:通过组合和继承方式创建新类时,通常情况都是不需要担心对象的清理问题,子对象通常都会留给垃圾回收进行处理。

如果确实需要做清理时,必须非常小心谨慎:在使用完之后按照创建逆序清理,即sub.dispose()然后super.dispose()来清理。

构造器内部的多态方法行为:

在调用子类构造器的过程中,会先调用父类构造器,此时子类构造器还没调用完成,子类对象也没有执行初始化,如果在父类构造器里调用多态方法,那么这个方法是可以产生多态行为特征的,但是由于子类构造器没有执行完,因此子类的初始化还没完成,多态方法里对子类成员变量的获取只能拿到默认值0,false,null。

总结

多态意味着“不同的形式”。在面向对象的程序设计中,我们持有从基类继承而来的的相同接口,以及使用该接口的不同形式:不同版本的动态绑定方法。


原创粉丝点击