方法和函数之间的区别
有人可以提供在OOP上下文中的方法与函数的简单解释吗?
函数是按名称调用的一段代码。 它可以传递数据来操作(即参数),并可以select返回数据(返回值)。 传递给函数的所有数据都被显式传递。
方法是由与对象关联的名称调用的一段代码。 在大多数方面,除了两个关键区别之外,它与function相同:
- 一个方法隐式地传递了被调用的对象。
- 一个方法能够对类中包含的数据进行操作(记住一个对象是一个类的实例 – 类是定义,对象是该数据的一个实例)。
(这是一个简单的解释,忽略范围等问题)
一个方法在一个对象上。
一个函数独立于一个对象。
对于Java,只有方法。
对于C,只有function。
对于C ++来说,取决于你是否在课堂上。
“方法”是“函数”的面向对象的单词。 这几乎是所有这一切(即,没有真正的区别)。
不幸的是,我认为这里的很多答案是延续或推进了一些复杂而有意义的差异。
真的 – 没有太多的东西,只是对于同样的事情不同的话。
[后加]
实际上,正如Brian Neal在对这个问题的评论中指出的那样,C ++标准在引用成员函数时从不使用术语“方法”。 有些人可能会认为C ++并不是真正的面向对象的语言, 然而,我更愿意把它看作是一个相当聪明的一群人不认为有特别强烈的理由来使用不同的术语。
一般来说:方法是属于一个类的函数,函数可以在代码的任何其他范围,所以你可以说所有的方法都是函数,但并不是所有的函数都是方法:
以下面的python为例:
class Door: def open(self): print 'hello stranger' def knock_door: a_door = Door() Door.open(a_door) knock_door()
给出的例子显示了一个名为“Door”的类,它有一个名为“open”的方法或动作,因为它是在类中声明的,所以它被称为方法。 还有另外一部分代码在下面定义了一个函数“def”,它是一个函数,因为它没有在类中声明,这个函数调用我们在类中定义的方法,就像你看到的,最后函数正在自己调用。
正如你所看到的,你可以在任何地方调用一个函数,但是如果你想调用一个方法,你必须传递一个与声明该方法的类相同types的新对象(Class.method(object)),或者你必须调用对象内部的方法(object.Method()),至less在python中。
把方法看作只有一个实体可以做的事情,所以如果你有一个Dog类,那么只有在这个类中有一个树皮函数是有意义的,这将是一个方法,如果你也有一个Person类,它可能是有意义的写一个函数“饲料”,因为它不属于任何类别,因为人类和狗都可以喂食,你可以称它为函数,因为它不属于任何类别。
函数和方法之间主要区别的一个非常一般的定义:
函数是在类的外部定义的,而方法是在类的一部分内部定义的。
如果你觉得在这里读的是“我的OO方法介绍”
面向对象的范例背后的想法是“威胁”软件是由“好”的对象组成的。 对象在现实世界中有属性,例如,如果你有一个雇员,这个雇员有一个名字,一个雇员ID,一个职位,他属于一个部门等等。
该对象也知道如何处理它的属性并对它们执行一些操作。 如果我们想知道员工现在在干什么,我们会问他。
employe whatAreYouDoing.
“你做什么”是发送给对象的“消息”。 对象知道如何回答这个问题,据说有一个“方法”来解决这个问题。
所以,对象必须暴露其行为的方式称为方法。 因此,方法是人造物体必须“做”某事。
其他可能的方法是
employee whatIsYourName employee whatIsYourDepartmentsName
等等
另一方面,函数是程序devise语言必须计算某些数据的方法,例如,您可能具有函数addValues(8,8),该函数返回16
// pseudo-code function addValues( int x, int y ) return x + y // call it result = addValues( 8,8 ) print result // output is 16...
由于第一种stream行的编程语言(如fortran,c,pascal)没有涵盖面向对象的范例,所以只能调用这些文件的“function”。
例如C中的前一个函数是:
int addValues( int x, int y ) { return x + y; }
说一个对象有一个“function”来执行一些动作是不“自然的”,因为函数更多地涉及到math的东西,而一个员工几乎没有math的东西,但是你可以拥有和函数完全一样的方法,例如在Java中,这将是等效的addValues函数。
public static int addValues( int x, int y ) { return x + y; }
看起来很熟悉? 这是因为Java的C ++和C ++的根源在C.
最后只是一个概念,在实现中它们可能看起来是一样的,但是在OO文档中这些被称为方法。
这里是Java中以前的Employee对象的一个例子。
public class Employee { Department department; String name; public String whatsYourName(){ return this.name; } public String whatsYourDeparmentsName(){ return this.department.name(); } public String whatAreYouDoing(){ return "nothing"; } // Ignore the following, only set here for completness public Employee( String name ) { this.name = name; } } // Usage sample. Employee employee = new Employee( "John" ); // Creates an employee called John // If I want to display what is this employee doing I could use its methods. // to know it. String name = employee.whatIsYourName(): String doingWhat = employee.whatAreYouDoint(); // Print the info to the console. System.out.printf("Employee %s is doing: %s", name, doingWhat ); Output: Employee John is doing nothing.
那么区别在于它应用的“域”。
AppleScript有一个“自然语言”的概念,在某些时候OO有。 比如Smalltalk。 我希望在阅读完这些对象之后,理解对象中的方法是比较容易的。
注:该代码不被编译,只是作为一个例子。 随意修改post并添加Python示例。
比方说一个函数是一个代码块(通常有自己的作用域,有时候有自己的闭包),可能会收到一些参数,也可能返回一个结果。
方法是一个由对象所拥有的函数(在一些面向对象的系统中,更正确地说它是由一个类所拥有的)。 被对象/类“拥有”意味着你通过对象/类来引用方法; 例如,在Java中,如果你想调用一个对象“门”所拥有的方法“open()”,你需要写“door.open()”。
通常,方法还会获得一些额外的属性来描述它们在对象/类中的行为,例如:可见性(与面向对象的封装概念有关)定义从哪个对象(或类)中调用方法。
在许多面向对象的语言中,所有“function”都属于某个对象(或类),所以在这些语言中没有function不是方法。
在面向对象的世界中,这两者通常被用来表示相同的东西。
从纯粹的math和CSangular度来看,函数总是以相同的参数(f(x,y)=(x + y))调用时返回相同的结果。 另一方面,方法通常与类的实例相关联。 尽pipe如此,大多数现代OO语言大多不再使用术语“function”。 许多静态方法可能非常像函数,因为它们通常没有状态(并非总是如此)。
函数是一个math概念。 例如:
f(x,y) = sin(x) + cos(y)
说函数f()会返回第一个参数的sin值加到第二个参数的余弦值上。 这只是math。 事实上,sin()和cos()也是函数。 一个函数具有另一个属性:所有对具有相同参数的函数的调用都应返回相同的结果。
另一方面,方法是与面向对象语言中的对象有关的function。 它有一个隐含的参数:被执行的对象(和它的状态)。
所以,如果你有一个方法g(x)的对象Z,你可能会看到以下内容:
Zg(x) = sin(x) + cos(Zy)
在这种情况下,传入参数x,与前面的函数示例相同。 然而,cos()的参数是一个存在于对象Z内部的值。Z和它内部的数据(Zy)是Z的g()方法的隐式参数。
函数或方法是一个有名字的可调用代码片段,它执行一些操作并可选地返回一个值。
在C语言中使用术语函数。 Java和C#人会说它是一种方法(在这种情况下,一个函数是定义在一个类/对象)。
一个C ++程序员可能会把它称为一个函数或者有时候是方法(取决于他们是在编写过程式的c ++代码还是正在做面向对象的C ++方式,而且只有C / C ++的程序员可能会把它称为一个函数,因为术语'method'是在C / C ++文献中使用较less)。
你只需要调用它的名字就可以使用一个函数,
result = mySum(num1, num2);
你可以通过首先引用它的对象来调用一个方法,
result = MyCalc.mySum(num1,num2);
方法是类的function。 在一般的行话中,人们互相交换方法和function。 基本上你可以把它们看作是一样的东西(不知道全局函数是否叫做方法)。
函数是一组可用于处理数据的逻辑。
而Method则是用来处理它所属对象的数据的函数。 所以在技术上,如果你有一个函数不是和你的类完全相关的,而是在类中声明的,那么它不是一个方法。 这被称为糟糕的devise。
类的方法作用于类的实例,称为对象。
class Example { public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable". public void UpdateData() // .. and manipulates it (This is a method by the way) { data = data + 1; } public void PrintData() // This is also a method { Console.WriteLine(data); } } class Program { public static void Main() { Example exampleObject1 = new Example(); Example exampleObject2 = new Example(); exampleObject1.UpdateData(); exampleObject1.UpdateData(); exampleObject2.UpdateData(); exampleObject1.PrintData(); // Prints "2" exampleObject2.PrintData(); // Prints "1" } }
在诸如Object Pascal或C ++的OO语言中,“方法”是与对象关联的函数。 所以,例如,一个“狗”对象可能有一个“树皮”function,这将被视为一个“方法”。 相反,“StrLen”函数是独立的(它提供了作为参数提供的string的长度)。 因此,这只是一个“function”。 Javascript在技术上也是面向对象的,但是与像C ++,C#或Pascal这样的全面语言相比却面临许多限制。 尽pipe如此,这种区分仍然应该存在。
一些额外的事实:C#是完全面向对象的,所以你不能创build独立的“函数”。 在C#中,每个函数都绑定到一个对象,因此在技术上就是一个“方法”。 C#中很less有人将它们称为“方法” – 它们只是使用术语“function”,因为没有任何真正的区别。
最后 – 就这样,任何帕斯卡大师都不会在这里跳上我 – 帕斯卡还区分“function”(返回一个值)和“程序”之间的差别。 虽然你可以select返回一个值,但C#并没有明确地区分这个区别。
既然你提到了Python,下面可能是大多数现代面向对象语言中方法和对象之间关系的一个有用的例子。 简而言之,他们所称的“方法”只是一个被传递给额外参数的函数(正如其他答案所指出的那样),但是Python比大多数语言更加明确。
# perfectly normal function def hello(greetee): print "Hello", greetee # generalise a bit (still a function though) def greet(greeting, greetee): print greeting, greetee # hide the greeting behind a layer of abstraction (still a function!) def greet_with_greeter(greeter, greetee): print greeter.greeting, greetee # very simple class we can pass to greet_with_greeter class Greeter(object): def __init__(self, greeting): self.greeting = greeting # while we're at it, here's a method that uses self.greeting... def greet(self, greetee): print self.greeting, greetee # save an object of class Greeter for later hello_greeter = Greeter("Hello") # now all of the following print the same message hello("World") greet("Hello", "World") greet_with_greeter(hello_greeter, "World") hello_greeter.greet("World")
现在比较函数greet_with_greeter
和方法greet
:唯一的区别是第一个参数的名称(在函数中我称之为“greeter”,在我称之为“self”的方法中)。 所以我可以用和greet_with_greeter
函数完全相同的方法来使用greet
方法(使用“dot”语法来获取它,因为我在类中定义了它):
Greeter.greet(hello_greeter, "World")
所以我已经有效地将一个方法转化为一个函数。 我可以把一个函数转换成一个方法吗? 那么,Python可以让你在定义好的类中混淆后,让我们试试:
Greeter.greet2 = greet_with_greeter hello_greeter.greet2("World")
是的,函数greet_with_greeter
现在也被称为方法greet2
。 这显示了一个方法和一个函数之间唯一真正的区别:当你通过调用object.method(args)
来调用一个对象的方法时,这个语言神奇地将它变成method(object, args)
。
(OO纯粹主义者可能认为一种方法与函数不同,如果你进入高级的Python或者Ruby – 或者Smalltalk! – 你将会开始看到他们的观点,而且一些语言也给方法特殊的访问对象的位。主要的概念差异仍然是隐藏的额外参数。)
函数是一组可用于处理数据的逻辑。 而Method则是用来处理它所属对象的数据的函数。 所以在技术上,如果你有一个函数不是和你的类完全相关的,而是在类中声明的,那么它不是一个方法。 这被称为糟糕的devise。
从历史上来看 ,“方法”是一种不返回价值的东西,也可能是一种“function”的微妙差别。每种语言都有自己的专有术语词典 。
在“C”中 , “function”一词表示程序例程 。
在Java中 ,术语“function”没有任何特殊的含义。 而“方法”是指形成类的实现的例程之一。
在C#中 ,将翻译为:
public void DoSomething() {} // method public int DoSomethingAndReturnMeANumber(){} // function
但实际上,我重申了两个概念之间确实没有什么区别。 如果在关于Java的非正式讨论中使用术语“function”,人们会认为你的意思是“方法”并继续。 不要将它用在有关Java的适当文档或演示文稿中,否则你会看起来很傻。
对于我来说:方法和函数的function是一样的,如果我同意:
- 一个函数可能会返回一个值
- 可能期望参数
就像任何一段代码一样,你可能有一些对象,你可能会有一个对象。 在这样做的过程中,他们可能会改变一个物体的状态,但这并不会改变他们对我的基本function。
在调用对象或其他代码的函数时可能会有一个不同的定义。 但是这不是口头上的分歧,这就是为什么人们交stream? 提到计算的例子,我会小心的。 因为我聘请雇员做我的计算:
new Employer().calculateSum( 8, 8 );
通过这样做,我可以依靠雇主负责计算。 如果他想要更多的钱,我就可以释放他,让卡比奇收集者处置闲置的员工去做剩下的工作,然后找一个新的员工。
甚至认为一个方法是一个对象函数,而一个函数是不相关的,计算对我来说无能为力。 函数描述符本身,理想情况下函数的文档将告诉我它需要什么以及它可能会返回什么。 其余的,像操纵一些对象的状态对我来说并不是真的透明。 我确实希望function和方法能够交付和操纵他们所声称的内容,而不必详细了解他们是如何做到的。 即使是纯粹的计算function也可能会改变控制台的状态或追加到日志文件中。
根据我的理解,一个方法是可以在一个类上执行的任何操作。 这是编程中使用的一个通用术语。
在很多语言中,函数和子程序都是用方法表示的。 大多数语言使用的主要区别是函数可能会将值返回给调用者,而子例程可能不会。 然而,许多现代语言只有function,但这些可以不返回任何价值。
例如,可以说你想描述一只猫,你希望能够打哈欠。 你将创build一个带有Yawn方法的Cat类,它很可能是一个没有任何返回值的函数。
对于一阶近似,一个方法(用C ++风格的OO)是成员函数的另一个词,它是一个类的一部分。
在像C / C ++这样的语言中,你可以拥有不是类的成员的函数。 你不要调用一个方法没有与类关联的函数。
简单的方法来记住:
- function→自由(免费意味着不属于对象或类别)
- M ethod→ M ember(对象或类的成员)
恕我直言,人们只是想发明新的单词,以方便程序员之间的沟通,当他们想引用对象内的函数。
如果你所说的方法是指class级内的function。 如果你说的function,你的意思是在class级以外的职能。
事实是这两个词都用来描述function。 即使你错误地使用了,也没有错。 这两个词很好地描述了你想在你的代码中实现什么。
函数是一个代码,它必须扮演一个做某事的angular色( 一个function )。 方法是解决问题的方法 。
它做同样的事情。 这是一样的事情。 如果你想要超级精确并遵循惯例,你可以调用方法作为对象内部的函数。
函数是主要属于面向过程编程的概念,其中函数是一个可以处理数据并返回值的实体
方法是面向对象编程的概念,其中方法是大部分在类成员上处理的类的成员。
我不是专家,但这是我所知道的:
-
function是C语言术语,它是指一段代码,function名称将是使用此function的标识符。
-
方法是OO术语,通常它在函数参数中有一个这个指针。 你不能像C这样调用这段代码,你需要用对象来调用它。
-
调用方法也不同。 这里调用意义来查找这段代码的地址。 C / C ++,链接时间将使用函数符号来定位。
-
Objecive-C是不同的。 调用C函数来使用数据结构来查找地址。 这意味着一切都在运行时已知。
我知道很多人已经回答,但是我发现以下是一个简单而有效的单行答案。 尽pipe在这里看起来并不比其他答案好,但是如果仔细阅读,就会知道有关方法和function的所有知识。
方法是一个函数,它具有一个定义的接收器,在OOP中,方法是一个对象实例的函数。
函数和方法是一回事
类中的成员函数在Java等一些编程语言中被称为方法。
在C ++中,你不能区分方法和函数。 大多数(如果不是全部的话)C ++程序员不使用名称“method”。
“function”与“方法”的区分难以区分“function”与“function”。
相信“function”和“方法”只是同一个事物的两个不同名称 ,你会没事的。
在C ++中,有时用方法来反映类的成员函数的概念。 然而,最近我在“The C ++ Programming Language 4th Edition”一书中find了一个声明,第586页“派生类”
虚拟function有时被称为方法。
这有点令人困惑,但是他有时会这样说,所以它大致合理,C ++创build者倾向于将方法看作是可以在对象上调用的函数,并且可以performance为多态。
下面是使用JavaScript示例的方法和function的一些解释:
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中的string属性/方法:
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");
方法是一个行动的名称。 函数是一个方法的标识符。