(希望能以中国人的思维去讲解,去理解;或者不够深刻,或者不够全面,或者错误连篇;欢迎大家一起讨论,共同进步---JobBird)
大学的时候学了C跟C++,那时候的认识就是两种不同语法的编程语言;出来工作之后,偶尔会用到C++或者JAVA写一些小的测试程序,觉得两种语言最难逾越的是一种思想的转变,这也算是一种进步吧。思想的转变是很难很难的。到后来有很长一段时间接触JAVA跟Android,一直很苦恼不得面向对象的精髓,总是用着面向过程的思想去生搬硬套面向对象的语法,吾将上下而求索,从百度到google,总是不得要领。导致工作效率很低。不过最终还是入门了面向对象,开博与广大码农交流分享。
面向过程跟面向对象的区别,网上搜索一大堆结果,具体内容就不详述了。在这里,只限定一个从C转向JAVA的码农的角度来理解,阐释什么是面向对象,可能只会与C程序员产生共鸣吧。先列举一二什么是面向对象容易混淆的概念:
一、面向对象跟具体的某种语言对应起来:一开始,我总把面向对象跟C++对应起来,强迫自己认为C++就是等于面向对象;
二、面向对象跟内存管理关联起来:觉得面向对象就是可以不管内存回收的C程序而已;
三、类就是C语言包含函数指针的结构体:类包含了方法和属性其实跟C语言的结构体是那么的相像,类能够做的,其实结构体也能够做;
综上,很长一段时间我都是用着面向过程的思想来使用面向对象的语法。因为思想跟行为是冲突的,所以用起来是很痛苦,简直就是惨!!!
面向过程是怎样的呢?
从main函数开始,第一步做什么,然后做什么,在哪里等待某件事的发生,然后再做什么!是以程序员为中心,程序员想干嘛,系统就给他提供什么,这很好理解的。
面向对象是怎样的呢?
系统先创建一个对象,然后再创建许许多多的对象,对象之间相互配合,然后完成一件事。是以对象为中心。
以上的区别,其实是看不出来有什么区别。如果是程序员怎么区分呢?程序员看代码,看面向过程的时候,当前活动的永远是一条正在执行的指令,没有一个抽象的概念,你可以抽象为一个函数,抽象为一个功能模块,最高抽象为一个功能模块;看面向对象的时候,永远抽象为一个对象,当前活动的永远把一个对象作为一个整体来看待;对象跟功能模块的区别,在代码的写法上可能就是有一些成员变量,但是实际上把数据生硬初始化成每调用一次模块就有一块独立的数据也是可以的。为了更好理解,就当成面向过程站在你面前的永远只是一条指令,面向对象站在你面前的永远是一个对象。
有了以上的概念,阅读面向对象的代码的时候,就会轻松很多,但是还有个问题,面向过程的运行过程,我很容易跟踪,就找当前运行的代码段,代码运行有先来后到,后面的代码肯定是后运行的;但是面向对象,每个对象都是独立的,他们都站在系统前台,而且,面向对象的技术层面的原因,它不会显式告诉你哪个对象消亡了,那么对于码农来说,哪个对象当前是活跃的?是活着的?我们这里建立一个新的概念,叫做前台对象,就是说站在你面前的永远只有一个对象,而且必须有一个对象,这个前台对象通常是负责UI响应的,然后用户通过这个UI对象,获得一些功能,至于这个UI对象在下面会创建别的什么对象来帮助它完成工作,那就是它的事情。至于对象怎么消失,完全不用我们管。相当于不怕内存泄漏。
有了以上两个概念,阅读面向对象的程序,或者写程序都会轻松不少。再来讲解两个概念,一个是继承,继承其实是语言规范层面的问题了,就把它想象成隐藏功能就好了;另外一个是面向对象的多线程概念,究竟是线程属于对象,还是对象是属于线程?线程可以理解成另外一个运行环境,跟创建线程的环境是平行的,里面也可以包含很多对象,但是对于整个系统来说,前台对象还是只有一个,前台对象所在的线程称之为前台线程。
就这么多了,欢迎大家指正错误!