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

Java 为什么静态方法被认为是一种方法?,java,methods,static,static-methods,terminology,Java,Methods,Static,Static Methods,Terminology,我正在为一门课程的一些代码编写解释,并且无意中互换使用了method和function。我决定回去修改措辞,但在理解上遇到了一个漏洞 据我所知,如果子例程不作用于类的实例(其效果仅限于其显式输入/输出),则它是一个函数,如果它作用于类的实例(可能对实例产生副作用,使其不纯),则它是一个方法 关于这个话题有一个很好的解释。请注意,根据公认答案的定义,静态方法实际上应该是一个函数,因为实例从未被隐式传递,并且它无权访问任何实例的成员 然而,有了这一点,静态方法不应该是函数吗 根据它们的定义,它们不作

我正在为一门课程的一些代码编写解释,并且无意中互换使用了
method
function
。我决定回去修改措辞,但在理解上遇到了一个漏洞

据我所知,如果子例程不作用于类的实例(其效果仅限于其显式输入/输出),则它是一个
函数
,如果它作用于类的实例(可能对实例产生副作用,使其不纯),则它是一个
方法

关于这个话题有一个很好的解释。请注意,根据公认答案的定义,静态
方法实际上应该是一个函数,因为实例从未被隐式传递,并且它无权访问任何实例的成员

然而,有了这一点,静态
方法不应该是函数吗

根据它们的定义,它们不作用于类的特定实例;他们只是因为关系而与班级“联系”在一起。我见过一些好看的站点,它们将静态子例程称为“方法”(methods),所以要么它们都忽略了术语,要么我遗漏了一些东西(我猜是后者)

我想确定我使用的措辞是否正确。

有人能澄清这一点吗?

简单的答案是,当Java决定将所有东西都称为“方法”时,他们并不关心理论计算机科学中函数和方法之间的区别。

在计算机科学中函数显然映射为静态方法。但类的“方法”有点泛型,比如“成员”(字段成员、方法成员)。有这样的措辞

数据成员和方法成员有两个单独的名称空间:.x和.x()可以共存

所以原因是,正如哲学家路德维希·维特根斯坦所说,语言是一种具有不同语境的工具。在上面的引文中,“方法”是一个很好的名字,用于对“成员”进行分类。

这段引文可能有助于:

声明为静态的方法称为类方法

未声明为静态的方法称为实例方法[…]

  • 类方法:与类关联
  • 实例方法:与实例关联

Java只是希望您“考虑面向对象”。此外,静态方法可以访问可能包含状态的周围范围。在某种程度上,类本身就像一个对象。

在Java中,用户定义的类实际上是Java.lang.class子类的实例

从这个意义上讲,静态方法附加到概念类的实例:它们附加到java.lang.class子类的实例


考虑到这一点,术语“类方法”(Java静态方法的另一个名称)开始有意义了。术语“类方法”可以在很多地方找到:Objective C、Smalltalk和JLS——仅举几个例子。

静态方法并不完全是函数,区别很细微,但很重要

仅使用给定输入参数的静态方法本质上是一个函数

但是静态方法可以访问静态变量和其他静态函数(也可以使用静态变量),因此静态方法的状态可能与定义为无状态的函数的状态根本不同。 (附录:虽然程序员通常不严格使用“函数”作为定义,但计算机科学中严格的函数只能访问输入参数)。因此,在定义这种访问静态字段的情况时,不能说静态方法总是函数


使用“静态方法”的另一个区别是,您可以在C中定义全局函数和全局变量,这些函数和变量可以在任何地方访问。如果无法访问包含静态方法的类,则这些方法也无法访问。因此,与全局函数相比,“静态方法”在其范围内受到设计的限制。

这里是对术语的另一种理解,用作助记符:
在Scala中有
object
s,它们是隐式定义的类的单例实例

根据您的定义,我们可以调用属于
对象
方法的这些子例程,因为它们操作类的单个实例。
此外,该对象还将定义类A,并将对象A中的所有方法创建为类A上的静态方法(用于与Java接口)


因此,我们可以说Java类A的静态方法访问与Scala singleton实例相同的成员,根据您的定义,Scala singleton实例应该被称为类A的(静态)方法。

您的想法是正确的,这是有意义的。它只是在Java社区中还没有建立起来的术语。让我解释一些有助于理解术语为何存在的内部内容

Java是一种基于类的面向对象语言。方法始终是类或实例的成员(这也是对其他编程语言有效的通用语句)。我们认为类和实例都是对象

实例方法(动态) 不能直接从类调用此方法,必须创建实例。每个实例都引用该方法。您可以使用完全相同的方法签名(子类化时)覆盖方法定义,即引用指向不同的方法(具有相同的签名,但可以具有不同的方法体)。该方法是动态的

类方法(静态) 您只能从类直接调用此方法,即不需要创建该类的实例。在整个程序中,该方法只有一个全局定义。当方法声明为静态时,不能覆盖完全相同的方法签名,因为只有一个定义对整个程序有效。不