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

azn*_*son 12 c java oop

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

Mar*_*k S 37

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

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

WashMyCar(myCar);
Run Code Online (Sandbox Code Playgroud)

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

public class Car {
  String make;
  String model;
  String color;
}
Run Code Online (Sandbox Code Playgroud)

然后,你做一个像这样的汽车的实例:

Car myCar = new Car();
myCar.make = "Honda";
myCar.model = "Accord";
myCar.color = "Black";
Run Code Online (Sandbox Code Playgroud)

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

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

现在你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

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


out*_*tis 5

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

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

随着学习进度的提高,您将需要查看其他范例,尤其是函数式编程.查看逻辑编程(如Prolog所示)和数据流编程(参见Pure Data的示例)并不会有什么坏处.