我想向大家请教个java语言本质点的一个问题,请高人帮忙解答下。
首先,java语言是一种语言,它要解决问题,首先就必须描述清问题域的对象,将其抽象成类,这是基础。
这样的话,比如我想描述猫头鹰这个对象,请问它是继承了猫实现了飞的接口呢,还是继承自鹰实现了猫的接口?这个例子可能不太恰当。
如果用对人的描述,可能会好点。很显然一个人是继承自其父母的,而Java中不允许多重继承?请问这样应该怎么描述呢?
首先,java语言是一种语言,它要解决问题,首先就必须描述清问题域的对象,将其抽象成类,这是基础。
这样的话,比如我想描述猫头鹰这个对象,请问它是继承了猫实现了飞的接口呢,还是继承自鹰实现了猫的接口?这个例子可能不太恰当。
如果用对人的描述,可能会好点。很显然一个人是继承自其父母的,而Java中不允许多重继承?请问这样应该怎么描述呢?
继承是(is-a)的关系
组合是(has-a)的关系
但不要把对象和现实中的对象硬生生的搅合在一起,那样就是钻牛角尖了.就像刚才说的为什么人只能继承一个的问题明显就是钻牛角尖了.c++就能多继承,但是这样容易引起混乱,到JAVA中所以就取消了.设计JAVA语言的时候就没有硬是要它一定符合现实逻楫..你才是思想的主宰者,不能让思想来主宰你...
huagongxiamikaidaben,Hei_Hei,ZiSheng
按照他们的解释,就能清楚点了
小孩 是人(is a )
有父母(has a)
小孩可能会长得象父母(属性),有些行为象父母(方法)(其成员变量有父母)
其实,一种思想的兴起,不只是为了迎合人们的思想,更重要的是拓展人们的思想,比如早期的面向过程的思想,还不是为了迎合人们研发,开发不太复杂的系统的思想而产生的吗?到后来,由这种思想研发,开发而系统产生了问题,从而导致面向对象的思想的兴起。我相信随着面向对象思想也会迟早被其他某某思想替换的。我不是钻牛角尖,想要解决问题,就必须首先描述清楚,不然很难确定问题域,就没法分析,也就谈不上解决了。用java解决问题,不用java描述清楚问题,就没法用java思考
尽量继承于抽象,尽量依赖于接口而不是实现。
我师傅说的,还有就是思想很重要。
其次,楼主提到了猫头鹰的问题,我觉得这肯定是要视现实情况而定的,继承的好处是可以在父类中有具体的实现,而被所有的子类所共享,但Java不允许多继承,当一个类同时拥有几个类(接口)的特征时,要用接口.而接口只是定义了一组方法的特征(方法名,参数表等),不具有任何实现,所以在每个子类中都要重新实现一遍.
所以关于楼主说的猫头鹰的问题,我觉得大体上可以这样分析:
因为猫头鹰和鹰的飞行方式不同,所以用接口来描述飞比较合适.
而因为猫的很多属性特征和猫头鹰是相同的(长的很像),所以用抽象类,然后猫头鹰继承比较合适 。关于一个人“继承"自父母,我一直认为这是语言的误导,他们应该都是Person的对象,如果非要说继承也是继承自Animal.
而只能继承自一个类,但是接口作为纯粹抽象的类,可以继承(extends)多个接口,用来实现类的多样化。
接口就像是学生上课,学生A既是体育老师的学生,又是音乐老师的学生(实现了多个接口),但是音乐老师和体育老师
直接可能根本就没联系,只是他们和类有关系而已,而一个学生就只能是一个班的学生(只能继承一个类)。
飞是一种能力,是has-a的关系,不是is-a
is-a应该继承或实现
has-a应该聚合,依赖
use-a应该关联
个人理解,继承关系必须满足is-a
从这个角度来看,儿子不应该继承父亲,儿子和父亲是has-a的关系!
如果把儿子和父亲都抽象成类,这两个类都应该继承 人 这个类,
然后父亲-->儿子是:一对多关联
儿子-->父亲是:一对一关联
(补充一下:聚合关系,合成关系都是强关联关系,依赖关系是单向的关联关系!)