A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 〃Mr.Zぐ 中级黑马   /  2013-4-11 19:55  /  2310 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java静态多态性和动态多态性有何区别?分别又是如何体现的呢?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

10 个回复

倒序浏览
本帖最后由 柳 德 彬 于 2013-4-11 20:05 编辑

静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。
动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。
java 的多态机制遵循一个原则:当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法 .
简单来说,静态多态性就是指方法的重载,是在一个类中的行为。
动态多态性是指方法的重写,即多态,是在有继承关系的两个或两个以上的类中的行为。概念理解起来有点抽象。还是看个例子吧。
  1. //静态多态性:
  2. add(int a);
  3. add(int a,int b);
  4. add(double a);
  5. add(double a,double b);

  6. //动态多态性
  7. public class A{ }

  8. public class AB extends A{ }

  9. public class AC extends A{ }

  10. public class test{
  11.   go(A a);
  12. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
柳 德 彬 发表于 2013-4-11 20:04
静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。
动态多态性指在运行中才能动态确定操 ...

java不是没有指针和虚函数吗?
回复 使用道具 举报
简单来说,静态多态性就是指方法的重载,是在一个类中的行为。动态多态性是指方法的重写,即多态,是在有继承关系的两个或两个以上的类中的行为。
回复 使用道具 举报
张旺达 发表于 2013-4-11 20:11
java不是没有指针和虚函数吗?

我只知道有指针 不过是体现形式不一样而已。
回复 使用道具 举报
参见毕老师“多态中成员函数的特点”:

当父类引用指向子类对象时,
1,编译时期:参阅引用变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,则编译失败。
2,运行时期:参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
这个比说动态静态好理解一些。更不用提什么虚函数和指针。

示例如下:
  1. class Fu
  2. {
  3.         void method1()
  4.         {
  5.                 System.out.println("fu method_1");
  6.         }
  7.         void method2()
  8.         {
  9.                 System.out.println("fu method_2");
  10.         }
  11. }

  12. class Zi extends Fu
  13. {
  14.         void method1()
  15.         {
  16.                 System.out.println("zi method_1");
  17.         }
  18.         void method3()
  19.         {
  20.                 System.out.println("zi method_3");
  21.         }
  22. }

  23. class DuoTaiDemo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Fu f = new Zi();

  28.                 f.method1();//可以运行,因为编译时期,父类有method1方法。
  29.                 f.method2();//可以运行,因为编译时期,父类有method2方法。

  30.                 //f.method3();不可以运行,因为编译时期,父类没有method3方法。
  31.         }
  32. }
复制代码
程序的运行结果是:

zi method_1
fu method_2

因为运行时是参阅子类的方法,有method1方法,所以运行子类的method_1;没有method2方法,所以运行子类的method_2。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
最后一句纠正一下,“没有method2方法,运行父类的method_2。”
回复 使用道具 举报
李罡 中级黑马 2013-4-11 21:20:05
8#
多态自始至终都是子类对象在做着变化。类型提升以后,对象就只有父类当中的内容,而没有子类本身所特有(即子类有而父类没有)的功能了,必须要把它强制转成子类类型才具有它所特有的功能。但是父类当中的内容会被子类当中的覆盖(即功能自始至终都是子类的)。
也就是说:
多态的出现代码中的特点(多态的使用注意情况)
        在编译时期:参阅引用型变量所属的类中(即父类)是否有调用的方法。如果有,编译通过,如果没有,编译失败。
        在运行时期:参阅对象所属的类中是否有调用的方法。
        简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。比如:Animal a=new Cat();表示父类引用指向子类对象。
在多态中,成员变量的特点:
        无论编译和运行,都参考左边(引用型变量所属的类)
        在多态中,静态成员函数的特点:
        无论编译和运行,都参考左边
静态就是指编译时期,动态就是指运行时期。
好好思考这些话,再结合上面的程序,就能理解了,不难。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
张旺达 发表于 2013-4-11 20:11
java不是没有指针和虚函数吗?

就是方法。。。
回复 使用道具 举报
静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。 动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。 java 的多态机制遵循一个原则:当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法
回复 使用道具 举报

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马