方法和函数有什么区别?

2149

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


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

2

方法和函数之间有明显的区别:

函数是一段独立的代码,你可以通过给定参数并提及其名称在任何地方调用它,例如在大多数过程式语言中,如C++和Python。而

方法特别与一个对象相关联,这意味着你只能通过在它前面加上点(.)符号并提及它的对象来调用一个方法,例如在纯面向对象的语言中,如C#和Java。


我唯一不同意的一点是:C#和Java并不是纯面向对象的语言。你可以在这些语言中编写相当功能性的代码。 :) - Martin Komischke

2

方法和函数的区别

从微软的这篇文档中了解到:

包含可执行代码的成员统称为类的函数成员。前面的部分描述了方法,它们是函数成员的主要类型。本节将介绍 C# 支持的其他几种函数成员:构造函数、属性、索引器、事件、运算符和终结器。

因此,方法是函数的子集。每个方法都是一个函数,但不是每个函数都是方法。例如,constructor不能被称为 方法,但它是一个函数。


属性、索引器和事件不是函数。获取器、设置器(用于属性和索引器)、添加器和移除器(用于事件)是函数。函数成员是与一个或多个函数相关联的成员,但不一定是函数。 - Jon Hanna

2

以下是使用JavaScript示例解释方法与函数的一些内容:

test(20, 50);是函数定义,用于运行一些步骤或返回可以存储/使用在其他地方的东西。

您可以重用代码:仅定义一次代码并多次使用它。

您可以使用不同的参数多次使用相同的代码,以产生不同的结果。

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); 这里的test()可以是某个对象的方法或自定义内置对象的原型,以下是更详细的解释:

JavaScript方法是可以在对象上执行的操作。

JavaScript方法是包含函数定义的属性。

JavaScript中字符串的内置属性/方法:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

自定义示例:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

你也可以为String、Array等定义属性,例如:

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

一些参考资料:Javascript对象方法函数原型的更多信息


请不要在多个问题中发布相同的答案。发表一个好的答案,然后投票/标记关闭其他问题作为重复。如果问题不是重复的,请根据问题量身定制您的答案 - Paul Roub
谢谢您的反馈,我没有修改其他答案,我已经删除了那个答案。 :-) - Lahar Shah

2
仅用两个词概括:非静态(“实例”)方法带有指向“this”的隐藏指针作为它们的第一个参数,该指针是您调用该方法的对象。
这是与常规独立函数唯一的区别,尽管动态分派不在此列。
如果您感兴趣,请阅读下面的详细信息。
我将尝试简短地解释,并以C ++为例,尽管我所说的内容可以应用于几乎所有语言。
对于CPU来说,函数和方法都只是代码块。因此,当调用函数/方法时,它们可以传递参数。
好的,我说没有实际区别。让我们深入一点:
有两种类型的方法:静态和非静态。
静态方法就像普通函数,但声明在类内部,仅充当名称空间。
非静态(“实例”)方法带有指向“this”的隐藏指针作为它们的唯一区别与常规独立函数。
除了动态分派之外,这意味着只是那么简单。
class User {
    public string name; // I made it public intentionally

    // Each instance method takes a hidden reference to "this"
    public void printName(/*User & this*/) {
        cout << this.name << endl;
    }
};

等同于

public getName(User & user) {
    // No syntactic sugar, passing a reference explicitly
    cout << user.name << endl;
}

因此,实际上,user->printName()只是getName(user)的语法糖。
如果您不使用动态分派,那就是这样。如果它被使用了,那么它就会有点复杂,但编译器仍然会发出看起来像是以this作为第一个参数的函数。

很好的解释。 你能否在示例代码旁边添加printName()作为方法,而getName()作为函数? - Martin Komischke

1

函数是一组指令或过程,用于执行特定任务。它可以将代码分割成易于理解的部分,并且可以被调用或重复使用。

方法是可以在对象上执行的操作。它也被称为存储为对象属性的函数。

主要区别: 函数不需要任何对象并且是独立的,而方法是与任何对象相关联的函数。

//firstName() is the function

function firstName(){
 cosole.log('John');
}

firstName() //Invoked without any object


const person = {
  firstName: "John",
  lastName: "Doe",
  id: 5566,
};

//person.name is the method
person.name = function() {
  return this.firstName + " " + this.lastName;
};

document.getElementById("demo").innerHTML =
"My father is " + person.name() //performs action on object; 


1
方法和函数有什么区别?
Python官方文档这样定义(感谢@Kelly Bundy here!): 函数 一系列语句,返回某个值给调用者。也可以传递零个或多个参数,在执行过程中可能会使用到这些参数。另请参阅参数方法以及函数定义部分。

方法

类体内定义的函数。如果作为该类实例的属性被调用,则该方法将把该实例对象作为其第一个参数(通常称为self)。参见函数嵌套作用域


一个正方形是个矩形,但并不是所有的矩形都是正方形。在我看来,方法就是函数,但并非所有的函数都是方法。而方法之所以独特,是因为它是一种特殊类型的函数,同时还与类相关联,并可以访问类成员变量。

另请参阅:

  1. [我的答案] hasattr 被称为方法,但它看起来像一个函数

1
一个 方法 是任何对象或类的成员。 一个 函数 是独立的。
但在Javascript中,函数方法 是可互换的。

1
一个函数和一个方法看起来非常相似。它们都有输入和输出。区别在于方法在类内部,而函数在类外部

1
他们通常可以互换使用,但是方法通常指的是类内部的子程序,而函数通常指的是类外部的子程序。 例如,在Ruby中:
# function
def putSqr(a)
   puts a ** 2
end


class Math2
   # method
   def putSqr(a)
      puts a ** 2
   end
end


在Java中,除了包和导入语句之外,所有内容几乎都必须放在类内部。因此,人们几乎总是将它们称为“方法”。

0
使用C#术语,函数和方法是有区别的。术语“函数成员”不仅包括方法,还包括其他非数据成员,如索引器、运算符、构造函数、析构函数和属性——所有包含可执行代码的成员。

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