Java有原始数据类型,不像Ruby一样从对象派生。那么我们可以认为Java是一个100%面向对象的语言吗?还有一个问题:为什么Java没有以对象的方式设计原始数据类型?
Java有原始数据类型,不像Ruby一样从对象派生。那么我们可以认为Java是一个100%面向对象的语言吗?还有一个问题:为什么Java没有以对象的方式设计原始数据类型?
当Java首次出现(版本1.x)时,JVM非常非常慢。不将基本类型实现为一等对象是他们为了速度而做出的妥协,尽管我认为从长远来看这是一个非常糟糕的决定。
“面向对象”对于不同的人意味着很多不同的事情。你可以有基于类的面向对象(C ++,Java,C#),或者你可以有基于原型的面向对象(Javascript,Lua)。
100%的面向对象并没有多大意义。Ruby也有问题,你会时不时遇到一些问题。
让我困扰的是Java没有提供有效抽象思想、在语言上解决问题的手段。每当有人提出这个问题时(参见Guy Steele的“Growing a Language”),都会被以“哦,不,乔六包怎么办?”的论点回击。即使你设计一种不会让自己踩到坑里的语言,意外的复杂性和真正的复杂性之间有区别(参见No Silver Bullet),平庸的开发人员总会找到创造性的方式来给自己挖坑。
例如,Perl 5不是面向对象的,但它具有足够的可扩展性,可以允许一个名为Moose的对象系统,以处理面向对象的复杂性。而语法糖也不是问题。
int
和byte
)。我认为Smalltalk是真正的面向对象语言,但我只有一点点使用那种语言的经验(大约五年前两个月左右)。#!/usr/bin/python
i = 7
print id(i)
print type(i)
print i.__str__()
输出:
6701648
<type 'int'>
7
所以即使是基础整数在这里也是对象。
if
语句: ifTrue:
是发送给布尔值的一个带有代码参数的消息。1.class
它会返回1的类(Fixnum,基本上是一个数字)。在Java中无法做到这一点。
100000000.class
与1000000000000000000000000.class
。区分的主要原因是Fixnum可以适应您的堆栈,而Bignum则很可能存在于您的堆中。 - C. K. YoungJava 不是100%面向对象的。Java 可能会朝着99%面向对象的方向发展(考虑自动装箱、Scala)。我认为现在 Java 已经是87%面向对象的。
为什么 Java 没有将原始数据类型设计成对象方式?
在上个世纪90年代,由于性能原因以及需要保持向后兼容性,他们无法将它们拿出来变成对象。
正如你所提到的,Java具有原始类型,这并不使它成为一种纯面向对象的编程语言。然而,要求每个程序都是一个类使其非常面向对象。
正如你提到的那样,Ruby是我想到的第一种语言,它没有原始类型,所有值都是对象。这确实使它比Java更加面向对象。另一方面,据我所知,并没有像Java那样需要将代码片段与类关联的要求。
话虽如此,Java确实有包装原始类型的对象,例如Integer
、Boolean
、Character
等。有原始类型的原因可能就是Peter回答中给出的原因——在90年代中期引入Java时,系统上的内存大多数只有两位数兆字节,因此每个值都是一个对象的开销很大。
(当然,"大"是相对的。我记不清确切的数字,但一个对象的开销大约是50-100字节的内存。明显比原始值所需的几个字节多)
如今,许多桌面计算机都拥有多个千兆字节的内存,对象的开销已经不再是问题。
为什么Java没有用对象方式设计原始数据类型?
我记得在几年前的Sun开发者大会上,James Gosling回答了这个问题。他说他们本来想完全抽象出原始数据类型 - 只留下标准对象,但后来时间不够了,只能决定使用已有的内容进行发布。非常遗憾。
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不是完全的面向对象语言,而JavaScript是(无论它是否有原始类型)。