我正在为一门课程的一些代码编写解释,并且不小心互换使用了method
和function
这两个词。我决定回去修改措辞,但在我的理解上遇到了一个漏洞。
根据我的理解,子例程是function
,如果它不作用于类的示例(它的效果仅限于显式输入/输出),如果它作用于类的示例(它可能会对示例产生副作用,使其不纯),则是method
。
在这个主题上有一个good discussion here。请注意,根据接受答案的定义,静态method
实际上应该是一个函数,因为示例从未隐式传递,并且它没有访问任何示例的成员。
考虑到这一点,静态methods
实际上不应该是函数吗?
根据它们的定义,它们不作用于类的特定示例;他们只是因为关系而与类“绑定”。我看到一些好看的网站将静态子例程称为“方法”(Oracle,Fredosaurus,ProgrammingSimplified),所以要么他们都忽略了术语,要么我错过了一些东西(我猜是后者)。
我想确定我用的是正确的措辞。
”””谁能澄清这一点吗?***
9条答案
按热度按时间beq87vna1#
来自www.example.com的这句话8.4.3.2可能会有所帮助:
声明为
static
的方法称为 class method。未声明
static
的方法称为 instance method [...]。Java只是想让你“面向对象地思考”。另外,静态方法可以访问可能包括状态的周围范围。在某种程度上,类本身就像一个对象。
tzcvj98z2#
简单的答案是,当Java决定将所有东西都称为“方法”时,他们并不关心理论计算机科学中函数和方法之间的区别。
jm81lzqq3#
静态方法并不完全是函数,两者之间的区别很微妙,但很重要。
一个只使用给定输入参数的静态方法 * 本质上是一个函数。
但是静态方法可以访问静态变量和其他静态函数(也使用静态变量),所以静态方法可能有一个 * 状态 *,这与定义为 * 无状态 * 的函数根本不同。(附录:虽然程序员通常不严格使用“函数”作为定义,但计算机科学中的严格函数只能访问输入参数)。因此,定义这种访问静态字段的情况,说静态方法总是函数是不正确的。
使用“静态方法”的另一个区别是,你可以在C中定义全局函数和全局变量,它们可以在任何地方访问。如果你不能访问包含静态方法的类,那么这些方法也是不可访问的。因此,与全局函数相比,“静态方法”的作用域受到设计的限制。
rm5edbpk4#
在Java中,用户定义的类实际上是java.lang.Class的子类的示例。
在这个意义上,静态方法 * 是 * 附加到概念类的示例:它们被附加到java.lang.Class的子类的示例。
考虑到这一点,术语“类方法”(Java静态方法的替代名称)开始有意义。而“类方法”一词可以在很多地方找到:Objective C、Smalltalk和JLS --仅举几例。
ghhkc1vu5#
在计算机科学中,函数显然Map到静态方法。但是类的“方法”有点通用,就像“成员”(字段成员,方法成员)。有这样的措辞
数据成员和方法成员有两个单独的命名空间:. x和. x()可以共存。
究其原因,正如哲学家维特根斯坦所说,语言是一种具有不同语境的工具。“方法”在上面引用中是一个很好的名字,用来对“成员”进行分类。
jhdbpxl96#
你的想法是对的,也是有道理的。它只是在Java社区中还没有建立起来的术语。让我来解释一些内部因素,以帮助理解为什么这个术语存在。
Java是一种基于类的面向对象语言。方法总是类或示例的成员(这是一个通用语句对其他编程语言也有效)。我们认为类和示例都是对象。
示例方法(动态)
不能直接从类调用此方法,必须创建示例。每个示例都引用该方法。你可以用完全相同的方法签名覆盖一个方法定义(当子类化时),即该参考指向不同的方法(其具有相同的签名,但可以具有不同的方法主体)。该方法是动态的。
类方法(静态)
您只能直接从类调用此方法,即你不需要创建这个类的示例。在整个程序中,该方法只有一个全局定义。当方法声明为静态时,不能覆盖完全相同的方法签名,因为只有一个定义对整个程序有效。请注意,方法是类对象本身的成员,示例对该方法具有相同的唯一(和固定)引用。
6xfqseft7#
下面是另一个术语,使用Scala作为助记符:
在Scala中,你有
object
s,它们是隐式定义的类1的单例示例。根据您的定义,我们可以调用这些属于
object
方法的子例程,因为它们在类的单个示例上操作。此外,对象 * 还将定义类A,并将对象A中的所有方法创建为类A上的静态方法(用于与Java接口)*[2]。
因此,我们可以说Java类A的静态方法访问的成员与Scala单例示例相同,根据您的定义,这应该被称为类A的(静态)方法。
qmelpv7a8#
当然,主要的区别是- method可以使用静态字段,而不仅仅是方法参数。但还有一个-多态性!A.doTheSameStaticMethod()类和B. doTheSameStaticMethod()类的评估结果将取决于类。在这种情况下,功能是无效的。
iszxjhcz9#
每个类都有一个对象来表示它,该对象是
Class
类的子类的示例。静态方法实际上是这些对象上的示例方法,这些对象是Class的子类的示例。它们可以以静态字段的形式访问状态,因此它们并不局限于(无状态)函数。它们是方法。