黑马程序员技术交流社区

标题: 什么是动态多态性?Java中的动态多态包含哪些类型? [打印本页]

作者: 王小丑    时间: 2013-2-18 20:56
标题: 什么是动态多态性?Java中的动态多态包含哪些类型?
大家都知道,多态性,顾名思义就是拥有“多种形态”的含义,是指属性或方法在子类中表现为多种形态。它包括两种类型:静态多态性和动态多态性。
静态多态性就是包括变量的隐藏、方法的重载(指同一个类中,方法名相同[方便记忆],但是方法的参数类型、个数、次序不同,本质上是多个不同的方法);这个很容易理解,用起来也很上手,可是动态多态性我本人感觉很不容易用,我其实就不太明白为什在实际运行时,JVM能够根据父类(或接口)引用所指的具体子类,去调用对应子类?这个问题一直很困解,求高手指教,最好能给出实例,多谢,虚心学习!

作者: 王小丑    时间: 2013-2-18 20:58
补充:程序代码在编译时到底能不能确定调用的哪一个类的方法?是不是只有在运行时才能确定?
作者: 胥文    时间: 2013-2-18 21:36
静态多态行其实就是函数的重载,在一个类中完成
eg:
class Test
{
public int getValue(int x,int y)
{
  return x+y;
}
public int getValue(int x,int y,int z)
{
  return x+y+z;
}
public double getValue(double x,double y)
{
  return x+y;
}
}
而动态多态性可以理解为方法的重写,必须是在有继承关系的两个或两个以上的类中完成
class A
{
public void show(){}
}
class B extends A
{
public void get(){}
}
class Test
{
public static void main(String... args)
{
  A a = new B();//创建一个父类的引用指向子类的对象,针对你的问题在编译的时候能确定是调用父类的方法,如果是子类的方法会编译失败的,而要调用子类的类型就必须向下转型
  a.show();
  //a.get();//就会编译失败,因为这是子类B特有的方法,要调用子类特有的方法必须就将a转化成B类型
  (B)a.get();
}
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2