Java是纯面向对象的吗?

21

我想知道Java是否是纯面向对象的语言,能否用例子解释一下。我已经使用谷歌搜索了,但没有找到确切的答案。


14
为了使这个问题可以回答,你需要定义“纯面向对象”的术语。 - Jon Skeet
3
我很想看到一个纯面向对象编程语言的例子。 - Alvin Wong
2
请参见https://dev59.com/U3NA5IYBdhLWcg3wZ9DU?rq=1 ... 总结:如果没有一个好的“纯面向对象”的定义,这个问题是无法回答的。 - Joachim Sauer
1
这是否相关并不重要,什么时候才是相关的呢? - Vala
3
例如在考试中。 :P - brimborium
显示剩余7条评论
4个回答

20

关于Java是否是纯面向对象语言存在许多争议。

由于Java具有包装类,因此应将其视为纯面向对象语言。您可以使用IntegerFloat等而不是intfloat等(共有八种基本类型)。

但是由于Java具有这八种基本类型,批评者会说Java不是纯面向对象的语言。


2
有人能帮我纠正一下吗? - Arun Kumar
10
"纯"面向对象是什么?你能解释一下吗?即使有封装器,它仍然有类型不是对象,但你可以毫无问题地使用它们。 - m0skit0
@Mukul Goel - 你只是从一侧(原始类型)看待问题。难道你不会考虑使用包装对象(Integer、Float等)而不是int和float来编写一个纯面向对象的Java程序吗? - Arun Kumar
@ArunKumar:是的,我会认为那个程序是纯面向对象的。但那只是其中一种情况,Java允许我们使用基本数据类型。因此,作为一种语言,Java不是纯面向对象的。 - Mukul Goel
2
你错了。 - Lightness Races in Orbit
显示剩余3条评论

15
例如,Java包含8种基本数据类型。对于一种“纯面向对象”的语言来说,所有东西都应该被看作对象,但是像int、float、char等都不是Java中的对象。
以下是一个示例:
int i = 42;
System.err.println(i.toString());

@MIkul Goel,但Java有包装类来处理这些基本数据类型,将其转换为对象..... - user1737492
1
是的,但它也支持基本类型,而纯面向对象语言则不支持。 - kjurkovic
1
是的,有些人会说我们有包装器。但是我们可以在不使用包装器(即不作为对象)的情况下使用原始数据类型。面向对象编程认为,一切都应该被视为对象。因此,没有纯粹的面向对象。 :-) - Mukul Goel
原始类型和没有函数成员toString或任何其他函数成员的类型有什么区别?例如,在C++中,对象是“存储区域”。因此,在这个定义下,整数是一个对象。什么是(明确的)对象定义? - ABu
@Peregring-lk:那类的实例怎么样? - Mukul Goel
1
@MukulGoel 不错的观点,但我认为原始类型是否是类的实例对您来说是透明的。因此,从程序员的角度来看,我看不出任何区别。我来自C++世界,具有隐式默认构造函数、隐式复制和移动构造函数/赋值运算符(POD类)以及POD子对象的类的实例与原始类型在性能上没有区别,除了这个类是一个复合类型(它需要更多的存储空间和时间来保留该存储空间)。 - ABu

9

Java是一种面向对象编程语言,但它不是纯面向对象的编程语言。 许多语言都是面向对象的。要想成为纯面向对象的编程语言,必须满足七个条件:

  • 封装/数据隐藏
  • 继承
  • 多态
  • 抽象
  • 所有预定义类型都是对象
  • 所有操作都通过向对象发送消息来执行
  • 所有用户定义的类型都是对象。

Java不是因为它支持使用原始数据类型,如int,byte,long等,这些不是对象。 与Smalltalk这样的纯面向对象语言相比,那里没有原始类型,布尔值,整数和方法都是对象。

此答案摘自http://wiki.answers.com/Q/Why_is_Java_not_a_pure_OOP_Language


1
这不是一个可信的参考,并且也没有引用其参考文献。那七个品质,谁说的? - m0skit0
1
实际上这完全不是真的答案。 - Kishan Bheemajiyani

6

没有,它有原始数据类型,因此我认为它不是完全面向对象的。 我认为Smalltalk比Java更可以被认为是纯粹的面向对象语言。

来自维基百科 Smalltalk是一种“纯粹”的面向对象编程语言,这意味着与Java和C ++不同,对象和原始类型之间没有区别。在Smalltalk中,像整数,布尔值和字符等原始值也是对象


抱歉,更/少/纯粹的面向对象并没有意义。 - m0skit0
是的,它确实如此。我指的是Smalltalk比Java更纯粹的面向对象。 - PermGenError
还是不太明白。你如何衡量“面向对象”的程度? - m0skit0
@m0skit0 谢谢你提供的信息,说实话,我以前从来没有遇到过这个问题。从维基百科上我能理解的唯一一件事是,在Smalltalk中被认为是“纯”面向对象语言,没有Java支持的原始类型,但是你可以说Java有包装器可以代替原始类型。我认为你是对的,衡量“纯”面向对象编程有点愚蠢.. :P - PermGenError
你的引用中,“对象”的定义是什么? - ABu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接