面向对象
客观上来说,程序员很缺“对象”,哈哈。
言归正传,什么是面向对象?对象是什么呢?
对象,也可以被称为一个存在的实体,他拥有自己特有的属性和行为,比如你自身,就是一个对象 ,比如你眼前的这个电脑,灰尘,细菌,原子….
对象不论大小,不受困于空间,他是客观存在的,具有物质性。
现实世界是由无数个基本粒子组成的,代码的世界是由无数个对象组成的,只要能被看作一个单独的个体,它就能被看作一个对象。
面向对象起源于计算机,但这种思想已经超脱于计算机,以前我们分析一个问题是去分析一个问题的具体流程与前后因果,但这种思维的局限性在于复杂,一个复杂的问题它的逻辑很长。于是,我们就想着如何能将一个问题简化,我们想:
既然问题里他们才是主角,为什么不能让他们解决问题?面向对象思想这样起源。
我们来看这样一个题目:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,易知第一个月为1对,第二个月为1对,三个月为2对,第四个月为3对,.第四个月为5对,设x个月的兔子总数为n对,求出n。
思路一:
找到其中的数学关系,n表示月份,T(n)表示兔子数量;
T(n)=T(n-1)+T(n-2);
这是一道斐波那契的典型例题,但你可能一开始并没有发现这个关系。
思路二:
把每对兔子当作一个对象。每个对象都有一个方法:每长到第三个月及以上,就生一对兔子。
每对兔子之间是独立的,这样我们只需要一个循环得到答案。
private int month;
public Rab() {
flag++;
this.month=1;
}
public Rab grow() {
month++;
if(month>=3) {
return new Rab();
}
else
return null;
}
比较两个思路:思路二在思维上更显简单顺畅,这也是面向对象考虑的一种形式,思路一则需要动动脑子。
为什么思路二比思路一来的更加自然简单?
当我们把兔子看作对象,它有了自己的属性(month)和方法(grow),于此,在解决问题时,我们只需要根据问题要求准确调用它的方法,而这些都是显而易见不需要你去推测的,仿佛他们就是一个个可以独立的物种,你就是制作规则的上帝,他们只需要按照规则进行演变即可,最终你就能得到答案——问题要求是规则,问题客体是对象,对象遵循规则演变,问题得到解决,这就是面向对象解决问题的思路。
这样看来,其实上帝就是一个伟大的Coder,他创建了人,山川········这些个类,世间万事万物都是独立的对象,上帝从来不告诉你该怎么做,因为你自己知道该怎么做,上帝唯一要做的只有制定规则,我们遵循规则,或许这就是自然的演变。
或许,以后的以后,代码世界的对象也可以发生变异,天方夜谭也会是不久后的现实。