Java具有原始数据类型,它不像Ruby中的对象派生.那么我们可以将Java视为100%面向对象的语言吗?另一个问题:为什么Java没有设计原始数据类型的对象方式?
当Java首次出现时(版本1.x),JVM真的非常慢.不将原语作为一等对象实现是他们为速度目的所采取的妥协,尽管我认为从长远来看这是一个非常糟糕的决定.
"面向对象"对许多人来说也意味着很多东西.你可以拥有基于类的OO(C++,Java,C#),或者你可以拥有基于原型的OO(Javascript,Lua).
100%面向对象并不意味着太多,真的.Ruby也会遇到你不时会遇到的问题.
让我困扰Java的是它没有提供有效抽象思想的方法,而是将语言扩展到有问题的地方.每当提出这个问题时(参见Guy Steele的"成长语言"),"哦,不,但Joe Sixpack怎么样?" 给出了论证.即使你设计的语言可以防止自己在脚下射击,但是偶然的复杂性和真正的复杂性之间存在差异(参见No Silver Bullet),而平庸的开发人员总是会找到创造性的方式来拍摄自己.
例如,Perl 5不是面向对象的,但它足够可扩展,它允许Moose,一个允许非常先进的技术来处理OO复杂性的对象系统.和语法糖是没有问题的.
不,因为它的数据类型不是对象(例如int
和byte
).我相信Smalltalk是真正面向对象的,但我对这种语言只有一点经验(约五年前大约两个月).
我也听过Ruby人群的说法,但我对这种语言没有经验.
当然,这是使用"真正的OO"的定义,这意味着它只有对象而没有其他类型.其他人可能不同意这个定义.
看来,经过对Python的一些研究(我不知道名字/对象的区别,尽管已经编写了一年左右的时间 - 我猜的更加愚弄我),它确实可能真的是OO.
以下代码工作正常:
#!/usr/bin/python i = 7 print id(i) print type(i) print i.__str__()
输出:
67016487
所以即使是基本整数也是这里的对象.
要实现真正的100%OO认为Smalltalk,例如,一切都是对象,包括编译器本身,甚至if
语句:ifTrue:
是一个带有代码块参数的布尔消息.
问题在于,面向对象的定义并不是很明确,可能意味着很多事情.本文将更详细地解释该问题:http: //www.paulgraham.com/reesoo.html
此外,Alan Kay(Smalltalk的发明者和"面向对象"这一术语的作者(?))着名地说,在考虑OOP时他没有考虑过C++.所以我认为这也适用于Java.
语言完全是OO(无论那意味着什么)是可取的,因为它意味着更好的正交性,这是一件好事.但鉴于Java在其他方面无论如何都不是非常正交,其OO不完整性的一小部分在实践中可能无关紧要.
Java不是100%OO.Java可能会达到99%的OO(想想自动装箱,Scala).我想说Java现在是87%的OO.
为什么java不将原始数据类型设计为对象方式?
早在90年代就有性能原因,同时Java保持向后兼容.所以他们不能把它们拿出来.
不,Java不是,因为它具有原始数据类型,它们与对象不同(它们没有方法,实例变量等).另一方面,Ruby完全是OOP.一切都是对象.我可以做这个:
1.class
它将返回1的类(Fixnum,基本上是一个数字).你不能用Java做到这一点.