Java:子程序和方法有什么区别?

4

有什么不同之处?

public write(){
// dostuff
}

上面的代码是一个子例程、方法还是程序块?
我不理解这些术语,因为它们的含义都非常相似?
那么,如果我非常严格和学究式地看待,那应该是哪个?我更喜欢称它们为子例程,这严格正确吗?
编程语言:JAVA
编辑: 谢谢,我现在明白了,但最安全的叫法是什么?程序块? 我使用多种编程语言,术语“程序块”是否足够?
我能把函数称为块吗?
那么我可以把所有东西都称为块吗?这样会更容易,对吗?
我不会把块称为函数或子例程,但我会把函数、方法和任何东西都称为块。这样称呼可以吗?
这是否意味着以下说法有一定准确性? 局部变量未在程序块外访问(是的,有些情况下不是这样)。

10
除非是构造函数,否则这是编译错误。 - AllTooSir
没有人会在Java中称任何东西为子程序。如果你的语法正确,我们会称之为方法。 - Sotirios Delimanolis
我可以把函数称为块吗?但并不是每个块都是一个函数/方法.....(希望如此) - pinkpanther
4个回答

5
  1. 子程序是可以被调用并返回结果的。
  2. 函数是一个返回值的子程序。
  3. 方法是面向对象语言中可以在对象上调用的子程序或函数。

3

以上都不正确,因为它没有返回值。只有在文件write.java中,是一个名为write的类的无参数构造函数时,它才是“正确”的。即使如此,这也违反了Sun Java编码标准。

子例程是来自FORTRAN和COBOL等函数/过程式语言的术语。这些语言将数据和方法分开,方法对它们所接收到的数据进行操作。

对象将数据和方法封装成实例。大多数面向对象的程序员更喜欢使用方法。如果你坚持使用子例程,可能会被认为是过时的。

我很少听到“子例程”这个词了。如果我是你,我会习惯使用“方法”这个词。


1
首先,你所拥有的是一个构造函数,而不是一个方法。一个正确的返回void(空)的方法应该像这样(根据C#或Java语法):
public void write()
{}

现在,关于您最初提出的问题:子程序和方法之间有什么区别?实际上基本上没有区别。但是如果您想深入了解,那么我们就必须去看汇编编程。在汇编中,子程序与方法实际上有两个不同之处:
  1. 它们不会传递参数
  2. 它们不返回任何内容
您可能会问自己:那么我到底该如何处理任何东西,这个子程序怎么工作呢?在汇编中,这就是寄存器发挥作用的地方,而不是像高级编程语言中的方法一样将参数传递给您的子程序,您必须在调用子程序之前保存要处理的值(参数),确保在到达子程序之前不会影响此值。同样,您将在另一个寄存器中保留生成的值以供稍后使用。
在汇编中还有其他常用的方法来完成此操作,例如使用堆栈将值推入和弹出值,但我认为我已经足够清楚地表达了我的观点。如果需要,我将为您发布一段使用简单子程序添加两个数字的汇编代码。
org 00H

mov R3,#10                 ;save the first parameter
mov R4,#20                 ;save the second parameter

call Sum                   ;execute the subroutine

mov A,R3                   ;mov 30 to accumulator

Sum:                       ;subroutine declaration
add R3,R4
ret

end

0
它们只是用于标识不同类型可调用结构的术语。Subroutine并不是一个真正被“移植”到Java中的术语,事实上现在已经很少使用了。在旧语言中,它常用来表示“执行可重复使用的代码并返回此处”。这有点笼统,它没有指定参数传递或返回的位置。这个术语主要用于具有共享内存的系统(Basic中的公共变量,汇编中的系统内存等),但我认为它确实可以适用于任何可重用的代码。
更具体的术语通常使用“Function”。从技术上讲,(纯)函数必须始终对给定参数集返回相同的结果。作为“Subroutine”的替代品,在非面向对象语言中这是一个好的选择,它比子程序更清晰,因为它指定了值如何传递并暗示您不仅仅是访问任意内存,从技术上讲它可能仍然是一个子程序。
术语“Function”并不总是适用于面向对象的语言。在面向对象的语言中,我们添加了“对象”的概念来封装数据并为您执行该数据的工作。当您调用像atomicInteger.incrementAndGet()这样的方法时,它可能(肯定会!)通过改变对象内部的某些内容而每次返回不同的值。这不再符合函数的定义(对于相同的参数返回不同的结果),因此它们称之为方法。它仍然可以归入一般术语“子例程”,但在面向对象的语言中这样做会令人困惑且不够具体,所以我们就不这样做了。
因此,Java既可以有函数也可以有方法。字符串上的每个例程都是函数,因为它们都不修改底层对象的状态(因此,在字符串上调用给定函数始终返回相同的值)。方法可以修改对象的状态。
当您试图使对象安全地进行多线程和共享时,这些差异变得非常重要-您不应该同时从多个线程调用方法,但函数则没有问题。请注意,这使得任何使用字符串的线程使用都是安全的,因为它全部都是函数(只有函数的对象也称为不可变对象)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接