我正在为一门课程的一些代码写一个解释,并且偶然地使用了 method
和 function
这两个词 . 我决定回过头来修改措辞,但在我的理解中遇到了一个漏洞 .
根据我的理解,子程序是 function
如果它不作用于类的实例(其效果仅限于其显式输入/输出),并且如果它在类的实例上运行则是 method
(它可能会对使其不纯的实例产生副作用) .
关于这个话题有一个good discussion here . 请注意,根据接受的答案的定义,静态 method
实际上应该是一个函数,因为实例永远不会被隐式传递,并且它不会成为_953431的成员 .
虽然这是心灵,但不应该静态 methods
实际上是函数?
根据他们的定义,由于关系,他们只是为了这个 class 而已经"tied" . 我已经看到一些看起来很好看的静态子程序为"methods"虽然(Oracle,Fredosaurus,ProgrammingSimplified),所以要么他们缺少某些东西(我的猜测是后者) .
我想确保我使用正确的措辞 .
Can anybody clear this up?
9 回答
来自8.4.3.2的引用可能会有所帮助:
类方法:与类关联 .
实例方法:与实例关联 .
Java只是希望你“思考面向对象” . 此外,静态方法可以访问可能包含状态的周围范围 . 在某种程度上,这个类就像一个对象本身 .
简单的答案是,当Java决定将所有东西称为“方法”时,他们并不关心理论计算机科学中函数和方法之间的区别 .
静态方法并不完全是函数,区别是微妙的,但很重要 .
仅使用给定输入参数的静态方法本质上是一个函数 .
但是静态方法可以访问静态变量和其他静态函数(也使用静态变量),因此静态方法可能具有与根据定义无状态的函数根本不同的状态 . (附录:虽然程序员通常不太严格使用"function"作为定义,但计算机科学中的严格功能只能访问输入参数) . 因此,定义访问静态字段的这种情况,说静态方法总是函数是无效的 .
证明使用“静态方法”的另一个不同之处在于,您可以在C派生中定义全局函数和可在任何地方访问的全局变量 . 如果您无法访问包含静态方法的类,则这些方法也是不可访问的 . 因此,与全局函数相比,“静态方法”的设计范围受到限制 .
在Java中,用户定义的类实际上是java.lang.Class的子类的实例 .
从这个意义上讲,静态方法附加到概念类的实例:它们附加到java.lang.Class的子类的实例 .
考虑到这一点,术语“类方法”(Java的静态方法的替代名称)开始有意义 . 术语“类方法”可以在很多地方找到:Objective C,Smalltalk和JLS - 仅举几例 .
在计算机科学 function 清楚地映射到静态方法 . 但"method"的类有点通用,如"member"(字段成员,方法成员) . 有像这样的措辞
原因是,正如哲学Ludwig Wittgenstein所说,语言是一种具有不同语境的工具 . “方法”是上面引用的一个很好的绰号,用于对“成员”进行分类 .
你的想法是正确的,这是有道理的 . 它只是Java社区中没有 Build 的术语 . 让我解释一些内部结构,可以帮助理解术语存在的原因 .
Java是一种基于类的面向对象语言 . 方法始终是类或实例的成员(这也是对其他编程语言有效的一般语句) . 我们认为类和实例都是对象 .
实例方法(动态)
您无法直接从类中调用此方法,您必须创建一个实例 . 每个实例都引用该方法 . 您可以使用完全相同的方法签名覆盖方法定义(在子类化时),即引用指向不同的方法(具有相同的签名,但可以具有不同的方法体) . 该方法是动态的 .
类方法(静态)
您只能直接从类中调用此方法,即您不需要创建该类的实例 . 整个程序中只有一种全局定义 . 当方法声明为static时,您不能覆盖完全相同的方法签名,因为只有一个定义对整个程序有效 . 请注意,该方法是类对象本身的成员,实例具有对该方法的所有相同的唯一(和修复)引用 .
这是术语的另一种看法,使用Scala作为助记符:
在Scala中,您有
object
s,它们是隐式定义的类1的单例实例 .根据您的定义,我们可以调用这些属于
object
methods 的子例程,因为它们在类的单个实例上运行 .此外,该对象还将定义类A,并将对象A中的所有方法创建为类A上的静态方法(用于与Java连接)[2] .
因此,我们可以说Java类A的静态方法访问与Scala单例实例相同的成员,根据您的定义,它们应该被调用(静态) methods 的A类 .
当然,主要的区别是 - 方法可以使用静态字段,而不仅仅是方法参数 . 但还有一个 - 多态性!评估结果类A.doTheSameStaticMethod()和ClassB.doTheSameStaticMehod()将取决于类 . 在这种情况下,功能无能为力 .
每个类都有一个对象来表示它,它是
Class
类的子类的一个实例 . 静态方法实际上是这些对象上的实例方法,它们是Class的子类的实例 . 它们可以以静态字段的形式访问状态,因此它们不仅限于(无状态)函数 . 他们是方法 .