1、什么是多态?
2、Java中如何实现多态?
3、多态存在的3个必要条件
4、两种形式的多态
5、晚联编
6、多态机制优点
7、面向对象的主要优势
8、代码重用的意义
1、什么是多态?
public class Tree {
int age = 0;
public void name() {
System.out.println("Tree");
}
public static void main(String[] args) {
Tree tree = new Poplar();
tree.name();
System.out.println(tree.age);
}
}
class Poplar extends Tree {
int age = 4;
public void name() {
System.out.println("Poplar");
}
}
output:
Poplar
0
多态性是OOP中的一个重要特性,主要是用来实现动态联编的。就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。
2、Java中如何实现多态?
java引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致。就会出现所谓的多态。
3、多态存在的3个必要条件
继承、方法重写、父类引用指向子类对象。
注意:引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时执行它运行时类型所具有的方法。因此,编写java代码时,引用变量只能调用声明该变量时所用类里包含的方法。例如Object o = new Person(),对象o就只能调用object类的方法。(《疯狂Java讲义》)
与方法不同的是,对象的属性不具备多态性。
多态特征:对外一个接口,内部多种实现
4、两种形式的多态
运行时多态和编译时多态。编译时多态主要是通过重载(overloading)技术实现的,即在一个类中相同的方法名可用来定义多种不同的方法。运行时多态是在面向对象的继承性的基础上建立的,是运行时动态产生的多态性。
把子类当做父类处理的过程叫做上塑造型(upcasting)。
5、晚联编
多态机制使得程序可以只向类继承体系的基础类发消息,而却可以在运行时得到恰当子类所提供的服务。这是如何实现的呢?
面向对象的程序设计语言实现多态的技术是动态绑定或晚联编(late binding)技术。对应于晚联编是非面向对象语言编译器所采用的早联编(early binding)方式。早联编方式中由编译器产生对一个特定函数名称的调用,由连接器把该方法调用解析为该方法所对应代码的绝对地址。面向对象语言因为程序直到代码运行时才能确定代码的地址,所以早联编的方式是不适用的。在晚联编方式中,当向一个对象发消息时,所调用的代码直到运行时刻才能确定。语言的编译器可以保证该方法存在并且执行参数与返回结果的类型检查,但却不知道要执行的准确代码。在运行时刻,java运行系统根据对象变量当时所指向对象的实际类型,调用该对象的相应方法。
C++为了提高程序运行效率,方法默认是不采用晚联编的,必须对采用晚联编的方法用virtual关键字显示说明。java中默认采用晚联编。
6、多态机制优点
① 使程序具有良好的可扩展性(对于一个类体系可以动态增加新的类型或减少类型,已经存在的访问这个类体系对象的代码依然可以正常工作)
② 使程序易于编写,易于维护,并且易于理解(在对具有继承关系的一组类进行处理时,只要根据这组类中的基础类接口编写一个方法就可以了,不用针对不同的子类专门编写代码,简化程序编写且易于维护,使程序结构得到简化,易于理解)
7、面向对象的主要优势
更好的可重用性、可扩展性、可管理和可维护性。最大的优势是代码重用。可重用的代码是类和对象,面线对象中的数据抽象、封装、继承、多态等特征都围绕和体现了代码重用的思想。
8、代码重用的意义
◆ 由于使用大量可重用的类库,提高了开发效率,缩短了开发周期,降低了开发成本;
◆ 由于采用了已经被证明为正确、有效的类库,提高了程序代码的可靠性,减少了程序的维护工作量;
◆ 提高了程序的标准化程度