Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是100%面向对象的吗?_Java_Oop - Fatal编程技术网

Java是100%面向对象的吗?

Java是100%面向对象的吗?,java,oop,Java,Oop,Java有原始数据类型,不像Ruby中那样从对象派生。那么,我们可以将java视为100%面向对象语言吗?另一个问题:为什么Java不以对象的方式设计原始数据类型?不。例如,Javascript就是这样 那些整数类、Long类和Boolean类是用什么编写的? 如果没有基本数组,如何编写ArrayList或HashMap?Java不是100%面向对象的。 Java可能走向99%的OO(想想自动装箱,Scala)。 我想说Java现在87%是面向对象的 为什么java不设计原始数据 类型作为对象方

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

不。例如,Javascript就是这样

那些整数类、Long类和Boolean类是用什么编写的? 如果没有基本数组,如何编写ArrayList或HashMap?

Java不是100%面向对象的。 Java可能走向99%的OO(想想自动装箱,Scala)。 我想说Java现在87%是面向对象的


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

早在90年代,就有性能方面的原因,同时Java保持向后兼容。所以他们不能把它们去掉。

当Java第一次出现(1.x版)时,JVM非常非常慢。 不将原语实现为一级对象是他们为了提高速度而采取的一种妥协,尽管我认为从长远来看这是一个非常糟糕的决定

“面向对象”对很多人来说也意味着很多事情。 您可以使用基于类的OO(C++、Java、C#),也可以使用基于原型的OO(Javascript、Lua)

100%面向对象并没有多大意义。Ruby也会遇到一些问题

Java让我烦恼的是,它没有提供有效地抽象思想的方法,没有在有问题的地方扩展语言。每当这个问题被提出时(见盖伊·斯蒂尔的《语言的成长》),“哦,不,但是乔·西斯帕克呢?”的论点就会被提出。即使你设计了一种语言,可以防止自相残杀,但偶然的复杂性和真实的复杂性之间还是有区别的(请参阅),平庸的开发人员总是会找到创造性的方式来自相残杀

例如,Perl5不是面向对象的,但它具有足够的可扩展性,允许使用一个对象系统,允许使用非常先进的技术来处理OO的复杂性。没问题

我们可以把java当作100%对象吗? 面向对象语言

没有

另一个问题:为什么java没有 将基本数据类型设计为对象 路


主要是因为性能原因,也可能是来自C++的人更熟悉。

java,因为你提到的原语,并没有使它成为纯面向对象的编程语言。然而,强制每个程序都是一个类使得它非常面向面向对象编程

正如你提到的,Ruby碰巧也是我想到的第一种语言,它没有原语,所有的值都是对象。这确实使它比Java更面向对象。另一方面,据我所知,并不要求一段代码必须与一个类相关联,Java就是这样

这就是说,Java确实有围绕原语的对象,例如
整数
布尔
字符
等等。拥有原语的原因可能是Peter在回答中给出的原因——早在90年代中期引入Java时,系统上的内存大多为两位数的兆字节,因此将每个值都作为对象是一项巨大的开销

(大,当然是相对的。我记不清确切的数字,但对象开销大约是50-100字节的内存。肯定超过了基本值所需的最小数个字节)


如今,许多台式机拥有数千GB的内存,因此对象的开销不是什么问题。

要实现100%的OO,可以考虑Smalltalk,例如,在Smalltalk中,所有东西都是对象,包括编译器本身,甚至
if
语句:
ifTrue:
是发送给布尔值的带有代码块参数的消息。

这是真正只在学术意义上重要的问题之一。Ruby经过优化,尽可能将int、long等视为原语。Java只是明确了这一点。如果Java的原语是对象,那么就会有IntPrimitive、LongPrimitive等(无论名称如何)类。如果没有特殊的方法(例如,没有IntPrimitive.factorial),它很可能是最终的。这就意味着在大多数情况下,它们都是原语。

Java显然不能消除非对象原语(
int
等)的一个原因是它不支持本机数据成员。想象一下:

class int extends object
{
    // need some data member here.  but what type?
    public native int();
    public native int plus(int x);
    // several more non-mutating methods
};
再想一想,我们知道Java维护每个对象的内部数据(锁等)。也许我们可以定义
class int
,而不使用数据成员,而是使用处理这些内部数据的本机方法

剩下的问题:常量——但这些可以类似于字符串来处理。操作符只是语法上的糖和
+
,在编译时会被映射到
plus
方法,尽管我们需要注意
int.plus(float)
返回
float
,就像
float.plus(int)
一样,等等


最终,我认为原语的合理性在于效率:确定
int
对象可以纯粹作为JVM整数值处理所需的静态分析在设计语言时可能被认为是一个太大的问题。

Java显然不是100%的OO。您可以很容易地以程序样式对其进行编程。大多数人都是这样。诚然,库和容器往往不那么宽容这种范式。

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


几年前,在Sun开发者时代,我记得James Gosling回答了这个问题。他说,他们希望完全从原语中抽象出来——只留下标准对象,但后来时间用完了,决定用他们所拥有的东西发货。非常遗憾。

否,因为它的数据类型不是对象(例如
int
byte
)。我相信Sma
#!/usr/bin/python
i = 7
print id(i)
print type(i)
print i.__str__()
6701648
<type 'int'>
7
1.class