方法和函数有什么区别?

有人可以在OOP上下文中提供方法功能的简单说明吗?


#1楼

对我来说:如果我同意:方法的功能和函数的功能是相同的:

  • 一个函数可能返回一个值
  • 可能期望参数

就像任何一段代码一样,您可能要放入对象,结果可能会有对象。 在这样做的过程中,它们可能会更改对象的状态,但不会更改它们的基本功能。

对象或其他代码的调用函数可能存在定义差异。 但这不是语言区别的原因,这就是人们互换它们的原因吗? 我会小心地提到计算示​​例。 因为我雇用了员工来进行计算:

new Employer().calculateSum( 8, 8 );

通过这种方式,我可以依靠雇主负责计算。 如果他想要更多的钱,我就释放他,让垃圾收集员处理未使用的雇员的职能剩下来,然后再找一个新雇员。

即使争论一个方法是一个对象函数而一个函数是未连接的计算对我也没有帮助。 函数描述符本身以及理想情况下的函数文档将告诉我它需要什么以及它可能返回什么。 其余的,比如操纵某些对象的状态,对我来说并不是真正透明的。 我确实希望函数和方法都可以交付和操纵他们所要求的内容,而无需详细了解他们是如何做到的。 即使是纯计算功能也可能会更改控制台的状态或附加到日志文件。


#2楼

“方法”“功能”的面向对象的单词。 这几乎就是它的全部(即,没有真正的区别)。

不幸的是,我认为这里的许多答案可以使存在某些复杂的,有意义的差异的想法永存或发展。

真的-没有太多的东西,只是同一件事的不同词。

[后期补充]


实际上,正如Brian Neal在对此问题的评论中指出的那样,C ++标准在引用成员函数时从不使用术语“方法”。 有人可能会认为这表明C ++并不是真正的面向对象的语言。 但是,我更倾向于将其作为一种指示,即相当聪明的一群人认为没有特别强烈的理由使用另一个术语。


#3楼

方法在对象上。
功能独立于对象。

对于Java,只有方法。
对于C,只有功能。

对于C ++,这取决于您是否在课堂上。


#4楼

方法是类的功能。 用普通的术语来说,人们总是在交换方法和功能。 基本上,您可以将它们视为同一件事(不确定全局函数是否称为方法)。

http://en.wikipedia.org/wiki/Method_(computer_science)


#5楼

根据我的理解,方法是可以在类上执行的任何操作。 它是编程中的通用术语。

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

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


#6楼

假设一个函数是一块代码块(通常具有自己的作用域,有时带有自己的闭包),可以接收一些自变量并且还可以返回结果。

方法是对象所拥有的功能(在某些面向对象的系统中,更确切地说它是类所拥有的)。 被对象/类“拥有”意味着您通过对象/类来引用该方法。 例如,在Java中,如果要调用对象“门”拥有的方法“ open()”,则需要编写“ door.open()”。

通常,方法还会获得一些额外的属性来描述它们在对象/类中的行为,例如:可见性(与封装的面向对象概念有关),它定义了可以从哪些对象(或类)中调用该方法。

在许多面向对象的语言中,所有“功能”都属于某个对象(或类),因此在这些语言中,没有不属于方法的功能。


#7楼

在OO世界中,两者通常用来表示同一件事。

从纯Math和CS的角度来看,使用相同的参数(f(x,y)=(x + y))调用时,函数将始终返回相同的结果。 另一方面,方法通常与类的实例相关联。 同样,大多数现代的OO语言在大多数情况下不再使用术语“功能”。 许多静态方法可以像函数一样,因为它们通常没有状态(并不总是为真)。


#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"
   }
}

#9楼

在诸如对象Pascal或C ++之类的OO语言中,“方法”是与对象关联的功能。 因此,例如,“狗”对象可能具有“吠叫”功能,因此将其视为“方法”。 相反,“ StrLen”函数是单独存在的(它提供了作为参数提供的字符串的长度)。 因此,它只是一个“功能”。 从技术上讲,JavaScript也是面向对象的,但是与成熟的语言(如C ++,C#或Pascal)相比,JavaScript面临许多限制。 尽管如此,区别仍然应保持。

还有两个事实:C#是完全面向对象的,因此您不能创建独立的“函数”。 在C#中,每个函数都绑定到一个对象,因此从技术上讲,它是一种“方法”。 更重要的是,在C#中很少有人将它们称为“方法”,他们只是使用“函数”一词,因为没有任何真正的区别。

最后,Pascal专家也区分了“函数”(返回值)和“过程”(没有返回值),因此,任何Pascal专家都不会在这里碰到我。 尽管您可以选择是否返回值,但是C#并未明确区分这种区别。


#10楼

对于一阶近似而言,方法(C ++样式OO)是成员函数的另一个词,该成员函数是类的一部分。

在像C / C ++这样的语言中,您可以具有一些不是类成员的函数; 您不会将与类无关的函数称为方法。


#11楼

函数是按名称调用的一段代码。 可以传递数据以对其进行操作(即参数),还可以选择返回数据(返回值)。 传递给函数的所有数据都被显式传递。

方法是一段与对象关联的名称所调用的代码。 在大多数方面,它与功能相同,但有两个主要区别:

  1. 方法被隐式传递给调用该方法的对象。
  2. 方法能够对类中包含的数据进行操作(记住,对象是类的实例-类是定义,对象是该数据的实例)。

(这是一个简化的解释,忽略了范围问题等。)


#12楼

如果您想在这里阅读“我对OO方法的介绍”

面向对象范例背后的思想是“威胁”该软件由..好“对象”组成。 现实世界中的对象具有属性,例如,如果您有一个Employee,该雇员具有姓名,雇员ID,职位,他属于部门等,等等。

该对象还知道如何处理其属性并对其执行一些操作。 假设我们想知道某个员工现在在做什么,我们会问他。

employe whatAreYouDoing.

“ whatAreYouDoing”是发送给对象的“消息”。 对象知道如何回答该问题,据说它具有解决该问题的“方法”。

因此,对象必须公开其行为的方式称为方法。 因此,方法是工件对象必须“做”某事。

其他可能的方法是

employee whatIsYourName
employee whatIsYourDepartmentsName

等等

另一方面,函数是编程语言计算某些数据的方式,例如,您可能具有返回16的函数addValues(8,8)

// 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;
}

说一个对象具有执行某项操作的“功能”并不是“自然的”,因为功能与数学上的东西相关性更高,而雇员对数学的了解却很少,但是您可以拥有与功能完全相同的方法,例如在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示例。


#13楼

通常,方法是属于类的函数,函数可以在代码的任何其他范围内,因此您可以声明所有方法都是函数,但并非所有函数都是方法:

以以下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类,则仅在该类内部具有树皮函数是有意义的,那将是一种方法;如果您也具有Person类,则对编写一个不属于任何类别的函数“ feed”,因为人类和狗都可以被喂食,您可以调用该函数,因为它特别不属于任何类别。


#14楼

函数是数学概念。 例如:

f(x,y) = sin(x) + cos(y)

表示函数f()将返回添加到第二个参数余弦的第一个参数的正弦值。 这只是数学。 碰巧sin()和cos()也是函数。 函数具有另一个属性:对具有相同参数的函数的所有调用应返回相同的结果。

另一方面,方法是与面向对象语言中的对象相关的功能。 它有一个隐式参数:作用于对象(及其状态)。

因此,如果您的对象Z具有方法g(x),则可能会看到以下内容:

Z.g(x) = sin(x) + cos(Z.y)

在这种情况下,与前面的函数示例相同,将传入参数x。 但是,cos()的参数是一个位于对象Z内的值。Z和其内的数据(Zy)是Z的g()方法的隐式参数。


#15楼

自从您提到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方法(因为我在类中定义了它,因此使用了“点”语法):

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 !,您将开始明白它们的用处。某些语言还使方法可以对对象的某些位进行特殊访问。但是主要的概念差异仍然是隐藏的多余参数。)


#16楼

我不是专家,但这是我所知道的:

  1. 函数是C语言术语,指的是一段代码,函数名称将是使用此函数的标识符。

  2. 方法是OO术语,通常在功能参数中具有this指针。 您不能像C那样调用这段代码,需要使用object来调用它。

  3. 调用方法也不同。 在这里调用含义来找到这段代码的地址。 C / C ++,链接时间将使用功能符号定位。

  4. Objecive-C是不同的。 调用的含义是C函数使用数据结构查找地址。 这意味着在运行时一切都是已知的。


#17楼

函数或方法是一段可命名的可调用代码,它执行一些操作并有选择地返回一个值。

C语言中,使用术语功能。 JavaC#人们会说它是一种方法(在这种情况下,一个函数是在类/对象中定义的)。

