函数签名 与 重载
什么是函数签名呢?
函数签名(或称类型签名、方法签名)定义了函数或方法的输入与输出
签名可包含:
- 参数及参数的类型
- 返回值及其类型
- 可能抛出或传出的异常
- 该方法在面向对象程序中可用性方面的信息(如public、static或prototype)
JavaScript中的签名
JavaScript是一钟松散型或动态语言。这意味着你不必提前声明变量的类型。类型将在程序处理时自动确定。JavaScript中的签名仍然可以为你提供有关该方法的一些信息:
MyObject.prototype.myFunction(value)
- 该方法是安装在一个名为
MyObject
的 对象 上。 - 该方法安装在
MyObject
的原型上 (因此它是一个实例方法),而不是一个 静态方法 。 - 该方法的名称是
myFunction
。 - 该方法接受一个叫
value
的参数, 且没有进一步定义。
C语言中的签名
C语言中,是一个强类型的语言,在编译的时候就会被确定:
int total(int x , int y);
- int 关键字表示是一个整型的函数,返回值必须是个整数
- 该函数的名称为total
- 该方法接受两个类型为 int 的参数。参数名称分别为x、y。
函数能否被重载,取决于函数签名:
C语言中函数可以被重载,因为函数签名有多个,可以重载,而在JavaScript中,函数签名只有函数名一个签名,一旦函数名相同,就会按照后来的函数来进行操作,所以JavaScript不能够被重载。
Java 中的签名
在 Java 中,签名用于识别虚拟机代码级别的方法和类。你必须在代码中声明变量的类型才能运行 Java 代码。 Java 是严格类型 的,将在编译时检查所有参数是否正确。
public static void main(String[] args)
public
关键字是一个访问修饰符,指示任何对象都可以调用此方法。static
关键字指示此方法是一个类方法,而不是一个实例方法。void
关键字表指示此方法没有返回值。- 该方法的名称为
main
。 - 该方法接受一个类型为 String Array 的参数。它的名是
args
。
下面说说java中的重载:
比如:
public static int sum(int a, int b){ //① return a+b; } public static int sum(int a, int b,int c){ //② return a+b+c; } public static int sum(double a, double b){ //③ return a+b; } public static int sum(int a, double b){ //④ return a+b; } public static int sum(double a, int b){ //⑤ return a+b; }
这些它们是同一个名字,但是都可以被重载
①与②:参数个数不同
①与③、④:参数的类型不同
④与⑤:参数的顺序不同
但是我们有下面的则将不会重载
public static int sum(int a, int b){ //① return a+b; } public static int sum(int x, int y){ //⑥ return a+b; } public static double sum(int a, int b){ //⑦ return a+b; }
①与⑥:与参数的名字是无关的,无法被重载
①与⑦:与方法的返回值是无关的,无法被重载
顺便,方法与函数的区别:
经常谈论起函数和方法,也常常搞不清楚它们之间的界限,经常把两个混用。首先来看看,两者是如何定义的?
函数(function)是可以执行的javascript代码块,由javascript程序定义或javascript实现预定义。函数可以带有实际参数或者形式参数,用于指定这个函数执行计算要使用的一个或多个值,而且还可以返回值,以表示计算的结果。
方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。假设有一个函数是fn,一个对象是obj,那么就可以定义一个method:
有些概念我一直很困惑,譬如“面向对象”、“类”和“实例化”。
希望有人能用简洁的话语帮我解释下方法(method)和函数(function)的区别。在google上找到的那些答案对我来说太难理解了。 谢谢。
这个问题还是 willc2 在 2008 年 9 月 30 日在 StackOverflow 上提问的。
下面先来看看被选为最佳答案的回复(来自 Andrew Edgecombe ):
函数是一段代码,通过名字来进行调用。它能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值。
所有传递给函数的数据都是显式传递的。
方法也是一段代码,也通过名字来进行调用,但它跟一个对象相关联。方法和函数大致上是相同的,但有两个主要的不同之处:
- 方法中的数据是隐式传递的;
- 方法可以操作类内部的数据(请记住,对象是类的实例化–类定义了一个数据类型,而对象是该数据类型的一个实例化)
以上只是简略的解释,忽略了作用域之类的问题。
Raffi Khatchadourian 对 Andrew Edgecombe 答案的补充:
对于 1),你应当再加上“ 方法在 C++ 中是被称为成员函数”。因此,在 C++ 中的“方法”和“函数”的区别,就是“成员函数”和“函数”的区别。此外,诸如 Java 一类的编程语言只有“方法”。所以这时候就是“静态方法”和“方法”直接的区别。
对于2),你应当补上方法可以操作已在类中声明的私有实例(成员)数据。其他代码都可以访问公共实例数据。
Aaron 的回答:
方法和对象相关;
函数和对象无关。
Java中只有方法,C中只有函数,而C++里取决于是否在类中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY