黑马程序员技术交流社区

标题: 抽象类和接口不能创建对象的根本原因是什么? [打印本页]

作者: Shimano    时间: 2014-6-24 18:11
标题: 抽象类和接口不能创建对象的根本原因是什么?
本帖最后由 Shimano 于 2014-6-26 09:33 编辑

好多地方都说,抽象类不能实例化对象是因为抽象类中有抽象方法,调用抽象方法没有意义。起初没有认真思考,回头再看,个人觉得这种解释感觉非常牵强。

因为抽象类中,抽象方法是可有可无的。那么没有抽象方法的抽象类不能实例化对象的原因是什么呢?

另外,接口不能实例化对象,是因为接口内所有方法都是抽象的,所以调用没有方法体的方法是没有意义的,这种解释还算合理。但是我猜想也不是根本原因吧?

我不是钻牛角尖,只是想确认一下别人的有些说法是不是不准确?我的这种疑问是不是都有存在?
望了解的人给予解释......


作者: 我为你着迷    时间: 2014-6-24 18:28
哥们你这个问题好难啊  我都不知道怎么回答  这就跟你为什么叫张三而不叫李四一样  我觉得这就是java的底层运算机制导致的吧  抽象类抽象类 都是抽象的啦  你还创建对象去给它实例化 这有什么意义吗 没意义  
作者: dispensable    时间: 2014-6-24 19:30
- -我知道含有abstract关键字的类都不能被实例化,为什么?你先想想为什么会有抽象类?抽象类的出发点是为了提供一套模板,一种规范,是提供给其他类遵守的,而不是用来直接使用,如果它可以实例成对象来使用,那还要它干嘛?跟普通类还有区别吗?所以我不去纠结
作者: Shimano    时间: 2014-6-24 19:48
dispensable 发表于 2014-6-24 19:30
- -我知道含有abstract关键字的类都不能被实例化,为什么?你先想想为什么会有抽象类?抽象类的出发点是为 ...

我也能理解你说的,就是不能接受一些人阐述一些不严密的解释,感觉如果相信了,会被误导的,
比如说:“抽象类不能实例化对象是因为抽象类中有抽象方法”,这样说的人还不少,即便我不明白原因,也不想接受一些错误的说法.....
作者: Alan_Kwan    时间: 2014-6-24 20:06
抽象类不能实例化对象不是因为抽象类中有抽象方法,而是因为JAVA中用abstract修饰符修饰的类是设定为不能实例化的。
作者: endian11    时间: 2014-6-24 20:40
这是java规定的,抽象类跟接口都没有方法实现,如果实例化的话,调用抽象类或接口的方法,没办法执行的啊,会出错的嘛
作者: 格子、    时间: 2014-6-24 20:42
楼主的疑问其实之前我也想过,而且怎么看别人的解释,就是转不过这弯来,不过带着疑问去学习也会收获很多!!!下面跟楼主说一下我的理解哈,有什么说的不对的请指正:
1.java是跨平台的语言,所有的程序的运行都是基于JVM虚拟机的,所以想被JVM识别,java就规定的一些规则,以规范使用。
2.关键字其实就是Java中定义的规则,你要用就必须遵守我的规则,abstract也是一样。
3.至于abstract修饰的类不能创建对象,可以这么理解,对象是具体的东西,被abstract一修饰就成抽象的事物了,没办法具体的声明了,只有抽象模糊的描述,所以就有了抽象类,自然就不能创造对象了。
4.编程语言玩的就是规则,我们最好先把这些规则玩熟了,玩烂了,再去研究为什么要制定这种规则,等都明白了,说不定我们也可以给他制定规则了呢!!!
作者: 李小然    时间: 2014-6-25 23:13
在我们学习基础的过程中,老师是按照顺序给你讲的。
这其实给我们造成一种误解:
先有写一个接口(抽象类),然后想着怎么实现,才会有为什么不能实例化这样的问题。

实际上,在开发过程中,这完全是本末倒置了。给你一个任务,鸡鸭猫狗都有叫唤的方法,你准备每个类都要写一个方法吗?
当然不是,编程一个重要原则就是避免重复。
所以你要“抽象”,啥叫抽象? 抽象 = 抽出像的部分

那就要抽出一个有“叫唤”这个方法的接口
然后让自己的类都来重写这个方法。

所以,接口(抽象类)是抽象出来的,是后面设计出来的。

他们的根本作用其实就是在限制类必须实现某个方法,提醒自己、也是在告诉别人,
我的类就是有这样的方法,你完全可以理解成为一种逻辑上的方法声明。

看完作用,相信你能明白为什么接口(抽象类)不能实例化,
因为它出现的目的和作用和实例化就根本不沾边。

作者: Shimano    时间: 2014-6-26 09:32
李小然 发表于 2014-6-25 23:13
在我们学习基础的过程中,老师是按照顺序给你讲的。
这其实给我们造成一种误解:
先有写一个接口(抽象类) ...

恩,对的!如果开始讲的时候能多少渗透一点这些知识,就不会至于有疑问甚至钻牛角尖了.....
作者: 面向大众    时间: 2014-6-26 11:20
Java8里面接口也能写实体方法了...所以确实是别人制定的游戏规则我们玩....
作者: 淡淡柠檬茶    时间: 2014-6-26 16:59
路过踩踩。。。。
作者: 帅哥哥    时间: 2014-6-26 17:21
因为我们不想让别人创建对象啊,你的先后顺序搞错了,不是因为有了抽象类所以不能创建对象,而是因为我们不想让它能创建对象所以有了抽象类
作者: 尹兆国    时间: 2014-6-26 19:25
我为你着迷 发表于 2014-6-24 18:28
哥们你这个问题好难啊  我都不知道怎么回答  这就跟你为什么叫张三而不叫李四一样  我觉得这就是java的底层 ...

接口的存在,是为了定义一些公共的规则,包含常量和抽象方法,别无它用
作者: 劇情侢媄終究媞    时间: 2014-6-26 20:33
抽象类中的抽象方法是没有任何功能的.假如能实例化抽像类的对象的话.那么你调用的抽象方法有何意义?
作者: rekirt    时间: 2014-6-26 21:03
其实你就是喜欢钻牛角尖,你说什么我们要把电视定义为电视,而不说空调呢,,
作者: 沐子松/kf    时间: 2014-6-26 21:18
学习                
作者: 郑飞    时间: 2014-6-27 11:24
Shimano 发表于 2014-6-26 09:32
恩,对的!如果开始讲的时候能多少渗透一点这些知识,就不会至于有疑问甚至钻牛角尖了..... ...

老师讲课不可能讲那么细节的 时间不够 我们也学不过来那么多东西 所以还是按套路 怀着尽信书不如无书的心 先好好学




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2