多态实现的机制

  Java提供了编译时多态和运行时多态两种多态机制。前者是通过方法重载实现的,后者是通过方法的覆盖实现的。

  在方法覆盖中,子类可以覆盖父类的方法,因此同类的方法会在父类与子类中有着不同的表现形式。

  在Java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类中的实例对象。同样,接口中的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行时期才动态绑定(绑定是指将一个方法调用和一个方法主体联系在一起),绑定的是引用变量所指向的具体实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这种动态绑定实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态。示例如下:

 1 public class Base {
 2     public Base(){
 3         g();
 4     }
 5
 6     public void g() {
 7         System.out.println("Base g()");
 8     }
 9
10     public void f() {
11         System.out.println("Base f()");
12     }
13 }
 1 public class Derived extends Base{
 2
 3     public void g() {
 4         System.out.println("Derived g()");
 5     }
 6
 7     public void f() {
 8         System.out.println("Derived f()");
 9     }
10
11     public static void main(String[] args) {
12         Base base=new Derived();
13         base.f();
14         base.g();
15     }
16 }

  程序运行结果:

          

  在上面的例子中,由于子类Derived的f()方法和g()方法与父类Base方法同名,因此Derived的方法会覆盖Base的方法。在执行  Base base=new Derived();  语句时,会调用Base类的构造函数,而在Base的构造函数中,执行了g()方法,由于Java语言的多态性,此时会调用子类Derived的g()方法,而不是父类Base 的g()方法,因此会输出"Derived g()".由于实际创建的是Derived对象,后面的方法调用都会调用子类Derived的方法。

  此外,只有类的方法才有多态的概念,类的成员变量没有多态的概念。示例如下:

1 public class Base {
2     public int i=1;
3 }
1 public class Derived extends Base{
2
3     private int i=2;
4
5     public static void main(String[] args) {
6         Base base=new Derived();
7         System.out.println(base.i);
8     }
9 }

  程序运行结果:

         

  由此可见,成员变量是无法实现多态的,类的成员变量的值取父类还是子类并不取决于创建对象的类型,而是取决于所定义变量的类型,这是在编译期间确定的。

时间: 2024-10-16 12:29:36

多态实现的机制的相关文章

C++ 多态的实现机制

关键词:多态 虚函数指针 虚函数表 动态绑定 迟绑定 基类 子类  纯虚函数 抽象类 封装+继承+多态 代码重用 接口重用 隐藏规则(子类中的函数和基类中的函数) 一.为什么需要多态,多态的目的是什么? 二.多态有几种实现方式,多态的实现机制? 三.什么纯虚函数和抽象类,为什么需要定义纯虚函数和抽象类? 1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数.2. 存在虚函数的类都有一个一维的虚函数表叫做虚表.类的对象有一个指向虚表开始的虚指针.虚表是和类对应的,虚表指针是和

(转)c++多态实现的机制

原文地址:http://blog.csdn.net/zyq0335/article/details/7657465 1 什么是多态?多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制程序实现上是这样,通过父类指针调用子类的函数,可以让父类指针有多种形态.2 实现机制举一个例子:#include <iostream.h>class animal{public:void sleep(){cout<<"animal sleep"<&

深入Java核心 Java中多态的实现机制(1)

多态性是Java面向对象的一个重要机制,本文将向您详细介绍Java语言中多态性的实现原理和方法,通过多态一点带出更多Java面向对象有趣而实用的知识. 多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次深入Java核心,一起学习Java中多态性的实现. “polymorphism(多态)”一词来自希腊语,意为“多种形式”.多数Java程序员把多态看

JAVA SE 多态的实现机制

面向对象的三大特征:封装,继承和多态.多态是面向程序设计中代码重用的一个重要机制,它表示当同一操作作用在不同对象时,会有不同的语义. Java 多态主要有以下两种表现方式: 1)方法重载(overload).重载是指同一类中有多个同名方法,但是这些方法必须在参数列表上加以区分,要么参数个数不同,要么在相同位置上的参数类型不同. 2)方法的覆盖(override).子类可以覆盖父类的方法.父类的引用不但可以指向其实例对象,也能够指向子类的实例对象.接口的引用变量也可以指向其实现类的实例对象. 而程

多态的绑定机制

多态就是父类的引用指向子类的对象.但是这个引用如何能够知道自己调用方法的时候是调用子类的还是调用父类的.当在main方法中创建对象的时候,这个时候会在方法栈中创建了一个临时的引用,指向堆内存中的实体.这个临时的(因为mian方法结束后这个引用就不在存在了)引用,只能指向属于它或他的子类的对象.在对象实体的存储过程中,对象的方法存放在方法池(就是一个区域)中,存储在类里面的只不过是一个方法的地址引用.这个地址的引用指向这个类所在的方法池.但当这个对象调用方法时,如果这个方法子类自己没有,那么这个引

java中多态的实现机制

多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前提: 1.存在继承关系,子类继承父类: 2.子类重写父类的方法: 3.父类引用指向子类对象. 具体实例: 1.定义一个父类:Animal 1 package demo; 2 3 class Animal{ 4 int num = 10; 5 static int age = 20; 6 public

第二十二篇:C++中的多态机制

前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多情况下可以互换地使用基类型和派生类型的多种形态. 多态的实现 依赖于动态绑定机制. 动态绑定机制相关 动态绑定是函数实际参数和形式参数绑定的一种方式,它是指我们能够在函数接口中使用继承层次中任意类型的对象,无需关心对象的具体类型. 动态执行接口函数的对象参数的哪个函数得在程序实际执行的时候才能确定

浅谈多态机制的意义及实现

转自:http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html: 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorp

[转载]浅谈多态机制的意义及实现

http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism