JAVA基础知识之多态
多态(polymorphism)按字面的意思就是“多种状态”,意为一个名字可以具有多种语义。简单来说,就是“一种定义,多种实现”,例如,运算符“+”有多种含义,究竟执行哪种运算取决于参加运算的操作数的个数及数据类型。
例如:
+1 //表示正数,单目运算符 1+2 //加法运算符,双目运算,操作数为数值
”1“+”2“ //字符串连接运算符,算目运算,操作数是字符串
在面对对象语言中,接口的多种不同实现方式即为多态。多态性是面对对象的核心特征之一,主要有方法的多态和类型的多态。方法的多态包括方法的重载和覆盖,为一种功能提供多种实现,类型的多态表现为:子类是一种父类类型。
引用CHarlie Calverts对多态的描述,多态即是允许你将父对象设置成为和一个或更多的它的子对象相等的技术,赋值后,父对象就可以根据当前赋值,给它的子对象的特性以不同的方式运作。如果一个语言只支持类而不支持多态,只能说明他是基于对象的,而不是面对对象的。
从程序设计的角度而言,多态可以如下来实现:
public interface parent { public void show(); } public class Child_ONE implements Parent { public void show(){ //子类1的具体实现 } }
public class Test { public static void main(String[] args) { //以父类对象名称指向子类对象实例的方式调用字类1的方法 parent p1 = new Child_ONE(); p1.show(); //以父类对象名称指向子类对象实例的方式调用子类2的方法 Parent p2 = new Child_TWO(); p2.show(); } }
p1.show()调用子类1的方法,p2.show()调用子类方法2的方法
所以,对于抽象的父类或者接口给了具体的实现之后,p1和p2可以完全不管实现的细节,而只访问定义的方法,就可以。事实上,这就是多态所起的作用,可以完全实现控制反转,这在大量的J2EE轻量级框架中被用到,比如Spring的依赖注射机制。
1.子类重定义父类成员
当子类从父类继承来的成员不能满足子类需要时,子类不能删除它们,但可以重新定义它们,修改或扩充父类成员方法的功能,使父类成员能够适应子类新的需求。
子类重定义父类成员包括:
重定义父类的成员变量,则隐藏父类的成员变量。
重定义父类的成员方法,如果参数列表和返回值类型均相同,则覆盖(override)父类的成员方法;如果参数列表不同,则重载(overload)父类的成员方法。如果参数列表相同而返回值类型不同,编译器会指出存在二义性的语法错误。
子类重定义父类成员表现出多态性,父类对象引用父类成员,子类对象引用子类成员。重定义的同名成员之间不会产生冲突和混乱。在子类的实例成员方法中,可使用”super引用“访问被子类隐藏的父类同名成员变量,调用被子类覆盖的父类同名成员方法,语法格式如下:
super.成员变量 //当子类隐藏父类成员变量时,引用父类同名成员变量 super.成员方法([参数列表]) //当子类覆盖父类成员方法时,调用父类同名成员方法