这里说对象,而不说类,是因为我们总是先发现了对象,然后抽象出类的。绝不是相反的,不然很别扭,很不符合认知习惯。你要教你小孩鸟类这个概念你总不会说世界一种鸟类,有翅膀、有羽毛,会飞。看这就是鸟。你想你小孩会怎样,一脸蒙逼,但是你拿个模型呢,或者去宠物市场呢,看到一只鸟,再和你小孩讲解鸟类就容易很多。
那么两者的关系呢,个人理解从对象抽象出类,从类具象化为对象。在代码层面上先发现对象,然后定义类,然后使用对象来交互,从而形成代码。
那门如何发现对象呢,这里自己一个方法,就是找名词、找动词,这个也是我一个同事教会我的,希望对你有点帮助。
例如:有一只鸟,有羽毛、有翅膀、会飞、会吃东西
那么名词:鸟,羽毛,翅膀,
那么动词:飞、吃东西
那么就很好抽象了,鸟、羽毛、翅膀都是名词,都可能是对象,那么为什么羽毛和翅膀为什么有的人认为是属性呢,其实属性和对象很难区分,如果非要区分,我认为是作用域,这里我们研究鸟,我们将羽毛翅膀当成属性了,那天我们要详细研究了,抽象出羽毛类,那门羽毛可以认为是一个对象,注入到鸟的对象中来。
那么飞、吃东西就是行为了,就是鸟这对象的方法
再进一步,我们就抽象出了鸟类,有羽毛和翅膀属性,有飞和吃东西的方法。再进一步呢,猫有毛,猫会吃东西,共同点找到了,再抽象呢,就抽象出父类野兽了。缩小范围,会飞,是野兽吗,当然不是,不是所有的野兽都会飞。是鸟吗,可以这么说,鸟都会飞,但是只有鸟会飞吗,显然不是,飞机也会飞,蝙蝠也会飞,那么怎么理解呢,为什么不能再抽象的基础上再抽象下呢,不仅仅是抽象事务,我们抽象了行为,这就是接口的产生了,接口是行为的抽象,具体到这个例子就是飞这个动作的抽象,将这个抽象出接口,是JAVA的通用做法,当然你也可以用多继承,使用虚函数解决,这个是另外一个思路,看成是C++的解决方式了。