JAVA中的多态是类的固有属性,多态是由类的继承,重写,向上转型而产生的一种特质。举个例子我们创建一个叫程序员的class,这个class可以被很多class所继承,比如说前段程序员,后端程序员,数据库程序员等等。假如一个程序员拥有debug这项技能,那么毫无疑问前端程序员,后端程序员和数据库程序员也理应具备这项技能。假设我们现在有一个class叫项目经理,其中有一个function是这个项目经理调用程序员进行debug,虽然这个项目经理手下并没有程序员,但是他有前端程序员,那么直接调用前段程序员也能完成debug这项任务。在java中这样的调用被称为向上转型,在一个function对一个类的调用,我们直接对这个function输入这个类的子类,java会自动完成子类向父类的向上转型。其实这种特性我认为是java中抽象设计的一种产物,举个例子,为什么写项目经理调用程序员进行debug这个function,我们不把parameter程序员改成前端程序员?假设我们这样设计,那么当项目经理需要进行数据库debug的时候我们就必须重新再写一个调用数据库程序员debug的function。因为数据库程序员和前段程序员是并行的关系,他们debug的领域也是平行无交叉的,所以他们debug function的重写也应该是完全不同的。那么向上转型这一特性就大大提升了代码的可复用性,调用程序员进行debug这个function可以用来调用各种程序员。
下图是多态的例子:
我们可以看到当mic和mf被调用时,他们的输出是不一样的,这是因为debug方法在mf和mic中被重写了。
需要注意的是在进行向上转型后,其中子类独有的function无法被父类调用。举个例子,前段程序员有一个function是进行前端程序设计,然而后端程序员和数据库程序员显然是没有这个功能的。父类描述的所有程序员所共有的属性和function,所以前端程序设计这个function并不是所有程序员所共有的功能所以理应无法被其父类调用。
注意看se在调用frontEndDesign这个function时报错。
至于向下转型,我想了很久觉得理解其实用性并不高,因为这和实例一个子类的过程感觉并没有太大区别。如果硬要进行向下转型会让人觉得有点多此一举并且降低代码可读性。