3

有什么区别?

public write(){
// dostuff
}

上面的代码是子程序、方法还是程序块?

我不明白这些术语,因为它们的含义都如此相似?

所以,如果我非常严格和迂腐,那会是哪一个?我更喜欢称它们为子程序,这严格正确吗?

编程语言:JAVA

编辑:谢谢,我现在明白了,但最安全的称呼是什么?堵塞?我使用多种编程语言,“块”一词是否足够?

我可以将函数称为块吗?

那么我可以将所有内容都称为一个块吗?对我来说会更容易,对吧?

我不会将块称为函数或子例程,但我会将函数、方法和任何东西称为块。将它们称为一个块可以吗?

那么,这是否意味着这有点准确?不能在程序块之外访问局部变量(是的,在某些情况下这是不正确的)。

4

4 回答 4

5
  1. 子例程是您可以调用并返回给您的东西。
  2. 函数是返回一个值的子例程。
  3. 方法是可以在 OO 语言中对对象调用的子例程或函数。
于 2013-05-27T00:03:50.797 回答
2

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

子程序是 FORTRAN 和 COBOL 等函数式/过程式语言中的一个术语。这些语言将数据和方法分开,方法对给定的数据进行操作。

对象将数据和方法封装到实例中。大多数面向对象的程序员更喜欢方法。您对子程序的“偏好”会将您标记为古怪且不合时宜。

我不再听到“子程序”了。如果我是你,我会习惯“方法”。

于 2013-05-26T15:02:42.627 回答
1

首先,您所拥有的是构造函数,而不是方法,返回 void(nothing) 的正确方法将是这样的(根据 C# 或 Java 语法):

public void write()
{}

现在,关于您最初问的问题:subroutine 和 method 有什么区别?,嗯,基本上没有。但是如果你想更深入,那么我们将不得不去汇编编程IMO。汇编中的子程序实际上与方法有两点不同:

  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
于 2013-05-26T15:21:28.263 回答
0

它们只是识别不同类型的可调用结构的术语。子程序并不是真正“移植”到 Java 的术语,事实上它已经很少使用了。在旧语言中,它经常被用来说“执行一段可重用的代码并返回这里”。这有点笼统,它没有指定传递或返回参数的位置。这个术语主要用于具有共享内存的系统(Basic 中的公共变量,汇编中的系统内存,...),但我认为它确实可以应用于任何可重用的代码。

经常使用的更具体的术语是“功能”。从技术上讲,(纯)函数必须始终为给定的一组参数返回相同的结果。这对于非 oo 语言作为“子例程”的替代品很有用,它比子例程更清晰,因为它指定了值的传递方式,并暗示您不只是访问任意内存,从技术上讲,它也可能仍然是一个子例程。

但是,对于 OO 语言,函数一词并不总是准确的——在面向对象的语言中,我们添加了“对象”的概念来封装数据并为您处理该数据。当您调用 atomicInteger.incrementAndGet() 之类的方法时,它可能(将!)每次通过改变对象内部的某些内容来返回不同的值。这不再符合函数的定义(对相同的参数返回不同的结果),因此他们将其称为方法。它仍然可能属于通用术语“子例程”,但在 OO 语言中这样做会令人困惑且不那么具体,所以我们只是不这样做。

所以Java可以同时拥有函数和方法。“String”上的每个例程都是一个函数,因为它们都不会修改底层对象的状态(因此在字符串上调用的给定函数总是返回相同的值。方法可以修改对象的状态。

当您尝试使对象对多线程和共享安全时,这些差异变得非常重要——您不应该一次从多个线程调用一个方法,但函数很好。请注意,这使得任何使用 String 对线程使用,因为它都是函数(只有函数的对象也称为不可变)。

于 2022-02-10T21:02:56.187 回答