qiaohe-1
2018-10-06 03:30
采纳率: 27.3%
浏览 1.0k
已采纳

问个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,那么类库如何让应用开发者自定义排序规则,那还不是得为了每个排序规则重复写一个算法?这就好比一个不能制冷的冰箱,不是一样的么?

    打赏 评论
  • threenewbee 2018-10-06 03:36

    Rose()不是抽象类,所以可以new
    new才是“实例化”
    =类型,这个不是。

    如果派生类不能转换为抽象类类型,那么我问你,为什么要继承?
    就好比我们不管电冰箱如何制冷,我就问你一个简单的问题,如果冰箱不能制冷,你为什么要用电冰箱?

    打赏 评论

相关推荐 更多相似问题