《java基础》多态/动态绑定

原创 2015年07月06日 16:14:50

什么是多态

  1. 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
  2. 多态的定义指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
  3. 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  4. 多态的作用消除类型之间的耦合关系
  5. 现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

下面是多态存在的三个必要条件,要求大家做梦时都能背出来!

多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象


    对于多态,可以总结以下几点:

    一、使用父类类型的引用指向子类的对象; 
    二、该引用只能调用父类中定义的方法和变量; 
    三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 
    四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

 多态的好处

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

  1. class Father{   
  2.     public void func1(){   
  3.         func2();   
  4.     }   
  5.     //这是父类中的func2()方法,因为下面的子类中重写了该方法   
  6.     //所以在父类类型的引用中调用时,这个方法将不再有效   
  7.     //取而代之的是将调用子类中重写的func2()方法   
  8.     public void func2(){   
  9.         System.out.println("AAA");   
  10.     }   
  11. }   
  12.     
  13. class Child extends Father{   
  14.     //func1(int i)是对func1()方法的一个重载,主要不是重写!  
  15.     //由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用   
  16.     //所以在下面的main方法中child.func1(68)是不对的   
  17.     public void func1(int i){   
  18.         System.out.println("BBB");   
  19.     }   
  20.     //func2()重写了父类Father中的func2()方法   
  21.     //如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法   
  22.     public void func2(){   
  23.         System.out.println("CCC");   
  24.     }   
  25. }   
  26.     
  27. public class PolymorphismTest {   
  28.     public static void main(String[] args) {   
  29.         Father child = new Child();   
  30.         child.func1();//打印结果将会是什么?    
  31.         child.func1(68);  
  32.     }   
  33. }  

 上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。 

    那么该程序将会打印出什么样的结果呢? 
    很显然,应该是“CCC”。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java基础-构造函数,覆写父类方法,多态及动态绑定,抽象类和Object类的运用

Java构造函数,覆写父类方法,多态及动态绑定,抽象类和Object类的运用

Java中的多态和动态绑定

先来一张图表明类Employee,Manager,Secretary,Programmer, Executive的继承关系 在java中有一个用来判断是否应该设计为继承关系的简...

Java多态与动态绑定

public class Polymorphism { public static void main(String[] args) { // TODO Auto-generated metho...

Java中的多态(polymorphism)和动态绑定(dynamic binding)

以下面代码为例,存在超类Employee和子类Manager,两个类中都有getSalary方法,但实现不同。一个对象变量可以引用多种实际类型的现象被称为多态(polymorphism),运行时能够自...

Java面向对象 多态动态绑定(非静态成员函数、成员变量、静态成员函数)

package test; class Father { int num = 1; void method1() { System.out.println("father method1")...

【Java Learning】重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding

Title:重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding 【Section one】     对于面向对象编程语言,重载...

【Java】多态和动态绑定中的坑

大一学C++的时候就感觉多态这部分略烦,小坑不断。一年过后学习Java再次遇到多态的问题,写一篇笔记来记下发现的各种小坑,以供以后复习。来看下面一段代码:enum Note { MIDDLE_...

java多态(动态绑定)

一、面向对象最核心的机制——动态绑定,也叫多态    1.1.通过下面的例子理解动态绑定,即多态 1 package javastudy.summary; 2 3 ...

Java - 多态、动态绑定、抽象类和访问修饰符

一个对象变量可以指示多种实际类型的现象叫做多态。 在运行时能够自动地选择调用哪个方法的现象叫做动态绑定。 在Java中,不需要将方法声明为虚拟方法。动态绑定是默认的处理方式。如果不希望让...

Java多态和动态绑定

在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例。package syc; public class Demo { public static void main(Strin...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)