java学习笔记7--Polymorphism

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Polymorphism

多态(polymorphism)也被称为动态绑定『dynamic binding』、后绑定『late binding』或运行时绑定『run-time bingding』。

它的意思是要在程序运行的时候,根据对象的类型来决定该绑定哪个方法。多态性是继数据抽象和继续之后的,面向对象的编程语言的第三个基本特性。

绑定(binding): 将方法的调用连到方法本身

前绑定(early binding): 当绑定发生在程序运行之前时(就是由编译器或连接器负责)

后绑定(late binding): 在程序运行的时候,根据对象的类型来决定该绑定哪个方法。

“封装”(encapsulation)通过将数据的特征(characteristics)与行为(behavior)结合在一起,创建了一种新的数据类型。

“隐藏实现”(Implementation hiding)通过将细节设成private,完成了接口与实现的分离。

“多态性”是站在“class”的角度来处理这种逻辑上的分离的。

--------------------------------------------------------------------------------

Shape s = new Circle(); //upcasting: 将Circle对象upcast为Shape类型

s.draw();

Upcast(上传)就是把对象的reference 当作基类的reference 来用.(注:Java内部是知道对象属于什么类型的)

因为Derived class is a type of base class, 所以基类的reference (Shape s)能接受派生类(circle)的对象

upcast以后,基类reference 调用的都是基类自己的method (late binding),

除非这个method是late-bound的,也就是派生类覆写(override)了这个method, 才会根据对象类型选择相应的method(多态性).

以上面的代码为例:s是Shape类型的reference, 除非draw()是一个动态绑定的method(派生类circle覆写了这个draw()),

s.draw()才会调用cicle的draw(), 否则调用的都是基类Shape自己的method

private和final的method都会采用early-binding, 因为他们是不能被override的。(注:private 方法自动就是final 的)

建议别用基类的private method的名字去命名派生类的method。因为这样会让人误以为会override这个method,

实际上private自动就是final的,不能被override。

--------------------------------------------------------------------------------

override(覆写) 表示在派生类里写一个"同样"的method。 就是重新写一遍这个method

(注:1."同样"表示:同名且参数列表和返回值也相同。 2.method必须是非final, 非private的(private 方法自动就是final 的) )

overload:除了"同样"的method(即override) 以外的同名method.

--------------------------------------------------------------------------------

当你想要通过一个公共的接口来操控一组类的时候,就可以使用抽象类了。通过动态绑定机制,那些符合方法特征的派生类方法将会得到调用。

abstract class {}

抽象类的方法可以使abstract的,也可以是非abstract。派生类继续了一个abstract类,那他要么实现所有的abstract的method,要么把自己也变成abstract的。

--------------------------------------------------------------------------------

//: c07:PolyConstrUCtors.java

// Constructors and polymorphism

// don't produce what you might eXPect.

import com.bruceeckel.simpletest.*;

abstract class Glyph {

abstract void draw();

Glyph() {

System.out.println("Glyph() before draw()");

draw();//假如你new一个派生类对象,并且在基类构造函数里面调用了动态绑定的方法,

//那么它会使用那个派生类覆写后的版本。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航