我需要和你说的是,编程语言不要学得那么“累”,编程语言并不是你们学校的教学Java/C++的老师发明的。然而你们的老师的出发点就是编出各种概念和考题刁难学生。
而实际上,Sun公司(现在被Oracle公司收购了)设计Java只是为了方便人们编写程序,编程语言也是一种产品,它需要迎合程序员,而不是刁难程序员,否则那么多语言,它怎么有市场?
所以编程语言学习根本没有那么多概念,也不用那么累。你的整个思维方式需要扭转。
什么“上转型”“实例化”对你来说不重要。就好比开汽车完全不用理解正时皮带,使用冰箱完全不用搞明白什么是压缩机。你需要知道编程语言的每个特性是干嘛用的,就可以了。
继承是干嘛用的呢?你们老师肯定告诉你一堆,说来说去,继承就是为了考试做题用的!你可以把老师说的屁话忘记掉了。
继承在现实编程中的作用是,类库的开发者定义好程序的骨架,而应用的开发者通过重写具体的方法,来自定义/改变程序的细节。就是这么简单。
具体来说,就是类库的开发者的代码已经考虑到了某个类的结构,并且试图调用它的方法。但是具体这个类的方法怎么写,这个不确定,要留给应用开发者自己去定义或者改变。那么类库的开发者先定义好基类,并且把程序写出来(注意,这里类库的开发者只能使用基类类型)。
而应用的开发者派生或者实现这个类,得到派生类,在派生类里写自己的代码,并且把派生类的对象传给类库。类库可以“一视同仁”地按照基类的方式调用。
比如说,类库的作者编写了一个排序算法(比如Java的list的sort(comparer)方法,它需要一个比较器参数),为什么需要比较器?因为算法的框架是确定的,比如用冒泡排序算法,都要有两个循环、比较、交换、把小的放前面,大的放后面这些操作。但是具体来说,怎么定义谁大谁小(或者说按照什么条件排序,是按照身高、年龄还是成绩?这个萝卜青菜,各有所爱,不能写死),需要留给应用的程序员自定义。
那么类库调用comparer基类的compareTo方法去比较。
而如果你要按照成绩排序,你作为应用的开发者就派生一个comparer的子类,比如叫做mycomparer,给你两个人,你按照成绩比较,返回谁大谁小,那么Java类库就能排序了,排序不需要你自己写了。
那么你说,基类需要将你的mycomparer视作comparer基类,并且调用compareTo是不是很自然的事情。换句话说,如果mycomparer不能转换为comparer,那么类库如何让应用开发者自定义排序规则,那还不是得为了每个排序规则重复写一个算法?这就好比一个不能制冷的冰箱,不是一样的么?