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

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

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

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

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-10-05 19:53
    关注

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

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

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

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

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

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题:按照老师上课讲的步骤写的
  • ¥20 有人会用这个工具箱吗 付fei咨询
  • ¥30 成都市武侯区住宅小区兴趣点
  • ¥15 Windows软实时
  • ¥15 自有服务器搭建网络隧道并且负载均衡
  • ¥15 opencv打开dataloader显示为nonetype
  • ¥15 MacOS 80端口外网无法访问
  • ¥50 js逆转反解密-会的来
  • ¥15 wrodpress如何调取数据库并展示
  • ¥15 python梯形积分与GPS测得位移使用卡尔曼滤波融合问题
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部