有人可以在OOP上下文中提供方法与函数的简单解释吗?
答案 0 :(得分:1656)
功能是一段按名称调用的代码。它可以传递数据以进行操作(即参数),并且可以可选地返回数据(返回值)。传递给函数的所有数据都是显式传递的。
方法是由与对象关联的名称调用的一段代码。在大多数方面,除了两个主要区别外,它与功能相同:
(这是一个简化的解释,忽略了scope等问题。)
答案 1 :(得分:915)
方法在物体上 函数独立于对象。
对于Java,只有方法 对于C,只有函数。
对于C ++,它取决于你是否在课堂上。
答案 2 :(得分:199)
'方法'是'function'的面向对象字词。这就是它的全部内容(即没有真正的区别)。
不幸的是,我认为这里的很多答案都在延续或推进存在一些复杂而有意义的差异的想法。
真的 - 它没有那么多,只是同一个词的不同词语。
[后期补充]
事实上,正如Brian Neal在对this question的评论中指出的那样,C ++标准在引用成员函数时从不使用术语'方法'。有些人可能会认为这表明C ++并不是真正的面向对象语言;但是,我更愿意将其视为一个非常聪明的人群认为没有特别强烈的理由使用不同的术语。
答案 3 :(得分:89)
一般来说:方法是属于类的函数,函数可以在代码的任何其他范围内,因此您可以声明所有方法都是函数,但并非所有函数都是方法:
采用以下python示例:
class Door:
def open(self):
print 'hello stranger'
def knock_door:
a_door = Door()
Door.open(a_door)
knock_door()
给出的示例显示了一个名为“Door”的类,它有一个名为“open”的方法或操作,它被称为方法,因为它是在类中声明的。还有另一部分代码,下面是“def”,它定义了一个函数,它是一个函数,因为它没有在类中声明,这个函数调用我们在类中定义的方法,你可以看到,最后函数是自己称呼。
正如您所看到的,您可以在任何地方调用函数,但是如果要调用方法,则必须传递与声明方法的类相同类型的新对象(Class.method(object))或者您必须调用对象内部的方法(object.Method()),至少在python中。
将方法看作只有一个实体可以做的事情,所以如果你有一个Dog类,那么只在该类中有一个bark函数是有意义的,那将是一个方法,如果你还有一个Person类,它可以有意义的是写一个函数“feed”,因为它不属于任何类,因为人和狗都可以被喂食,你可以称之为函数,因为它不属于任何类。
答案 4 :(得分:40)
功能与方法之间主要区别的一般定义:
函数是在类之外定义的,而方法是在类的内部和部分类中定义的。
答案 5 :(得分:38)
简单的记忆方式:
答案 6 :(得分:27)
如果你想在这里阅读“我对OO方法的介绍”
面向对象范式背后的想法是“威胁”软件由......好“对象”组成。现实世界中的对象具有属性,例如,如果您有员工,员工有姓名,员工ID,职位,他属于部门等。
该对象还知道如何处理其属性并对它们执行某些操作。如果我们想知道员工现在在做什么,我们会问他。
employe whatAreYouDoing.
“whatAreYouDoing”是发送给对象的“消息”。该对象知道如何回答这些问题,据说它有一个解决问题的“方法”。
因此,对象必须公开其行为的方式称为方法。因此,方法是工件对象必须“做”某事。
其他可能的方法是
employee whatIsYourName
employee whatIsYourDepartmentsName
等
另一方面,函数是编程语言计算某些数据的方式,例如,你可能有函数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...
由于第一种流行的编程语言(例如fortran,c,pascal)没有涵盖OO范例,因此它们只调用这些工件“函数”。
例如,C中的上一个函数将是:
int addValues( int x, int y )
{
return x + y;
}
说对象具有执行某些操作的“功能”并不是“自然”,因为函数与数学内容更相关,而Employee几乎没有数学,但是你可以使用完全相同的方法作为函数,例如在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。我希望你在阅读之后理解对象中的方法可能更容易合理。
注意:代码不是要编译的,只是作为一个例子。随意修改帖子并添加Python示例。
答案 7 :(得分:17)
在OO世界中,这两者通常用于表示相同的事物。
从纯数学和CS的角度来看,当使用相同的参数(f(x,y)=(x + y))调用时,函数将始终返回相同的结果。另一方面,方法通常与类的实例相关联。尽管如此,大多数现代OO语言在大多数情况下不再使用术语“功能”。许多静态方法可能非常类似于函数,因为它们通常没有状态(并非总是如此)。
答案 8 :(得分:15)
假设一个函数是一个代码块(通常有自己的作用域,有时候有自己的闭包)可能会收到一些参数,也可能会返回一个结果。
方法是一个由对象拥有的函数(在某些面向对象的系统中,说它属于一个类更为正确)。由对象/类“拥有”意味着您通过对象/类引用该方法;例如,在Java中,如果要调用对象“door”所拥有的方法“open()”,则需要编写“door.open()”。
通常,方法还会获得一些额外的属性来描述它们在对象/类中的行为,例如:可见性(与面向对象的封装概念相关),它定义了可以调用方法的对象(或类)。 p>
在许多面向对象的语言中,所有“函数”都属于某个对象(或类),因此在这些语言中没有函数不是方法。
答案 9 :(得分:13)
方法是类的功能。在通常的行话中,人们互相交换方法和功能。基本上你可以认为它们是同一个东西(不确定全局函数是否被称为方法)。
答案 10 :(得分:12)
从历史上看,可能存在一个微妙的区别,即“方法”是不返回值的东西,而“函数”则是一个微妙的区别。每种语言都有自己的词汇词汇具有特殊意义。
在“C”中,单词“function”表示程序例程。
在 Java 中,术语“function”没有任何特殊含义。而“method”表示构成类实现的例程之一。
在 C#中将翻译为:
<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
<!-- db1 has Customers table -->
<connection id="db1" url="jdbc:database1" user="user1" password="pwd1" classpath="external.jar"/>
<!-- db2 has Orders table -->
<connection id="db2" url="jdbc:database2" user="user2" password="pwd2" classpath="somedriver.jar"/>
<!-- just for logging -->
<connection id="log" driver="text"/>
<query connection-id="db1">
<!-- SELECT CustomerID/name for all rows from Customer -->
SELECT CustomerID, CustomerName from Customer
<!-- For each selected customer row, select matching orders -->
<query connection-id="db2">
SELECT OrderID, OrderDate FROM Orders WHERE CustomerID=?CustomerID
<!-- Log each match. You can also make INSERT to any DB here -->
<script connection-id="log">
Row $rownum: Orders.OrderID=$OrderID, Customers.CustomerName=$CustomerName, Orders.OrderDate=$OrderDate
</script>
</query>
</query>
<etl>
但实际上,我重申这两个概念确实没有区别。 如果你在关于Java的非正式讨论中使用术语“函数”,人们会认为你的意思是“方法”并继续。不要在适当的文档或关于Java的演示文稿中使用它,否则你会看起来很傻。
答案 11 :(得分:12)
功能是一种数学概念。例如:
f(x,y) = sin(x) + cos(y)
表示函数f()将返回添加到第二个参数的余弦的第一个参数的sin。这只是数学。因为它发生了sin()和cos()也是函数。函数具有另一个属性:对具有相同参数的函数的所有调用都应该返回相同的结果。
另一方面,方法是与面向对象语言中的对象相关的函数。它有一个隐含参数:被操作的对象(和它的状态)。因此,如果您有一个带有方法g(x)的对象Z,您可能会看到以下内容:
Z.g(x) = sin(x) + cos(Z.y)
在这种情况下,传入参数x,与之前的函数示例相同。但是,cos()的参数是一个存在于对象Z内的值.Z和它内部的数据(Z.y)是Z的g()方法的隐式参数。
答案 12 :(得分:12)
函数或方法是一段命名的可调用代码,它执行一些操作并可选地返回一个值。
在 C 语言中使用术语函数。 Java &amp; C#人们会说它是一种方法(在这种情况下,函数是在类/对象中定义的)。
C ++ 程序员可能会将其称为函数或有时称为方法(取决于它们是否正在编写程序样式的c ++代码,或者正在使用C ++的面向对象方式,也可能只是C / C ++程序员称之为函数是因为术语'方法'在C / C ++文献中较少使用。)
您只需将其名称称为“
”即可使用某个功能result = mySum(num1, num2);
您可以通过首先引用其对象来调用方法,如
result = MyCalc.mySum(num1,num2);
答案 13 :(得分:8)
类上的方法作用于类的实例,称为对象。
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"
}
}
答案 14 :(得分:8)
功能是一组可用于操纵数据的逻辑。
虽然,Method是用于操纵它所属对象的数据的函数。 从技术上讲,如果你有一个与你的类没有完全相关但在类中声明的函数,它不是一个方法;这被称为糟糕的设计。
答案 15 :(得分:8)
在诸如Object Pascal或C ++之类的OO语言中,“方法”是与对象相关联的函数。因此,例如,“狗”对象可能具有“树皮”功能,这将被视为“方法”。相反,“StrLen”函数是独立的(它提供了作为参数提供的字符串的长度)。因此只是一个“功能”。 Javascript在技术上也是面向对象的,但与C ++,C#或Pascal等成熟语言相比,它面临着许多限制。尽管如此,这种区别仍应保持不变。
其他一些事实:C#完全面向对象,因此您无法创建独立的“函数”。在C#中,每个函数都绑定到一个对象,因此从技术上讲,它是一种“方法”。问题在于,C#中很少有人将它们称为“方法” - 它们只使用术语“函数”,因为没有任何真正的区别。
最后 - 就这样任何Pascal大师都不会在这里跳过我--Pascal还区分了“函数”(返回值)和“不返回值”的“程序”。虽然您可以选择返回值,但C#并未明确区分。
答案 16 :(得分:8)
由于您提到了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
方法,就像我使用greet_with_greeter
函数一样(使用“点”语法来获取它,因为我在一个类中定义它):
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! - 你会开始看到他们的观点。还有一些语言给方法特殊的访问权限。但主要的概念差异仍然是隐藏的额外参数。)
答案 17 :(得分:7)
就像任何一段代码一样,你可能有你放入的对象,你可能会得到一个对象。在这样做期间,他们可能会改变对象的状态,但这不会改变他们的基本功能。
在调用对象或其他代码的函数时可能存在定义差异。但这不是口头上的差异,这就是人们交换它们的原因吗?提到计算的例子我会小心。因为我聘请雇员来做我的计算:
new Employer().calculateSum( 8, 8 );
通过这样做,我可以依靠雇主负责计算。如果他想要更多的钱,我就会解雇他,并让垃圾收集者处理未使用的员工的功能完成剩下的工作并获得新员工。
甚至认为方法是对象函数而函数是不连接的计算也无济于事。函数描述符本身,理想情况下函数的文档将告诉我它需要什么以及它可能返回什么。其余的,就像操纵一些物体的状态对我来说并不是真的透明。我确实希望功能和方法能够提供和操纵他们声称的内容,而无需详细了解他们是如何做到的。 即使是纯粹的计算函数也可能会改变控制台的状态或附加到日志文件。
答案 18 :(得分:4)
根据我的理解,方法是可以在类上执行的任何操作。它是编程中使用的通用术语。
在许多语言中,方法由函数和子例程表示。大多数语言用于这些的主要区别是函数可能会将值返回给调用者,而子例程可能不会。然而,许多现代语言只有函数,但这些函数可以选择不返回任何值。
例如,假设你想要描述一只猫,你希望能够打哈欠。你可以使用Yawn方法创建一个Cat类,它很可能是一个没有任何返回值的函数。
答案 19 :(得分:4)
对于一阶近似,方法(在C ++样式OO中)是成员函数的另一个单词,即作为类的一部分的函数。
在像C / C ++这样的语言中,你可以拥有不属于类的成员;你不要调用一个与类不相关的函数。
答案 20 :(得分:3)
恕我直言的人们只是想在程序员想要引用对象内部的函数时发明新词,以便更容易地进行通信。
如果你说方法意味着课堂内的功能。 如果你说的是函数,那么你的意思就是在课堂外起作用。
事实是,这两个词都用于描述功能。即使你错误地使用它也不会发生任何错误。这两个词都很好地描述了您希望在代码中实现的目标。
功能是一个必须扮演某个角色(一个功能)的代码。 方法方法来解决问题。
它做同样的事情。这是一回事。如果你想要超精确并遵循惯例,你可以将方法称为对象内的函数。
答案 21 :(得分:3)
让我们不要过分复杂应该是一个非常简单的答案。方法和功能是一回事。当函数在类之外时,可以将函数作为函数调用,并且当函数写入类时,可以将函数作为方法调用。
答案 22 :(得分:3)
功能是主要属于面向过程的编程的概念,其中一个函数是一个可以处理数据并返回值的实体
方法是面向对象编程的概念,其中方法是一个类的成员,它主要处理类成员。
答案 23 :(得分:2)
我知道很多人已经回答了,但我发现以下是一个简单但有效的单行答案。虽然它看起来并不比其他人的答案好很多,但是如果你仔细阅读它,它就拥有你需要了解的方法与功能的一切。
方法是一个具有已定义接收器的函数,在OOP术语中,方法是对象实例上的函数。
答案 24 :(得分:2)
我不是专家,但这就是我所知道的:
函数是C语言术语,它指代一段代码,函数名称将是使用此函数的标识符。
Method是OO术语,通常在函数参数中有一个this指针。你不能像C一样调用这段代码,你需要使用object来调用它。
调用方法也不同。这里调用意义来查找这段代码的地址。 C / C ++,链接时间将使用函数符号来定位。
Objecive-C与众不同。调用意味着C函数使用数据结构来查找地址。这意味着一切都在运行时就已知。
答案 25 :(得分:2)
阅读微软上的this doc
包含可执行代码的成员统称为类的函数成员。上一节描述了方法,它们是主要的函数成员。本节描述了C#支持的其他类型的函数成员:构造函数,属性,索引器,事件,运算符和终结器。
因此方法是函数的子集。每个方法都是一个函数,但不是每个函数都是一个方法,例如,constructor
不能说是方法,但它是一个函数。
答案 26 :(得分:1)
以下是使用JavaScript示例的方法与功能的一些解释:
test(20, 50);
是函数define并用于运行某些步骤或返回可以在某处存储/使用的东西。
您可以重复使用代码:定义代码一次并多次使用。
您可以使用不同的参数多次使用相同的代码,以产生不同的结果。
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");
&#13;
部分参考文献:Javascript Object Method,Functions,More info on prototype
答案 27 :(得分:1)
Function-独立代码中的函数,其中包含一些逻辑,并且必须独立调用 ,并且必须在类外部定义。
Method-方法是一段独立的代码,被称为引用某个对象,并在类内部定义。
答案 28 :(得分:1)
它们通常是可互换的,但是 method 通常是指类内部的子例程,而 function 通常是指类外部的子例程。 例如,在Ruby中:
# function
def putSqr(a)
puts a ** 2
end
class Math2
# method
def putSqr(a)
puts a ** 2
end
end
在Java中,所有内容(不包括package和import语句)必须都在类内,人们几乎总是将它们称为“方法”。
答案 29 :(得分:1)
一般答案是:
method
具有对象上下文(this 或类实例引用),
function
没有上下文(空、全局或静态)。
但问题的答案取决于您使用的语言术语。
在 JavaScript (ES 6) 中,您可以随意使用 to customising function context (this),这通常必须链接到 (this) 对象实例上下文。
在 Java 世界中,您总是听到 "only OOP classes/objects, no functions",但是如果您仔细观察 Java 中的 static methods
,它们实际上是在全局/空上下文(或类的上下文,没有实例化),所以只是在没有对象的情况下运行。 Java 老师可以告诉你,functions were rudiment of C in C++ and dropped in Java
,但他们告诉你它是为了简化历史和避免新手不必要的问题。如果你在 Java 7 版本之后看到,你可以找到许多纯函数编程的元素(甚至不是来自 C,but from older 1988 Lisp)for simplifying parallel computing, and it is not OOP classes style。
在 C++ 和 D 世界中,事情变得更强大了,你已经把 functions 和 objects with methods and fields 分开了。但在实践中,您会再次看到函数 without this
和方法 whith this
(带有对象上下文)。
在 FreePascal/Lazarus 和 Borland Pascal/Delphi 中,函数和 objects(变量和 fields)的分离术语通常类似于 C++。
Objective-C 来自 C 世界,因此您必须使用方法插件将 C 函数和 Objective-C 对象分开。
C# 与 Java 非常相似,但具有许多 C++ 优点。
答案 30 :(得分:0)
在C ++中,有时候,方法用于反映类的成员函数的概念。但是,最近我在“The C ++ Programming Language 4th Edition”一书中找到了一个声明,第586页“派生类”
虚函数有时称为方法。
这有点令人困惑,但他说有时,所以它大致有道理,C ++创建者倾向于看到方法,因为函数可以在对象上调用,并且可以表现为多态。
答案 31 :(得分:0)
一个类是一些数据和函数的集合,可选地带有构造函数。
在创建该特定类的实例(复制,复制)时,构造函数初始化该类并返回一个对象。
现在该类成为对象(没有构造函数) &安培; 函数在对象上下文中称为方法。
所以基本上
Class&lt; == new ==&gt; Object
功能&lt; == new ==&gt;方法
在java中,它通常被告知构造函数名称与类名相同,但实际上构造函数类似于实例块和静态块但具有用户定义的返回类型(即类类型)
虽然类可以有静态块,实例块,构造函数,函数 该对象通常只有数据和数据。方法
答案 32 :(得分:0)
仅用2个词:非静态(“实例”)方法将隐藏的指针指向“ this”(作为它们的第一个参数),这是您在其上调用该方法的对象。
这是与常规独立功能(尽管有动态调度)的唯一区别。
如果您有兴趣,请阅读以下详细信息。
虽然我所说的内容几乎可以应用于每种语言,但我会尽量简短些,并以C ++为例。
好的,我说没有实际区别。让我们深入一点:
除动态调度外,它就这么简单:
class User {
public string name; // I made it public intentionally
public void printName() {
cout << this.name << endl;
}
};
等同于
public getName(User & user) {
cout << user.name << endl;
}
因此,从本质上讲,user->printName()
只是getName(user)
的语法糖。
如果不使用动态调度,仅此而已。如果使用了 ,则涉及的内容会更多一些,但是编译器仍会发出以this
作为第一个参数的函数。
答案 33 :(得分:0)
方法和功能之间存在明显的区别,即:
功能是一段独立的代码,您可以在任何地方调用它,只需使用给定的参数提及其名称即可,例如大多数程序语言(例如C ++和python)。虽然
方法是专门与对象相关联的,这意味着您只能通过使用dot(。)表示法在对象之前先提及该对象来调用方法,例如在专门面向对象的语言(如C#和Java)中。
答案 34 :(得分:0)
method
是任何对象或类的成员。
function
是独立的。
但在 Javascript 的情况下,function
和 method
是可以互换的。
答案 35 :(得分:-1)
TL; DR
函数是要运行的一段代码。
方法是对象内部的函数。
函数示例:
runtime: nodejs10
service: test-angularjs
handlers:
- url: /(.*\.(js|css|svg)?(.*))
static_files: dist/\1
upload: dist/(.*)
- url: /(.*\.(png|xml|)?(.*))
static_files: dist/\1
upload: dist/assets/(.*)
- url: /
static_files: dist/index.html
upload: dist/index.html
- url: /(.*(a|pa|friends|faq).*)
static_files: dist/index.html
upload: dist/index.html
方法示例:
function sum(){
console.log("sum")l
}
所以这就是为什么我们说函数内的“ this”关键字不是很有用,除非我们将其与call,apply或bind一起使用..因为call,apply,bind会将该函数作为对象内部的方法调用>基本上它将功能转换为方法
答案 36 :(得分:-5)
Method是动作的名称。函数是方法的标识符。