能否简单解释一下在面向对象编程中方法和函数的区别?
函数是通过名称调用的代码片段。它可以传递要操作的数据(即参数),并可以选择性地返回数据(返回值)。所有传递给函数的数据都是明确传递的。
方法是通过与对象关联的名称调用的代码片段。在大多数方面,它与函数相同,除了两个关键区别:
(这是一个简化的解释,忽略了scope等问题。)
一个方法是属于对象的或者静态的属于类的。
一个函数则是独立于任何对象(并且在任何类之外)。
对于Java和C#,只有方法存在。
对于C语言,只有函数存在。
对于C++和Python,则要看你是否在一个类中使用。
但用基础英语来说:
事实上,它们之间并没有太大区别,只是相同概念的不同表述。
[晚期添加]
实际上,正如Brian Neal在对此问题的评论中指出的那样,C++标准在涉及成员函数时从未使用过术语“method”。某些人可能会将其视为C++不是真正的面向对象语言的迹象;然而,我更愿意将其视为一群相当聪明的人认为没有特别强烈的理由使用不同的术语的迹象。
"self
参数是显式的。许多语言具有静态方法,这些方法不会传递实例。 - Max Heiberthis
或 self
,但这些结构通常被称为函数,而不是方法。 - ty1824通常,方法是属于一个类的函数,而函数可以在代码的任何其他范围内,因此您可以说所有方法都是函数,但并非所有函数都是方法:
以下是Python示例:
class Door:
def open(self):
print 'hello stranger'
def knock_door():
a_door = Door()
Door.open(a_door)
knock_door()
给出的示例展示了一个名为“Door”的类,其中有一个叫做“open”的方法或动作。它被称为方法是因为它在类内部声明。代码的另一部分是在下面使用“def”定义一个函数,它是一个函数,因为它没有在类内部声明。正如您所看到的,这个函数调用了我们在类中定义的方法,最后这个函数被自己调用。记忆方法:
Function和Method的主要区别可以通过以下非常通俗易懂的定义简单解释:
请注意,原文中的html标签已经被保留。Function是在类外定义的,而Method是在类内定义并作为类的一部分。
面向对象编程的理念在于将软件视为由“对象”组成。现实世界中的对象具有属性。例如,如果您有一个员工对象,那么该员工具有姓名、员工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)没有涵盖面向对象编程范式,所以它们只称这些工件为“函数”。
例如,在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,它们在实现上可能看起来相同,但在面向对象的文档中它们被称为方法。
这里是之前在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采用“自然语言”比喻的思想,这一点类似于某些面向对象编程语言(例如Smalltalk)。希望您在阅读本文后更容易理解面向对象中的方法。
注意:代码只是作为示例,无需编译。欢迎修改本文并添加Python示例。
假设一个函数是一段代码块(通常具有自己的作用域,有时也具有自己的闭包),它可能接收一些参数并且可能返回结果。
方法是由对象拥有的函数(在某些面向对象系统中,更正确的说法是由类拥有)。被对象/类“拥有”意味着您通过对象/类引用该方法;例如,在Java中,如果您想调用对象“door”拥有的方法“open()”,则需要编写“door.open()”。
通常,方法还获得一些额外的属性,描述它们在对象/类中的行为,例如:可见性(与面向对象概念的封装相关),它定义了可以从哪些对象(或类)调用该方法。
在许多面向对象语言中,所有的“函数”都属于某个对象(或类),所以在这些语言中没有不是方法的函数。
方法是类的函数。在正常的术语中,人们经常混用方法和函数。基本上你可以将它们视为相同的东西(不确定全局函数是否称为方法)。
if(class(object)) { ... } else {stop()}
在概念上等同于方法吗? - Konrad