看过一些书,关于类的继承的描述似乎总是只强调"继承",而不强调"扩展"。
继承的关键字是extends,extends就是扩展的意思,也就是说,外国创造者在创造这一个概念的时候就是把它当成扩展来看待的。我个人也认为把extends翻译成扩展更准确,因为从逻辑上来讲,扩展其实包括了继承,但继承不包括扩展。普遍的书籍认为:继承就是子类继承了父类某些属性和方法,说白了就是爸爸的财产给了儿子。个人认为这种说法不够准确,至少会给很多初学者(我就是其中之一)造成一个误解:那就是子类在创建了对象之后会自动的添加从父类继承来的属性到子类对象,之后那些属性和方法就永远属于子类对象了,好比爸爸的财产划到儿子银行账号下,从此那些财产就是儿子的了.实际上这种观点是错误的,从底层内存的机制来说,子类对象继承了父类对象之后,那些被继承的属性和方法仍然属于父类对象,只是允许子类对象调用父类的那些属性和方法而已,爸爸的财产并没有给了儿子,只是允许儿子需要使用的时候使用而已,并没有划到儿子的银行帐下。
那么就产生一个疑问,我只创建了子类对象,没有创建父类对象,为什么说子类继承的“财产”仍然属于父类呢?事实上,系统在创建子类对象时候会自动隐式地由上至下先创建父类对象,再创建子类对象,表面上只创建了一个对象,其实创建了两个或更多的对象(自顶向下,Object也会被创建)。因此,从底层物理内存角度来讲,继承其实就是组合,让父类对象和子类对象通过指针关联在一起。从高层逻辑意义来讲,所谓的"继承"应该是扩展,我可以在需要的时候使用爸爸的财产,自己又创造了一笔财富。这一点很多负责任的作者在书上都有讲,一些烂书则很少提及。
用一句话来总结继承:继承并不是将父类的属性和方法添加到子类,而是允许子类调用父类的某些属性和方法而已,在内存里面,没有继承!