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