我一直在听说C是一种非面向对象的语言,以及java是一种面向对象的语言。我想知道区别是什么?
答案 0 :(得分:36)
在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 是程序语言)
答案 4 :(得分:1)
答案 5 :(得分:1)
面向对象的编程范例告诉您将状态变量封装在称为“对象”的实体中,这些实体通过消息传递进行通信,通常实现为具有“特殊”this
或self
参数的函数。
面向对象的编程语言是一种易于使用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)
程序可以通过两种方式在概念上组织,围绕其代码或数据。第一种方法称为面向过程的模型。第二种方法称为面向对象模型。