到目前为止,个人认为,要看懂程序(除去语法知识外),就是要明白该程序包含的重要骨干对象,明白对象的定义,以及这些对 象之间的层次结构,对象之间的逻辑关系。 有这些的文档知识,看起来就简单;没有这些方面的文档知识,只能靠自己摸索。 那什么是对象?这是一个用的比较泛滥的词汇。 面向对象里所说的对象,是一个数据结构加上多种操作; 基于对象里所说的对象,是仅是一个数据结构,没有操作。但实际上还是需要提供操作的,只是不以对象的方式体现,(以函数的方式) 这些操作可能比较分散。 举例来说,Windows中,可以认为一切设备都是对象,这是基于对象的 在UNIX 中,可以认为一切设备都是文件,这也是基于对象的。而面向对象,则可以参考Java. 对象,多态性是体现在方法上,比如C++,直接用虚拟方法(函数)直接实现类的多态,而JAVA 则是为了简单起见,直接用抽象类来代替了。我觉的,方法的虚拟是实现类多态的本质。一个方法,有相同的方法名,却有着不同的方法实现,这就实现了方法的多态,进一步的说是实现了类的多态。 对象,继承性是体现在数据结构和方法上的。C++里面有着具体的实现,比较复杂。父类和子类,父类的数据结构、子类的数据解如何初始化?父类的数据结构、子类的数据结构如何析构?等等问题,在JAVA 里面就简单化掉了。 讲了这么多,要看懂程序,无非是说明,面向过程(以函数为主),面向对象(以对象为主)的程序两者之间设计的注重点上不同的。 看懂程序所说的对象(最上段落说的对象),显然在概念上大于程序语言上的对象,但又是基于程序语言上对象这个概念。
另加2010-4-13: 面向对象和面向过程编程的区别,还体现在继承上。之前对继承的概念不是很透彻,这可能是因为受传统教育中,继承学习教育的时候的误导。老师们或者书上都是从一个具体的事情出发,比如动物,动物下面有猴子,人类;鱼啊什么的。把继承的概念通过这种类型的比喻说明,自然给我造成了理解的不透彻。父类,特别指的是父类中的一个方法,比如 void eat(){ },其实对于子类来说,没有什么意义,因为子类的吃是不同的,子类中xx要自己实现 void eat() { }。要理解继承(或者说实际中的运用),应该从下往上说。即,先说子类,把子类确定的方法移动到父类中,而在子类中去实现不确定的方法。 可以把知道的事情先理出来,然后再去确定未知的因素。 虚函数或者说虚拟类,就是一种这样实现的思路,而继承其实也可以理解成是这么的一种实现思路(通过或者也可以不通过虚拟方法,子类中hook父类的方法,父类中的方法是子类应能确定的方法,而子类的hook方法本身是不确定,得视具体子类而定。其次,还可以使用super这个指针,把一个方法内的前块或者后代码,移动到父类当中去)。 继承是类的继承,而类有数据结构和操作函数构成,上面讲了方法(函数),现在来讲数据结构。对数据结构而言,那么传统教育的例子就有意义了。父类中能存在共性的数据结构,每个子类都能拥有。比如动物,有一个布尔类型的数据结构,boolean isAlive ,相信这个对于子类来说都是有意义的。 例子:1 01 class Father {
02 /** 可以先实现,能确定的事情*/ 03 public void begin(){ 04 05 done(); 06 } 07 08 public void done(){ 09 System.out.println("I am Father"); 10 } 11 } 12 13 class Sun extends Father{ 14 15 public void done(){ 16 System.out.println("I am Sun"); 17 } 18 19 } 20 21 public class main { 22 23 public static void main(String[] args) { 24 25 Sun s= new Sun(); 26 27 s.begin(); 28 29 } 30 31 } 输出是:I am Sun 例子:2 01 interface Animal { /** 可以先实现,能确定的事情*/ 输出是:I am Father1
例子1是上下关系、例子2是平行关系实现本文中红颜色字所包含的那个意思。 |