Car*_*ate 135 java methods static static-methods terminology
我正在为一门课程的一些代码写一个解释,并且不小心使用了这些单词method并且function可以互换.我决定回过头来修改措辞,但在我的理解中遇到了一个漏洞.
根据我的理解,子程序是一个function如果它不作用于一个类的实例(它的效果仅限于它的显式输入/输出),并且是一个method如果它在一个类的实例上运行(它可能携带)对实例造成不纯的副作用).
这里有关于这个主题的很好的讨论.请注意,根据接受的答案的定义,静态method实际上应该是一个函数,因为实例永远不会被隐式传递,并且它不能访问任何实例的成员.
虽然这是心灵,但是静态methods实际上不应该是函数吗?
根据他们的定义,他们不会对某一类的特定情况采取行动; 由于关系,他们只与班级"捆绑".我已经看到一些好看的网站将静态子程序称为"方法"(Oracle,Fredosaurus,ProgrammingSimplified),所以要么它们都忽略了术语,要么我错过了一些东西(我的猜测是后者) .
我想确保我使用正确的措辞.
任何人都能清楚这一点吗?
小智 80
简单的答案是,当Java决定将所有东西称为"方法"时,他们并不关心理论计算机科学中的函数和方法之间的区别.
Tho*_* S. 26
静态方法并不完全是函数,区别是微妙的,但很重要.
只使用给定的输入参数的静态方法是本质上的功能.
但静态方法可以访问静态变量和其它静态函数(也使用静态变量)以便静态方法可以具有状态这是其可通过定义一个函数根本不同的无状态.(附录:虽然程序员通常不太习惯使用"功能"作为定义,但计算机科学中的严格功能只能访问输入参数).因此,定义访问静态字段的这种情况,说静态方法总是函数是无效的.
证明使用"静态方法"的另一个不同之处在于,您可以在C派生中定义全局函数和可在任何地方访问的全局变量.如果您无法访问包含静态方法的类,则这些方法也是不可访问的.因此,与全局函数相比,"静态方法"的设计范围受到限制.
Mik*_*ark 17
在Java中,用户定义的类实际上是java.lang.Class的子类的实例.
在这个意义上说,静态方法被安装到一个概念类的一个实例:它们连接到java.lang.Class的一个子类的实例.
考虑到这一点,术语"类方法"(Java的静态方法的替代名称)开始有意义.术语"类方法"可以在很多地方找到:Objective C,Smalltalk和JLS - 仅举几例.
Joo*_*gen 11
在计算机科学中,功能明确映射到静态方法.但是类的"方法"有点通用,比如"成员"(字段成员,方法成员).有像这样的措辞
数据成员和方法成员有两个单独的名称空间:.x和.x()可以共存.
所以原因是,正如哲学Ludwig Wittgenstein所说,语言是一种具有不同语境的工具."方法"是上面引用的一个很好的绰号,用于对"成员"进行分类.
你的想法是正确的,这是有道理的.它只是Java社区中没有建立的术语.让我解释一些内部结构,可以帮助理解术语存在的原因.
Java是一种基于类的面向对象语言.方法始终是类或实例的成员(这也是对其他编程语言有效的一般语句).我们认为类和实例都是对象.
您无法直接从类中调用此方法,您必须创建一个实例.每个实例都引用该方法.您可以使用完全相同的方法签名覆盖方法定义(在子类化时),即引用指向不同的方法(具有相同的签名,但可以具有不同的方法体).该方法是动态的.
您只能直接从类中调用此方法,即您不需要创建该类的实例.整个程序中只有一种全局定义.当方法声明为static时,您不能覆盖完全相同的方法签名,因为只有一个定义对整个程序有效.请注意,该方法是类对象本身的成员,实例具有对该方法的所有相同的唯一(和修复)引用.