为什么方法返回值不算作方法签名?这样设计的原因是什么?不知道原因,我永远都记不住啊……
附:
1、方法签名定义
Definition: Two of the components of a method declaration comprise the method signature—the method's name and the parameter types.
The signature of the method declared above is:
2、方法签名例子
calculateAnswer(double, int, double, double)
http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你可以这样理解,因为方法返回值不一定要赋值给一个对象啊,所以它对方法匹配没有影响。
比如,对于以下两个方法
int test(int i);
boolean test(int i);
有一个调用
test(1)
你不能区分它是调用哪一个,对于人来说分不清,对编译器来说也一样
但是如果是这样呢
int i = test(1);
虽然你可以推导出是调用哪一个,但是上面说到,你不一定要把返回值赋值给一个对象啊,如果没有赋值就不知道哪一个方法是要调用的了
@chenhengqi 的回答看似很有道理,其实仔细想想是讲不通的。
首先,参数也存在误匹配的问题,比如:
通过上面的例子看出来了,作为方法签名一部分的参数类型也是会引起歧义的。
其次,假如Java把返回值作为方法签名的一部分,我们也是可以避免歧义的。比如下面的假想代码:
所以,
返回值类型可能会引起歧义这个说法是站不住脚的
,如果这样的话那参数也应该仅靠数量来区分,而不是现在的数量+类型。(而且不管你信不信,JVM里面的方法签名的确是包括返回值类型的
)所以回到这个问题上来,我认为之所以Java编译器把返回值类型排除在方法签名之外,有以下几点原因:
降低复杂度。否则,在不需要返回值的地方也需要加入强转来声明要调用的到底是哪个方法
减少错误。想想因为参数的类型而导致的逻辑错误吧(本该调用方法1的却调用了方法2),如果再加一个返回值的类型……
最根本的原因,还是Java设计人员认为返回值不应该成为方法签名的一部分,这样会增加滥用和过度设计等不良现象。就像Java禁止多重继承一样,并不是不能,而是不好。