什么是对象?
万事万物皆对象。
我以为这句话很精彩,因为它带有佛偈一样的色彩。
于是,不同的人理解这句话,有着不同的看法。我们并不想在这句话本身做更多的讨论,那太“宗教哲学”了。
你们看那天上的飞鸟,不稼不穑,我尚且养活它们,你们不比那飞鸟贵重得多吗?
我们在这里至少看到了飞鸟就是一个对象,而在我们的世界中,充满了各式各样的对象,人,飞鸟,百合花。
齿轮,轴承,阀。桌椅,鼠标,液晶显示器,等等。
我们认知世界是从具体到抽象的。
如果只是把看得见,摸得着的东西定义为对象,那么这未免太简单了。
一个过程,一个办法,一个概念也可以是对象。【1】我们的认识总是从具体到抽象的。
至于,一个对象是具体的,还是抽象的,我想这是一个哲学问题,也许取决于每一个人对一个事物的认识程度罢。
【1】我是这样想的,例如C++的仿函数,当我们用一个类来刻画一个函数的时候,就有些抽象了,以致于初学者总是有感费解。
对象有其类型
我们不得不先诠释类型的概念。
这里,变量a的类型是int,那么它的类型就是int。当我们要表征数量,偏移,年份等这样的信息的时候,int类型的量就可以完成描述了。
而一个矩形呢?它的类型是什么呢?
我们知道在C语言里面采用struct关键字来描述这样的类型。
{
int x;
int y;
};
struct Point p1;
struct Point p2;
p1.x = 0;
p1.y = 0;
p2.x = 0;
p2.y = 1;
Point 就是我们自定义的类型了,那么这个类型的变量,我们就可以称为是一个Point 类型的对象了。
在上面的代码中,我们说Point 是类型,而p1和p2是Point类型的两个实例。
对象和类
初学者常常对语言中的static成员感到疑惑,于是我们讲解一下static关键字的面向对象的意义。这个static已经不是C语言中的static了。看如下代码:
{
static int count;
int x;
int y;
}
这里,我们有三个成员,其中,count被冠以static关键字。那么它与成员x,y就有了非常大的差别了,我们称count是类成员,而x和y是对象 成员。count成员不属于某一个对象,它不是某一个对象的属性,而是属于整个类的。例如,在一个二维平面上,有若干个点,那么每一个点就是一个Point类的实例对 象,它们有自己的坐标,一个点的x值(横坐标),和另外一个点的x值是两个不同的量(尽管它们的值可能相等),而这个平面上点的数量(值)只有一个,就是Point实例的个数,并且,这个数量不是某一个Point实例的属性,而是表达整个Point类的某一种属性。
【2】对于C++的程序员来说,类成员往往被直接翻译为静态成员了,但是,这似乎不能直观地反映它的意义。
在这个系列的专题中,请大家注意对象 这个词,有时候,它可能强调对象的类型的概念,有时候则表达对象实例的含义,而有时候则含有这两重意思,读者要仔细辨析和体会。但是初学者,还是要注意区分类型和实例之间的关系。
【3】在 这个系列的专题中,我尽量采用C++和Java代码作为例子,而且会忽略其中的一些语法要素,比如是private还是public,是int,还是 Integer。并且还有可能用C#,JavaScript,Ruby的代码作为例子。但是大家能体会到代码所表达的意义即可,不必深究其中的语法细节。而在某个议题上,也许用C++来表达能达到更好的效果,届时我会指明那是C++的代码的。