C ++程序员可能将其称为函数或方法(取决于他们是编写程序样式的c ++代码还是采用面向对象的C ++方式,而且仅C / C ++的程序员也可能将其称为函数,因为术语“方法”是在C / C ++文献中较少使用)。

您可以通过调用函数的名称来使用它,例如,

result = mySum(num1, num2);


您可以通过先引用对象来调用方法,例如,

result = MyCalc.mySum(num1,num2);

#18楼

关于函数方法之间主要区别的一个非常笼统的定义:

函数是在类外部定义的,而方法是在类内部和部分的内部定义的。


#19楼

恕我直言,人们只是想发明一个新词来简化程序员在引用对象内部函数时的通信。

如果您说的是方法,则意味着在类内部使用函数。 如果您说的是函数,则意味着仅是课堂外的函数。

事实是两个词都用来描述功能。 即使您错误地使用了它,也不会发生任何错误。 这两个词很好地描述了您想要在代码中实现的目标。

函数是一种代码,它必须起某些作用( 一个函数 )。 方法是解决问题的一种方法

它做同样的事情。 是同一回事。 如果您想超精确并遵守约定,则可以将方法作为对象内部的函数来调用。


#20楼

函数是主要属于面向过程的编程的概念,其中函数是可以处理数据并返回值的实体

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


#21楼

函数是一组可用于处理数据的逻辑。

而Method是用于处理其所属对象的数据的函数。 从技术上讲,如果您有一个与您的类不完全相关但在类中声明的函数,则它不是方法; 这称为不良设计。


#22楼

从历史上看,“方法”是不返回值的东西,而“功能”是不返回值的东西,可能会有细微的差别。每种语言都有其自己具有特殊含义的术语词典

“ C”中 ,单词“功能”表示程序例程

Java中 ,术语“函数”没有任何特殊含义。 而“方法”是指构成类的实现的例程之一。

C#中 ,它将转换为:

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

但实际上,我重申,这两个概念确实没有区别。 如果您在有关Java的非正式讨论中使用“功能”一词,人们会认为您的意思是“方法”并继续下去。 不要在有关Java的适当文档或演示文稿中使用它,否则会显得很傻。


#23楼

我知道许多其他人已经回答了,但是我发现以下是一个简单而有效的单行答案。 尽管它看起来并不比其他答案好很多,但是如果您仔细阅读它,就可以了解方法与函数的所有知识。

方法是具有定义的接收方的函数,按OOP术语,方法是对象实例上的函数。


#24楼

在C ++中,有时,方法用于反映类的成员函数的概念。 但是,最近我在第586页“派生类”的《 C ++编程语言第四版》一书中找到了一条声明。

虚函数有时称为方法。

这有点令人困惑,但是他有时说,所以这很有意义,C ++创建者倾向于看到方法,因为函数可以在对象上调用并且可以表现为多态。


#25楼

这是一些使用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对象方法函数有关原型的更多信息


#26楼

记住的简单方法:

  • ˚F油膏→˚FREE(免费意味着不属于一个对象或类)
  • 中号 ethod→M余烬(对象或类的一个成员)

#27楼

让我们不要过于复杂,这应该是一个非常简单的答案。 方法和功能是同一回事。 当函数在类外部时,可以将其称为函数,而在类内部写入函数时,可以将其称为方法。


#28楼

方法和功能之间的差异

通过阅读有关Microsoft的文档

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

因此,方法是功能的子集。 每个方法都是一个函数,但并非每个函数都是一个方法,例如,不能将constructor称为方法,而是一个函数。


#29楼

类是一些数据和函数的集合,可以选择使用构造函数。

在创建该特定类的实例(副本,复制)时,构造函数将初始化该类并返回一个对象。

现在,该类成为对象(没有构造函数),而函数在对象上下文中称为方法。

所以基本上

类<== new ==> Object

函数<== new ==>方法

在Java中,通常将其告知构造函数名称与类名称相同,但实际上,构造函数就像实例块和静态块一样,但是需要用户定义返回类型(即Class类型)

虽然类可以具有静态块,实例块,构造函数,函数,但对象通常仅具有数据和方法。


#30楼

函数-独立代码中的函数,其中包含一些逻辑, 必须独立调用 并在类外部定义。

方法-方法是一段独立的代码,它参考某个对象而调用,并在类内部定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值