Java编程思想 第八章读书笔记-多态

来源:互联网 发布:手机淘宝首页热点 编辑:程序博客网 时间:2024/05/21 11:03

多态是面向对象三种基本特征之一(继承,抽象,多态)

多态存在的意义是什么?自己的理解,多态消除了类型的耦合。如果一个方法的参数是基类对象,如果没有多态,那么我们需要判断传入的参数到底是基类的哪个衍生类,然后还掉统一方法名的方法,代码比较冗余,和类的耦合度很高。有了多态,我们可以根据动态绑定,在运行时动态的找到参数对应的类,实现对应的方法,效果是我们不需要代码里去判断它是什么类型,我们知道的是他们拥有相同的接口,我们只需要调用接口方法就可以了。多态的使用,让接口方法和具体实现进行分离,我的理解是解除了接口方法与具体实现的耦合。这个的效果就是,调用不用类的同一个方法名方法,每个类的实现效果不一样。

要和封装的概念进行区分,封装是封装了具体实现(通过private方法)把接口和实现分离。

1.向上转型 当一个方法的参数是一个基类,那么这个参数也能接受这个类的导出类,而且我们不需要做任何类型转换,因为导出类必定存在基类的接口。

2.动态绑定和工厂设计方法 

什么是绑定?将方法的调用同方法的主体关联起来。动态绑定是什么?编译器是不知道对象的类型的,但是却能调用正确的方法体然后进行调用。(实现原理:在对象中有有关于类型信息的参数)。Java中除了final 和 static方法外,其他方法都是动态绑定,这就意味着我们不需要自己进行判断它是否是动态绑定了。final修饰的方法我们知道,是不允许继承和重写的,更加重要的一点是final修饰的方法关闭了动态绑定,编译器可以为final方法调用生成更加有效的代码。

工厂思想,我们已经知道了,动态绑定,在运行时找到正确的方法体去实现方法。所以我们可以创造一个方法用来返回基类对象实例,而创建的可以是基类,也可以是衍生类。在方法里,我们根据不同的情况new 出来不同的衍生类对象,然后通过return 向上转型成基类。

再论扩展性,通过动态绑定和工厂思想,我们明白了一个问题,方法调用只会调用基类的接口。我们在添加更多的衍生类的时候,不需要增加更多的识别类型的代码就可以实现接口功能的扩展,我们只需要在工厂方法里添加一个新的情况,new 出来我们新增的类,不需要修改别的代码,就能实现扩展。

方法是多态的,那么变量是否也是多态的?成员变量也是多态的,为了避免误会,我们尽量在衍生类里面使用和父类不同的成员变量名,或者我们尽可能的把基类的成员变量设置为private。 

什么样的没有多态性,静态的(static) final的

3.既然方法有多态,构造方法也是特殊的方法,是否具有多态?no  构造方法不具有多态性(这不就乱了嘛)。但是我们需要了解构造器如何通过多态在复杂层次结构中的运作。

构造器的调用顺序 逐层向上使得每个基类的构造器都能够得到调用。这样做的意义是防止调用某个方法这个方法需要使用的成员变量没有初始化,否则不肯能构造出完整的对象。

对象的清理顺序和构造顺序完全相反,我们基本上做法是重写基类的清理方法,在清理方法中清理当前类的对象需要清理的数据,然后调用父类的清理方法(不调用就不清理基类对象)。为什么要后调用基类的清理方法,我们的处理方式要根据依赖关系来,衍生类依赖基类,因此这样清理方式是安全的。

如果在一个构造器内部调用正在构造的对象的某个动态绑定方法会发生什么情况呢。在一般方法内部,动态绑定的调用是在运行时决定的,因为对象无法知道它是属于方法所在的那个类,还是那个类的导出类。

初始化的实际过程:1.在其他任何事物发生之前,将分配给对象的空间初始化为二进制0;2.调用基类的构造器,如果构造器里面有方法在衍生类被复写,调用复写的方法3.然后按照衍生类声明的顺序调用成员的初始化方法4.调用导出类构造器

4.协变返回类型,在基类中,我们有一个接口方法返回值是基类对象,我们可以在这个类的衍生类中,覆写该方法,并且返回值为这个返回值类的其中一个衍生类。

5.用继承进行设计   继承和组合都是代码复用比较好的实现方式,我们决定使用哪个实现方式是根据自己场景需求的,组合方式的好处是,我们可以在运行时决定使用具体类型,而继承不能多继承多个类。如果我们不需要向上转型的时候我们可以考虑是否需要继承。

向上转型和向下转型 向上转型-需要理解一点就是衍生类接口只会等于基类接口数,我们的扩展将无法提供服务。向上转型是安全的。  向下转型-需要进行检查,如果不检查有可能会造成类型转换异常。






0 0
原创粉丝点击