Java 100%面向对象吗?

Sil*_*ior 12 java oop

Java具有原始数据类型,它不像Ruby中的对象派生.那么我们可以将Java视为100%面向对象的语言吗?另一个问题:为什么Java没有设计原始数据类型的对象方式?

Ale*_*lcu 29

当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复杂性的对象系统.和语法糖是没有问题的.


pax*_*blo 19

不,因为它的数据类型不是对象(例如intbyte).我相信Smalltalk是真正面向对象的,但我对这种语言只有一点经验(约五年前大约两个月).

我也听过Ruby人群的说法,但我对这种语言没有经验.

当然,这是使用"真正的OO"的定义,这意味着它只有对象而没有其他类型.其他人可能不同意这个定义.


看来,经过对Python的一些研究(我不知道名字/对象的区别,尽管已经编写了一年左右的时间 - 我猜的更加愚弄我),它确实可能真的是OO.

以下代码工作正常:

#!/usr/bin/python
i = 7
print id(i)
print type(i)
print i.__str__()
Run Code Online (Sandbox Code Playgroud)

输出:

6701648
<type 'int'>
7
Run Code Online (Sandbox Code Playgroud)

所以即使是基本整数也是这里的对象.

  • @donut,这可能是因为True是绑定到真实对象的名称.如果需要,可以将其重新绑定到false对象.不幸的是你似乎无法用'True = True'将它绑定回来,虽然你可以做'True = not True'来创建一个新的真实对象(该死的你是虐待狂). (3认同)
  • 你可以在Python中做'True = False',它确实改变了True的值.但我不能以同样的方式搞乱整数.在某人的代码中坚持约5分钟可能会很有趣. (2认同)

Rem*_*anu 14

要实现真正的100%OO认为Smalltalk,例如,一切都是对象,包括编译器本身,甚至if语句:ifTrue:是一个带有代码块参数的布尔消息.


J S*_*J S 6

问题在于,面向对象的定义并不是很明确,可能意味着很多事情.本文将更详细地解释该问题:http: //www.paulgraham.com/reesoo.html

此外,Alan Kay(Smalltalk的发明者和"面向对象"这一术语的作者(?))着名地说,在考虑OOP时他没有考虑过C++.所以我认为这也适用于Java.

语言完全是OO(无论那意味着什么)是可取的,因为它意味着更好的正交性,这是一件好事.但鉴于Java在其他方面无论如何都不是非常正交,其OO不完整性的一小部分在实践中可能无关紧要.


Pet*_*Mmm 5

Java不是100%OO.Java可能会达到99%的OO(想想自动装箱,Scala).我想说Java现在是87%的OO.

为什么java不将原始数据类型设计为对象方式?

早在90年代就有性能原因,同时Java保持向后兼容.所以他们不能把它们拿出来.

  • 87%?让我想起:http://dilbert.com/strips/comic/2008-05-08/ (5认同)
  • 但他们错了!Java显然是88.4%的OO. (3认同)
  • 我很高兴听到你有确切的数字. (2认同)
  • 抱怨这个答案的人只是无知.Sun Java 6u15是87.0%+/ - 0.2%OO. (2认同)

小智 5

不,Java不是,因为它具有原始数据类型,它们与对象不同(它们没有方法,实例变量等).另一方面,Ruby完全是OOP.一切都是对象.我可以做这个:

1.class
Run Code Online (Sandbox Code Playgroud)

它将返回1的类(Fixnum,基本上是一个数字).你不能用Java做到这一点.