zoukankan      html  css  js  c++  java
  • java面对对象-多态

    什么是多态
    
    1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
    2.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
    3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
    4.多态的作用:消除类型之间的耦合关系。
    5.现实中,关于多态的例子不胜枚举。
    下面是多态存在的三个必要条件,要求大家做梦时都能背出来!
    
    多态存在的三个必要条件
    一、要有继承;
    二、要有重写;
    三、父类引用指向子类对象。
    
    多态的好处:
    1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
    2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
    3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
    4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
    5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
    
    
    Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
    1. Java中除了static和final方法外,其他所有的方法都是运行时绑定的。private方法都被隐式指定为final的,因此final的方法不会在运行时绑定。当在派生类中重写基类中static、final、或private方法时,实质上是创建了一个新的方法。
    2.在派生类中,对于基类中的private方法,最好采用不同的名字。
    3.包含抽象方法的类叫做抽象类。注意定义里面包含这样的意思,只要类中包含一个抽象方法,该类就是抽象类。抽象类在派生中就是作为基类的角色,为不同的子类提供通用的接口。
    4.对象清理的顺序和创建的顺序相反,当然前提是自己想手动清理对象,因为大家都知道Java垃圾回收器。
    5.在基类的构造方法中小心调用基类中被重写的方法,这里涉及到对象初始化顺序。
    6.构造方法是被隐式声明为static方法。
    7.用继承表达行为间的差异,用字段表达状态上的变化。
    在JAVA中有两种多态是指:运行时多态和编译时多态。
    关于类的多态性简介如下:
    
    多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性.
    
    1、类多态性表现
    
    (1)方法重载
    
    重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多种实现.编译时,根据方法实际参数的数据类型个数和次序,决定究竟应该执行重载方法中的哪一个.
    
    (2)子类重定义从父类继承来的成员
    
    当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,使弗雷成员适应子类的新需求.子类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,子类对象引用子类成员,不会产生冲突和混乱.
    
    子类可重定义父类的同名成员变量,称子类隐藏父类成员变量.子类也可以重定义父类的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法覆盖(override)父类方法。覆盖父类方法时,子类方法的访问权限不能小于父类方法的权限。
    
    由于Object类的equals()方法比较两个对象的引用是否相等而不是值是否相等,因此一个类要覆盖Object类的equals()方法,提供本类两个对象比较相等方法.
    
    覆盖表现为父类与子类之间方法的多态性.java 寻找执行方法的原则是:从对象所属的类开始,寻找匹配的方法执行,如果当前类中没有匹配的方法,则逐层向上依次在父类或祖先类中寻找匹配方法,直到Object类.
    
    2、super 引用
    
    在子类的成员方法中,可以使用代词super引用父类成员.super引用的语法如下:
    super([参数列表]) //在子类的构造方法体中,调用父类的构造方法
    super.成员变量 //当子类隐藏父类成员变量时,引用父类同名成员变量
    super.成员方法([参数列表]) //当子类覆盖父类成员方法时,调用父类同名成员方法
    *注意:super引用没有单独使用的语法
    
    3、多态性有两种:
    1)编译时多态性
    对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性.
    2)运行时多态性
    如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性.
    方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如:
    XXXX x1 = new XXXX(参数列表); //对象获得本类实例,对象与其引用的实例类型一致
    XXX xx1 = new XXX(参数列表);
    x1.toString(); //编译时多态性,执行XXX类的方法.
    xx1.toString(); //编译时多态性,执行XXXX类覆盖的方法.
    XXXX为XXX的父类.
    由于子类对象既是父类对象,父类对象与子类对象之间具有赋值相容性,父类对象能够被赋值为子类对象.例如,
    XXXX x2 = new XXX(参数列表); //父类对象获得子类实例,子类对象即是父类对象
    x2.toString(); //运行时多态
  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/wuqiance/p/11598956.html
Copyright © 2011-2022 走看看