首页 文章

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

提问于
浏览
129

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

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

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

虽然这是心灵,但不应该静态 methods 实际上是函数?

根据他们的定义,由于关系,他们只是为了这个 class 而已经"tied" . 我已经看到一些看起来很好看的静态子程序为"methods"虽然(OracleFredosaurusProgrammingSimplified),所以要么他们缺少某些东西(我的猜测是后者) .

我想确保我使用正确的措辞 .
Can anybody clear this up?

9 回答

  • 7

    来自8.4.3.2的引用可能会有所帮助:

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

    • 类方法:与类关联 .

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

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

  • 9

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

  • 26

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

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

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

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

  • 1

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

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

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

  • 120

    在计算机科学 function 清楚地映射到静态方法 . 但"method"的类有点通用,如"member"(字段成员,方法成员) . 有像这样的措辞

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

    原因是,正如哲学Ludwig Wittgenstein所说,语言是一种具有不同语境的工具 . “方法”是上面引用的一个很好的绰号,用于对“成员”进行分类 .

  • 17

    你的想法是正确的,这是有道理的 . 它只是Java社区中没有 Build 的术语 . 让我解释一些内部结构,可以帮助理解术语存在的原因 .

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

    实例方法(动态)

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

    类方法(静态)

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

  • 76

    这是术语的另一种看法,使用Scala作为助记符:
    在Scala中,您有 object s,它们是隐式定义的类1的单例实例 .

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

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

  • 2

    当然,主要的区别是 - 方法可以使用静态字段,而不仅仅是方法参数 . 但还有一个 - 多态性!评估结果类A.doTheSameStaticMethod()和ClassB.doTheSameStaticMehod()将取决于类 . 在这种情况下,功能无能为力 .

  • 11

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

相关问题