qiaohe-1 2018-10-06 03:30 采纳率: 50%
浏览 1067
已采纳

问个java关于抽象类基础的问题?抽象类不是不能实例化吗?怎么还能通过上转型创建抽象类对象?

问个java关于抽象类基础的问题?抽象类不是不能实例化吗?怎么还能通过上转型创建抽象类对象?

flower是抽象类,Rose继承与flower
但为什么下面这样写是合法的,不是抽象类不能被实例化对象吗?
Flower flower = new Rose()
flower.bloom();

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-10-06 03:53
    关注

    我需要和你说的是,编程语言不要学得那么“累”,编程语言并不是你们学校的教学Java/C++的老师发明的。然而你们的老师的出发点就是编出各种概念和考题刁难学生。
    而实际上,Sun公司(现在被Oracle公司收购了)设计Java只是为了方便人们编写程序,编程语言也是一种产品,它需要迎合程序员,而不是刁难程序员,否则那么多语言,它怎么有市场?
    所以编程语言学习根本没有那么多概念,也不用那么累。你的整个思维方式需要扭转。
    什么“上转型”“实例化”对你来说不重要。就好比开汽车完全不用理解正时皮带,使用冰箱完全不用搞明白什么是压缩机。你需要知道编程语言的每个特性是干嘛用的,就可以了。

    继承是干嘛用的呢?你们老师肯定告诉你一堆,说来说去,继承就是为了考试做题用的!你可以把老师说的屁话忘记掉了。

    继承在现实编程中的作用是,类库的开发者定义好程序的骨架,而应用的开发者通过重写具体的方法,来自定义/改变程序的细节。就是这么简单。
    具体来说,就是类库的开发者的代码已经考虑到了某个类的结构,并且试图调用它的方法。但是具体这个类的方法怎么写,这个不确定,要留给应用开发者自己去定义或者改变。那么类库的开发者先定义好基类,并且把程序写出来(注意,这里类库的开发者只能使用基类类型)。
    而应用的开发者派生或者实现这个类,得到派生类,在派生类里写自己的代码,并且把派生类的对象传给类库。类库可以“一视同仁”地按照基类的方式调用。
    比如说,类库的作者编写了一个排序算法(比如Java的list的sort(comparer)方法,它需要一个比较器参数),为什么需要比较器?因为算法的框架是确定的,比如用冒泡排序算法,都要有两个循环、比较、交换、把小的放前面,大的放后面这些操作。但是具体来说,怎么定义谁大谁小(或者说按照什么条件排序,是按照身高、年龄还是成绩?这个萝卜青菜,各有所爱,不能写死),需要留给应用的程序员自定义。
    那么类库调用comparer基类的compareTo方法去比较。
    而如果你要按照成绩排序,你作为应用的开发者就派生一个comparer的子类,比如叫做mycomparer,给你两个人,你按照成绩比较,返回谁大谁小,那么Java类库就能排序了,排序不需要你自己写了。

    那么你说,基类需要将你的mycomparer视作comparer基类,并且调用compareTo是不是很自然的事情。换句话说,如果mycomparer不能转换为comparer,那么类库如何让应用开发者自定义排序规则,那还不是得为了每个排序规则重复写一个算法?这就好比一个不能制冷的冰箱,不是一样的么?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?