Java和Ruby:“;一切都是一个对象;在OO中?

Java和Ruby:“;一切都是一个对象;在OO中?,java,ruby,object,Java,Ruby,Object,Java中的一切都是对象吗,就像Ruby中的一样 书籍、教程、everything都声明“Ruby中的一切都是对象”,但这在面向对象语言中常见吗 所有东西都是Java对象吗,或者说面向对象只是一种编程范例,这并不意味着所有东西都是对象或计算结果都是对象吗 就值而言,Java中的“基元类型”(int、bool、float等)不是对象。在Ruby中,它们是对象。(在一些Ruby实现中,fixNum在内部是用于性能的“值类型”,但在外部,它们可以被视为具有方法的“真实”对象) 此外,还有一些Ruby中

Java中的一切都是对象吗,就像Ruby中的一样

书籍、教程、everything都声明“Ruby中的一切都是对象”,但这在面向对象语言中常见吗

所有东西都是Java对象吗,或者说面向对象只是一种编程范例,这并不意味着所有东西都是对象或计算结果都是对象吗

就值而言,Java中的“基元类型”(
int
bool
float
等)不是对象。在Ruby中,它们是对象。(在一些Ruby实现中,fixNum在内部是用于性能的“值类型”,但在外部,它们可以被视为具有方法的“真实”对象)

此外,还有一些Ruby中的对象不是Java中的对象,比如类。(实际上,Java也将它们公开为
,但意义不同。)

有些东西在两种语言中都不是对象,比如变量和方法。(尽管在Ruby中很容易获得表示给定方法的对象。)

无论如何,我认为更大的图景是,它提供了一种对数据进行分组和对所述数据进行操作的方法。(这通常是通过实例方法完成的,如Java和Ruby,但也可以通过多种分派和其他语言完成,如Haskell(非OO)提供了完成此任务的替代方法。)


通常情况下,“OO”的定义还包括“继承”、“封装”、“抽象”和其他愚蠢的教科书术语,但不同“OO”语言的用法和模式可能会有很大差异,并与“非OO”语言中的用法和模式重叠;-)

FWIW不是Ruby中的所有东西都是对象,而是值。像“如果”这样的东西不是。“面向对象”似乎有很多含义,因为有人问,或者更多。奇怪的是,早在1987年,Peter Wegner就在OOPSLA中对其进行了非常精确的定义。方法是一种对象:
Object.instance\u method(:to\s)
。例如:
Object.instance\u方法(:to_s).bind([]).call
[]不同。to_s
即使两者都在
[]
上调用
to_s
方法。虽然我不完全确定这是否真的“算作”提供的方法是对象,也许只是它们可以是对象。@AndrewMarshall确实如此。在Ruby中,方法可以很容易地用对象表示,并且
实例\u方法
获取表示给定类的消息
:to\s
的方法对象。。。但是,我不知道这些天不同的实现是如何工作的,也不知道这些方法是如何在内部处理的。(Ruby的这一方面--“消息传递”--与JavaScript或Python形成对比,在JavaScript或Python中,方法实际上是第一类函数对象,在被调用之前被解析。)是的,当然还有Java,在Java中,方法永远不能被视为对象,因此,相反,你有一些奇怪的东西,比如包含方法的匿名类(通常对给定的上下文有名称要求)。我个人认为Java的匿名类是lambdas的可怕替代品。@AndrewMarshall我将用“我尽力避免Java”;-)@Andrewgrim“原语”,如Java中的
int
bool
,根本没有方法;有相应的非基本换行类型,如
Integer
Boolean
,可以这样做。在C#中,“值类型”(包括
int
bool
)仍然可以有方法,并且仍然派生自
对象
,尽管它们与“引用类型”对应物有局限性和不同的语义。C#或Java都不支持添加到现有对象中的“expando”(或单例方法)。(尽管JVM/CLR运行时中的动态字节码操作/创建具有强大的魔力。)