方法和函数有什么区别?

2149

能否简单解释一下在面向对象编程中方法函数的区别?


看到另一种解释来阐述 [tag:r] 中方法和函数的区别会很有趣。这很有趣,因为方法通常会包含一个函数。如果方法是一个依赖于对象的函数,那么检查对象类别的函数 if(class(object)) { ... } else {stop()} 在概念上等同于方法吗? - Konrad
1
适当的术语可能因语言而异,在不同的上下文中可能略有不同的含义。即便如此,由于程序员在使用一种语言时更习惯于某些术语,因此他们会受到同事使用术语的影响(无论其是否正确)。这些术语通常可以互换使用。例如,请参见以下一些评论。 - jvriesem
关于概念混淆的问题提得非常好。我喜欢程序员们的哲学意识。谢谢大家。 - Berkay
42个回答

6

据我所知,方法是可以在类上执行的任何操作。它是编程中使用的一个通用术语。

在许多语言中,方法由函数和子例程表示。大多数语言用于区分这些的主要区别是函数可以将值返回给调用者,而子例程则不能。然而,许多现代语言只有函数,但这些函数可以选择不返回任何值。

例如,假设您想描述一只猫,并希望它能打哈欠。您将创建一个Cat类,其中包含一个Yawn方法,这很可能是一个没有返回值的函数。


6

大致上来说,方法(以C++风格的面向对象编程)是成员函数的另一种称呼,也就是类中的一种函数。

在像C/C++这样的语言中,您可以拥有不属于类的函数;您不能将未与类相关联的函数称为方法。


5

Function(函数)是主要属于过程式编程的概念,其中函数是一个可以处理数据并返回值的实体。

Method(方法)是面向对象编程中的概念,其中方法是类的成员,主要对类成员进行处理。


4

我虽然不是专家,但以下是我的一些了解:

  1. "函数"是C语言的术语,它指的是一段代码,"函数名"是用来标识这个函数的标识符。

  2. "方法"是面向对象的术语,通常在函数参数中有一个"this"指针。你不能像C语言那样调用这段代码,你需要使用对象来调用它。

  3. "调用方法"也是不同的。这里的调用意味着找到这段代码的地址。在C/C++中,链接时将使用函数符号来定位。

  4. 而Objective-C则不同。调用意味着使用数据结构查找地址的C函数。这意味着在运行时所有内容都是已知的。


4

TL;DR

函数是要执行的一段代码。方法是对象内部的函数。

函数的示例:


function sum(){
  console.log("sum")l
}

一个方法的例子:

const obj = {
a:1,
b:2,
sum(){
  }
}

因此,我们说在函数内部使用"this"关键字并不是很有用,除非我们将其与call、apply或bind一起使用。因为call、apply和bind将以对象方法的形式调用该函数,基本上会将函数转换为方法。

3

我知道许多其他人已经回答过了,但我发现以下是一个简单而有效的单行答案。虽然它看起来与其他答案差不多,但如果您仔细阅读它,它包含了关于方法与函数的所有必要信息。

方法是具有定义接收方的函数,在面向对象编程中,方法是对象实例上的函数。


3

函数 - 函数是一段独立的代码,包含一些逻辑,必须独立调用,并且在类之外定义。

方法 - 方法是一段独立的代码,与某个对象相关联并在类内部定义。


一个静态类中的一块代码,如果它也是静态的,你怎么称呼它,是方法还是函数?一个静态类中的静态函数/方法不需要此类的对象进行声明。 - Wolfgang Roth

3
一个类是一组数据和函数,可选地带有构造函数。
当您创建该特定类的实例(副本、复制品)时,构造函数初始化该类并返回一个对象。
现在,该类成为对象(没有构造函数),而在对象上下文中,函数被称为方法。
因此,基本上:
类<==new==>对象
函数<==new==>方法
在Java中,通常会告诉我们构造函数名称与类名称相同,但实际上,该构造函数类似于具有用户定义返回类型(即类类型)的实例块和静态块。
虽然类可以有静态块、实例块、构造函数、函数,但对象通常只有数据和方法。

3

一般答案是:

方法 有对象上下文(this,或类实例引用),

函数 没有上下文(null,或全局,或静态)。

但是问题的答案取决于您使用的语言术语。

  1. 在 JavaScript (ES 6) 中,你可以自由地定制函数上下文 (this)为任何你想要的内容,这通常必须与(this)对象实例上下文链接。

  2. 在 Java 的世界里,你总是会听到"只有OOP类/对象,没有函数", 但如果你仔细观察Java中的静态方法,它们实际上处于全局/空上下文(或类的上下文,没有实例化),所以只是没有对象的函数。Java老师可能会告诉你,函数是C和C++中的残留物,并在Java中被删除,但他们之所以这么说是为了简化历史并避免新手不必要的问题。如果你看看Java 7版本之后,你会发现许多纯函数编程元素(甚至不是来自C,而是来自1988年的Lisp用于简化并行计算,并不是OOP类的风格

  3. 在C++和D的世界里,事情更加强大,你有单独的函数带有方法和字段的对象。但实际上,你会再次看到没有this的函数和带有对象上下文的方法。

  4. 在FreePascal/Lazarus和Borland Pascal/Delphi中,关于函数和对象(变量和字段)的分离术语通常类似于C++。

  5. Objective-C来自C的世界,所以你必须区分C函数和Objective-C对象与方法附加。

  6. C#非常类似于Java,但具有许多C++的优点。


2
在C++中,有时会使用方法(method)这个术语来反映类的成员函数。然而,在最近我在《C++程序设计语言 第四版》第586页“派生类”章节中发现了如下描述:

虚函数有时被称为方法。

这有点令人困惑,但他说“有时”,所以大致上是有道理的,C++的创建者倾向于将“方法”看作是可以在对象上调用并具有多态行为的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接