课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
多态是面向对象编程开发的众多特性之一,而今天我们就通过案例分析来了解一下,java编程开发多态的作用与实践方法。
多态的作用:消除类型之间的耦合关系。
绑定:将一个方法调用同一个方法主体关联起来被称作绑定。
前期绑定:在程序执行前进行绑定,如面向过程语言C。
后期绑定:在运行时根据对象的类型进行绑定,如JAVA。
Java除了static、final(private也属于final)方法之外,都是后期绑定。所以当我们声明一个方法为final时,意思是关闭动态绑定。
多态的"缺陷"
父类中只有非private方法才能被覆盖。否则其实在子类中名字相同的只是个全新的方法,并没有覆盖。
成员变量在多态时访问的是父类的成员变量值(如果成员变量相同的时候,这时候子类包含这两个名字相同的成员变量值,一个是父类的,通过super.field调用,一个是子类的,this.field),方法访问的是子类的复写方法(如果有覆盖重写的话)
static静态方法是类方法,与对象无关,不具有多态性
在实际工作中,我们一般不会这样,一般会把成员变量都修饰为private(再通过get/set方法提供访问),且对于父类和子类的成员变量命名也不会相同,避免引起混淆。
多态和构造器
构造器的特殊任务:检查对象是否被正确地构造。
复杂对象调用构造器的顺序:
在对象创建之前,将分配给对象的存储空间初始化为二进制零。
调用父类构造器,这个步骤会递归传递到Objcet对象。
按照声明顺序调用成员变量的初始化方法。
调用子类构造器的主体。
注意:每一个类的初始化都遵循如果一次调用的话,会有static成员变量先初始化,然后是类的成员变量的初始化,再然后是构造器的调用。这一调用顺序在父类或者成员对象的调用中都适用。当然要注意的是如果类的static成员变量已经不是一次初始化则不会再调用了。
PS:如果父类在初始化的构造器中调用覆盖的方法,则根据多态调用的其实是子类覆盖的方法,只是由于子类还未初始化,其中如果有成员变量的话则值为0.
编写构造器准则:
用尽可能简单的方法使对象进入正常状态;如果可以的话,构造器避免调用其他方法。构造器可以安全调用的是final修饰的方法(包括private)。其他的会多态到子类上去。
协变返回类型允许我们写方法时返回更具体的对象类型。比如不是Shape而是Cycle.
通过继承表达行为间的差异,并用成员变量(相同的接口,不同的类型赋予不同的子类)表达状态上的变化。
注意:
多态时创建的对象调用只能是父类有的方法,因为多态时引用是向上转型的,子类的扩展方法会“丢失”,如果要使用子类的扩展方法则要向下转型。如果向下转型不成功(不是该类型或其父类)则会报ClassCastException(类转型异常)。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。