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

我正在为一个课程的一些代码写一个解释,我不小心把 methodfunction这两个词交替使用了。我决定回去修改措辞,但在我的理解上遇到了一个漏洞。

根据我的理解,如果子程序不作用于类的实例(它的效果仅限于它的显式输入/输出) ,那么它就是 function; 如果子程序作用于类的实例,那么它就是 method(它可能会对使它不纯粹的实例产生副作用)。

关于这个话题有一个 讨论得不错。注意,根据接受的答案定义,静态 method实际上应该是一个函数,因为实例从未被隐式传递,而且它不能访问任何实例的成员。

然而,考虑到这一点,静态 methods实际上不应该是函数吗?

根据它们的定义,它们不作用于类的特定实例; 它们只是由于关系而“绑定”到类。我见过一些漂亮的网站把静态子例程称为“方法”(神使弗雷多龙程序简化) ,所以要么他们都忽略了术语,要么我漏掉了什么(我猜是后者)。

我想确认一下我的措辞是否正确。
有人能澄清一下吗?

8809 次浏览

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

在计算机科学中,功能清楚地映射到静态方法。但是类的“ method”有点泛型,比如“ member”(字段成员,方法成员)。有些词是这样的

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

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

8.4.3.2的这段话可能会有所帮助:

声明为 static的方法称为 类方法

未声明为 static的方法称为 实例方法[ ... ]。

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

Java 只是想让你“思考面向对象”。此外,静态方法可以访问可能包含状态的周围作用域。在某种程度上,类就像一个对象本身。

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

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

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

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

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

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

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

下面是另一个术语,使用 斯卡拉作为助记符:
在 Scala 中有 object,它是隐式定义类 < a href = “ http://en.wikipedia.org/wiki/Scala _% 28Programming _ language% 29”rel = “ nofollow noReferrer”> 1 的单例实例。

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

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

你的想法是对的,而且很有道理。这只是 Java 社区中尚未建立的术语。让我来解释一些内部知识,它们可以帮助理解为什么术语仍然存在。

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

实例方法(动态)

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

类方法(静态)

您只能从类中直接调用该方法,也就是说,您不需要创建该类的实例。这个方法在整个程序中只有一个全局定义。当方法声明为静态时,不能覆盖完全相同的方法签名,因为只有一个定义对整个程序有效。注意,该方法是类对象本身的成员,实例对该方法具有所有相同的唯一(和修复)引用。

当然,主要的区别是-method 可以使用静态字段,而不仅仅是方法参数。 但是还有一个-多态性! 计算 Class A.doTheSameStaticMethod ()和 ClassB.doTheSameStaticMethod ()的结果将取决于类。

每个类都有一个对象来表示它,它是 Class类的一个子类的实例。静态方法实际上是这些对象上的实例方法,它们是 Class 的子类的实例。它们可以以静态字段的形式访问状态,因此它们不仅仅是(无状态的)函数。它们是方法。