为什么静态方法被认为是一种方法?

时间:2015-05-22 17:00:23

标签: java methods static static-methods terminology

我正在为一门课程的一些代码写一个解释,并且偶然使用了methodfunction这两个词。我决定回过头来修改措辞,但在我的理解中遇到了一个漏洞。

根据我的理解,如果一个子例程不对一个类的实例起作用(它的效果仅限于其显式输入/输出),则子例程是function,并且是method如果它在一个类的实例上运行(它可能会对实例产生副作用,使其不纯)。

这个主题有一个good discussion here。请注意,根据接受的答案的定义,静态method实际上应该是一个函数,因为实例永远不会被隐式传递,并且它不能访问任何实例的成员。

尽管如此,静态methods实际上不应该是函数吗?

根据他们的定义,他们不会对某一类的特定情况采取行动;由于关系,他们只与班级“捆绑”。我已经看到一些看起来很好的网站,它们将静态子程序称为“方法”(OracleFredosaurusProgrammingSimplified),所以要么它们都忽略了术语,要么我错过了一些东西(我的猜测是后者)。

我想确保使用正确的措辞 有人可以解决这个问题吗?

9 个答案:

答案 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的子类的实例。它们可以以静态字段的形式访问状态,因此它们不仅限于(无状态)函数。它们是方法。