面向对象语言和非面向对象语言之间有什么区别?

时间:2009-12-12 21:39:57

标签: java c oop

我一直在听说C是一种非面向对象的语言,以及java是一种面向对象的语言。我想知道区别是什么?

11 个答案:

答案 0 :(得分:36)

哇,很多大的OOP条款被抛到这个家伙身边。作为一个从程序编程开始并且现在主要做OOP的人,这在概念上是我如何看待差异(没有所有重要术语):

在C中,你有一些可以保持状态的结构。它们看起来像对象,例如,您可以拥有一个名为Car的结构并创建Cars实例并设置其制作,模型和颜色字段。但是,您无法告诉Car结构实例执行任何操作。相反,如果你想洗车,你必须将汽车实例传递给一些外部功能:

WashMyCar(myCar);

OOP语言使用与名为Classes的结构不同的概念,对象是这些类的实例。暂时忘掉那些大字继承和多态(这些是更高级的主题,一旦你得到类)。试想一下汽车的例子吧。例如,在Java中,您可以定义一个名为Car的类:

public class Car {
  String make;
  String model;
  String color;
}

然后,你就像这样制作一辆汽车的实例:

Car myCar = new Car();
myCar.make = "Honda";
myCar.model = "Accord";
myCar.color = "Black";

这与结构类似。现在,使OOP与众不同的是,您可以扩展类定义以定义类方法 - 除了它们总是在对象上操作之外,它们与过程中的函数类似。所以,让我们添加一下洗涤方法:

public class Car {
  String make;
  String model;
  String color;
  String condition;
  void washMe() {
    this.condition = "clean";
  }
  void goOffroad() {
    this.condition = "dirty";
  }
}

现在你可以这样做:

Car myCar = new Car();
myCar.make = "Honda";
myCar.model = "Accord";
myCar.color = "Black";

myCar.goOffroad();
System.out.println(myCar.condition); // dirty
myCar.washMe();
System.out.println(myCar.condition); // clean

希望这个例子有所帮助。当然,OOP(和程序)比这个简单的例子还要多得多。但核心区别在于拥有“拥有”自己方法的对象类。

答案 1 :(得分:5)

程序编程和OOP,不同的编程paradigms,都是众所周知的苹果和橘子。 PP依赖于“子程序”。 OOP将“消息”发送到“对象”,这会改变对象的“状态”并将消息发送到其他对象;此外,可以扩展行为对象,创建新类型的对象。两者都依赖于任务和副作用。问题可能在一种范式中具有自然的解决方案,而在另一种范式中则是巴洛克式的解决方案。也就是说,可以通过使用传递消息的对象或通过过程来容易地建模问题。

编程语言可以支持范围超出它们原生支持的范例,但它需要程序员实现必要的结构。例如,你可以用C做OOP;实际上,C的一些OO扩展依赖于生成C代码作为输出的预处理器。

随着学习进度的增加,您需要查看其他paradigms,尤其是functional programming。查看logic programming(例如Prolog)和dataflow programming(参见Pure Data示例)并不会有什么坏处。

答案 2 :(得分:3)

Java是一种主要用于面向对象编程的语言,C语言主要用于面向过程的编程

Wikipedia about Procedural programming vs object oriented programming:

有一个很好的解释
  

与面向对象的比较   编程程序的重点   编程是打破一个   编程任务成集合   变量,数据结构和   子程序,而在   它是面向对象的编程   将编程任务分解为   每个“对象”的对象   封装自己的数据和方法   (子程序)。最重要的   区别是程序性的   编程使用程序来操作   数据结构,面向对象   编程将两者捆绑在一起   所以“对象”在其“自己的”上运作   数据结构。命名法各不相同   两者之间虽然有   大致相同的语义:   面向对象的程序   方法功能对象模块   消息参数属性变量

但是为了使事情变得更加基本,你可以想到像现实世界中的物体一样的物体,比如汽车将汽车的所有属性都视为窗户和轮胎等其他物体。

答案 3 :(得分:2)

我会给你最简单直观的答案。

(考虑 Java 面向对象的语言 C 程序语言

面向对象语言

  • 核心概念是对象(考虑一辆车)
  • 对象具有定义它们的属性,它们可以是恒定的或变化的(汽车是红色的,2004型号,并且具有巡航控制。它目前在里程表和3/4坦克燃料上也有100K)
  • 对象可以发送影响它的消息(汽车可以从A驱动到B,汽车可以加油)

程序语言

  • 核心概念是流程(考虑在线订购)
  • 要完成它的过程必须经过几个步骤(订单必须(1)发送到仓库,(2)装箱,(3)装运)
  • 其中一个步骤可能是一个进程本身,也可能是原子

答案 4 :(得分:1)

通过为您提供构造以使数据抽象和多态易于实现,OO语言使编写面向对象程序变得更加容易。

答案 5 :(得分:1)

面向对象的编程范例告诉您将状态变量封装在称为“对象”的实体中,这些实体通过消息传递进行通信,通常实现为具有“特殊”thisself参数的函数。

面向对象的编程语言是一种易于使用oo范例的语言。它的语义和语法都是为了实现这一目标。继承(基于类或原型)和子类型多态是使oo抽象概念在实践中可行的重要技术。

答案 6 :(得分:1)

面向对象语言是围绕称为对象的数据结构构建的,每个数据结构都包含自己的数据和行为。通过组合这些对象并让它们相互交互,您可以设计一个更好地反映您尝试解决的问题领域的程序。

例如,在银行应用程序中,您可能拥有代表帐户的对象,每个对象都存储余额等数据,并实现转移资金等特定行为。

在更传统的语言中,您可以将数据和行为保存在不同的位置。

答案 7 :(得分:1)

除了试图将一种语言描述为具有特定范式的语言之外,你可能会发现William R. Cook的这篇论文很有用:On understanding data abstraction, revisited。有a draft version可用。它探讨了抽象数据类型对象之间的区别 - 这种区别在经过多年编程语言的吸收之后,我再也看不到了。

我通过Guy Steele最近的文章Why Object-Oriented Languages Need Tail Calls找到了这篇论文。

答案 8 :(得分:0)

OOP可以更轻松地将一个大问题分解为更小的自包含部分。然后,您可以通过组合这些部分来创建更复杂的东西。

答案 9 :(得分:0)

面向对象语言是您根据对象进行思考的地方。但是,这需要很多技能。你不能拿一些C代码把它塞进一个对象并称之为OOP。 OOP的关键概念是继承,封装和动态绑定。

答案 10 :(得分:-1)

程序可以通过两种方式在概念上组织,围绕其代码或数据。第一种方法称为面向过程的模型。第二种方法称为面向对象模型。