使用Java或C++;缺少OO特性吗? 我对以更为学术和抽象的方式理解面向对象编程有兴趣,我想知道是否有任何面向对象的概念,java和C++无法实现。

使用Java或C++;缺少OO特性吗? 我对以更为学术和抽象的方式理解面向对象编程有兴趣,我想知道是否有任何面向对象的概念,java和C++无法实现。,java,c++,oop,Java,C++,Oop,我意识到这两种语言都不是“纯”的OO,但我感兴趣的是它们缺少什么(如果有的话),而不是它们有什么额外的东西。Java没有多重继承,但有些人可能会说这更像是一种幸事,因为它需要用户考虑正确的体系结构。您可以使用接口和抽象类来解决这个问题 多重继承因其在某些语言,特别是C++中引起的以下问题而受到批评: 语义歧义常被概括 作为第一个 无法显式继承 从一个类中多次 继承顺序改变类 语义学 java和C++都允许程序化编程。对于某些人来说,这可能是一个负号。Java:基本类型不是对象。在中,术语“

我意识到这两种语言都不是“纯”的OO,但我感兴趣的是它们缺少什么(如果有的话),而不是它们有什么额外的东西。

Java没有多重继承,但有些人可能会说这更像是一种幸事,因为它需要用户考虑正确的体系结构。您可以使用接口和抽象类来解决这个问题

多重继承因其在某些语言,特别是C++中引起的以下问题而受到批评:

  • 语义歧义常被概括 作为第一个
  • 无法显式继承 从一个类中多次
  • 继承顺序改变类 语义学

java和C++都允许程序化编程。对于某些人来说,这可能是一个负号。

Java:基本类型不是对象。

在中,术语“面向对象”的发明者:

对我来说,OOP只意味着本地消息传递 保留、保护和隐藏 状态过程,以及极端 所有东西的后期装订。可能是 用Smalltalk和LISP完成。那里 可能还有其他系统 这是可能的,但我不知道 他们

C++明显地失败了“极端迟绑定”准则,java和C++都由于其严格的类/方法结构而失效了“消息传递”准则。据我所知,Kay的概念认为具有特定名称和签名的方法是实现消息处理程序的方便方法,但决不是唯一的方法

同一封电子邮件中的其他有趣声明:

我不喜欢Simula我或 Simula 67没有继承[…]所以我 决定把继承权作为一种遗产 内置功能,直到我理解它 更好

“多态性”一词是强加的 很久以后(我想是彼得·韦格纳写的) 它不是很有效,因为它实际上来自函数的命名法,我想要的不仅仅是函数


与java和C++中基于类的系统不同,还有一种面向对象编程的思维方式。JavaScript使用基于原型的编程。如果你想了解OOP风格的全貌,可能值得一看:

两者都区分了原语和对象,因此都不是纯面向对象的。

我想说:

  • a
  • 能够对本机类型进行子类化(我不知道这有一个名称,因为我知道相对较少的OO语言不允许这样做)

大多数解释语言都满足后期绑定要求。在Perl中,您可以从数据库表中提取代码,将其放入解释器,然后实例化刚刚引入程序的新类的对象


Python是否完全符合Kay对OOP的定义?我没有用Python做足够的工作来确定。我怀疑不是,因为Python的“本机类型”不是对象。

面向对象编程最重要的一个特性是封装。隐藏实现细节显然是编写可维护代码的关键

C++中,因为你有不受控制的指针,所以一个写得很差的对象可能会对另一个对象做字面上的任何事情。这意味着封装被破坏,很难找到bug

Java没有这个问题,但它缺乏基本的常量。这不是一个严格的面向对象的理论特征,但是它能够声明一个方法是只读的,或者对象是只读的,C++中的一个奇妙的可靠性增强器不是java。

最后,java的模板机制是C++的苍白模仿。不能参数化类对Java来说是一个巨大的损失


因为Java不支持指向方法的指针,而且反射速度太慢,所以当函数指针可以使用时,它会强制使用许多小对象。有些人可能会认为这是一件好事。

这就意味着你要用“OO”来解释你的意思。我认为关键在于OP不知道它的意思,想要什么东西能扩大心智。这不是一个缺乏的特征,而是一种语言设计特质。调用bug缺失的特征:)你不能在C++中编写<代码>类Myint:public int /Cuth>。无论如何,如果您想编译它,就不需要了。如果您愿意,可以将其视为一个多根层次结构。:)至少从Java1.5开始,就有了自动装箱功能,可以轻松地将例如int-primative与Integer对象交换。我同意这一点,但从最严格的意义上讲,它阻止了java成为一种完全面向对象的语言。java不是也不符合前一个标准吗?这里一个重要的词是“所有”事物。例如,在Smalltalk-71中,语法是后期绑定的。在后来的语言版本中,Smalltalk实际上变得更加静态,这就是为什么Alan Kay想用一种全新的方法重新开始。事实上,Smalltalk-76及其以后的版本不再是由他设计的,它们也没有完全体现他的OOP愿景,它们的继任者,如Ruby,也没有完全体现他的OOP愿景。他目前正在研究的语言比Smalltalk或Lisp更具后期性和动态性,事实上,即使是“后期绑定”的定义本身也是后期绑定的。@Jörg W Mittag:听起来有点酷。那门语言叫什么名字?@fructedWithForms设计师:我想它还没有名字。你可以在Alan Kay创立的研究所找到一些信息:而且,就像Smalltalk一样,它不仅仅是一种语言,它是一个完整的个人计算系统,包括操作系统、驱动程序、图形用户界面、语言、编译器、办公套件、桌面发布、网络等等。。。A.