-
知识点概述
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口,或使用一个单一的符号来表示多个不同的类型。
多态的最常见主要类别有:
- 特设多态:为个体的特定类型的任意集合定义一个共同接口。
- 参数多态:指定一个或多个类型不靠名字而是靠可以标识任何类型的抽象符号。
- 子类型(也叫做子类型多态或包含多态):一个名字指称很多不同的类的实例,这些类有某个共同的超类。
——引自维基百科
-
背景知识
历史
在1967年,英国计算机科学家克里斯托弗·斯特雷奇在他的讲义合集《编程语言中的基础概念》中,首次提出了特设多态和参数多态的概念。特设多态是Algol 68的特征,而参数多态是ML在1975年介入的类型系统的核心特征。
在1985年,彼得·瓦格纳和卢卡·卡代利在论文中引入了术语“包含多态”来为子类型和继承建模,引证1967年的Simula为子类型和继承的最早的对应实现。
面型对象的思想
面向过程的范式重点在于设计方法。面向对象的范式将数据和方法耦合在一起构成对象。使用面向对象范式的软件设计重点在对象以及对象上的操作。
继承
面向对象编程支持从已经存在的类中定义新的类,这称为继承。继承是Java在软件重用方面一个重要且功能强大的特征。假设要定义一个类,对圆、矩形和三角形建模。这些类有很多共同的特征。设计这些类来避免冗余并且使系统易于理解和易于维护的最好方式是什么?答案就是使用继承。
继承使得你可以定义一个通用的类(即父类),之后继承该类为一个更特定的类(即子类)。
继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如,每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。
转型
Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。
转型可分为向上转型(upcasting) 和向下转型(downcasting)。
向上转型
通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
1.向上转型不要强制转型
2.父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定
3.向上转型后父类引用不能调用子类自己的方法
向下转型
与向上转型相反,即是把父类对象转为子类对象。
-
知识点详述
多态:基类型对象访问派生类重写的方法
- 循环调用基类对象,访问不同派生类方法
- 实参是派生类;形参是基类
面向对象程序设计的三大支柱是封装、继承和多态。
多态意味着父类型的变量可以引用子类型的对象。
package chapter11_ex;
public class GeometricObject {
private String color="white";
private boolean filled;
private java.util.Date dateCreated;
/** Construct a default geometric object */
public GeometricObject() {
dateCreated=new java.util.Date();
}
/** Construct a geometric object with the specified color
* and filled value
*/
public GeometricObject(String color,boolean filled) {
dateCreated=new java.util.Date();
this.color=color;
this.filled=filled;
}
/** Return color */
public String getColor() {
return color;
}
/** Set a new color */
public void setColor(String color) {
this.color=color;
}
/** Return filled.Since filled is boolean,
* its getter method is named isFilled */
public boolean isFilled() {
return filled;
}
/** Set a new filled */
public void setFilled(boolean filled) {
this.filled=filled;
}
/** Get dateCreated */
public java.util.Date getDateCreated(){
return dateCreated;
}
/** Return a string representation of this object */
public String toString() {
return "created on "+dateCreated + "\ncolor: " + " and filled: "+filled;
}
}
package chapter11_ex;
public class PolymorphismDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
displayObject(new Circle(1,"red",false));
displayObject(new Rectangle(1,1,"black",true));
}
public static void displayObject(GeometricObject object) {
System.out.println("Created on "+object.getDateCreated()+". Color is "
+object.getColor());
}
}
方法displayObject具有GeometricObject类型的参数。可以通过传递任何一个GeometricObject的实例(例如new Circle(1,"red",false)和new Rectangle(1,1,"black",true))来调用displayObject。使用父类对象的地方都可以使用子类的对象。这就是通常所说的多态(polymorphism,它源于希腊文字,意思是“多种形式”)。简单来说,多态意味着父类型的变量可以引用子类型的对象。
-
小结
多态的核心是在哪个类里可以体现多态,这个类的方法如果不使用多态,就需要写多个方法。那个类里使用多态的语句,比如是几何图形shape这个类。比如设置颜色方法,设置圆的颜色、设置三角形的眼色 需要不同的方法。重要的就是测试类和主人类,测试类中创建对象,主人类中定义声明核心方法setColor()。