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

2022-09-02 14:25:59

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


答案 1

哇,很多大的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(和过程)比这个简单的例子要多得多。但核心区别在于拥有“拥有”自己方法的对象类。


答案 2

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

编程语言可以支持它们本身支持之外的范例,但它需要程序员实现必要的结构。例如,您可以使用C进行OOP;事实上,C的一些OO扩展依赖于预处理器来生成C代码作为输出。

随着学习的进展,你会想要研究其他范式,尤其是函数式编程。查看逻辑编程(如Prolog所示)和数据流编程(请参阅纯数据示例)并没有什么坏处。