继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。(当子类重写父类的方法被调用时,只有对象继承链中的最末端的方法才会被调用。)
但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了。
指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,哪怕是重载(方法名相同,但参数不同)该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
- public
class Wine { -
public void fun1(){ -
System.out.println("Wine 的Fun....."); -
fun2(); -
} -
-
public void fun2(){ -
System.out.println("Wine 的Fun2..."); -
} - }
-
- public
class JNC extends Wine{ -
-
public void fun1(String a){ -
System.out.println("JNC 的 Fun1..."); -
fun2(); -
} -
-
-
public void fun2(){ -
System.out.println("JNC 的Fun2..."); -
} - }
-
- public
class Test { -
public static void main(String[] args) { -
Wine a = new JNC(); -
a.fun1(); -
} - }
- -------------------------------------------------
- Output:
- Wine
的Fun..... - JNC
的Fun2...
2.派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。(例如,方法传入的参数用基类表示,这样就不用为每个不同参数的相同发放重复写多次)
好处就是可以解耦合,比如你需要一个List类,你可以这样实例化ArrayList
那么现在的问题来了
如果你按第二种方式来实现,那么你只需将List
。
多态即多种形态,在运行时确定其状态,在编译阶段无法确定其类型,这就是多态。Python中的多态和Java以及C++中的多态有点不同,Python中的变量是弱类型的,在定义时不用指明其类型,它会根据需要在运行时确定变量的类型(个人觉得这也是多态的一种体现),并且Python本身是一种解释性语言,不进行预编译,因此它就只在运行时确定其状态,故也有人说Python是一种多态语言。在Python中很多地方都可以体现多态的特性,比如内置函数len(object),len函数不仅可以计算字符串的长度,还可以计算列表、元组等对象中的数据个数,这里在运行时通过参数类型确定其具体的计算过程,正是多态的一种体现。有些朋友提出Python不支持多态,我是完全不赞同的.
Python以它这种独有的方式体现多态的根本原因我觉得有两点:1)Python是解释性语言;2)Python中变量是弱类型的。所以Python体现多态的方式和Java决然不同,但是不能因为同Java中体现多态的方式不同就认为Python不支持多态,这种想法过于片面。