解决方案
4
习惯了,入门是C,后面学校开了C++,现在再用Java,自学JavaScript,看了一下Python,发现每门语言都有本人独特的地方,难以一言辟之,Java的重载机制和C,C++相同,易理解,但是Python,里面JavaScript都没有重载,Python语句里面没有括号,JavaScript里面的函数回调,原型链,多了就习惯了
6
你想啊,你是怎么调用一个方法的。
methodName(arg1, arg2); // 方法签名和参数列表
这个过程中你传入了方法签名和参数列表,有传入返回值吗?
假设允许返回值类型重载,当有多个方法签名和参数列表都一样的方法时,它怎么知道该调用哪个?
或许你会说,那本人把返回值类型也告诉它,他不就知道调用哪个方法了吗?
这个想法很好,但有两点缺陷。
其一、这不就是相当于把返回值当做一个特殊参数传进去了吗?何必那么麻烦,把这个参数标记为返回值类型参数,你直接写一个不一样参数列表的方法不就完了。(目前的设计可以降低设计复杂度)
其二、代码书写的时候返回值其实是个可选值,其受到多态的干扰,唯一性较差。
例如,你可以写:
String str = obj.toString(); // 返回值是String类型
也可以写:
Object str = obj.toString(); // 返回值是Object类型(唯一性较差)
还可以写:
obj.toString(); // 本人就不写返回值(值可选)
你看,方法调用的时候,你都可以不写返回值,你还怎么样告诉它调用哪个返回值的方法?
methodName(arg1, arg2); // 方法签名和参数列表
这个过程中你传入了方法签名和参数列表,有传入返回值吗?
假设允许返回值类型重载,当有多个方法签名和参数列表都一样的方法时,它怎么知道该调用哪个?
或许你会说,那本人把返回值类型也告诉它,他不就知道调用哪个方法了吗?
这个想法很好,但有两点缺陷。
其一、这不就是相当于把返回值当做一个特殊参数传进去了吗?何必那么麻烦,把这个参数标记为返回值类型参数,你直接写一个不一样参数列表的方法不就完了。(目前的设计可以降低设计复杂度)
其二、代码书写的时候返回值其实是个可选值,其受到多态的干扰,唯一性较差。
例如,你可以写:
String str = obj.toString(); // 返回值是String类型
也可以写:
Object str = obj.toString(); // 返回值是Object类型(唯一性较差)
还可以写:
obj.toString(); // 本人就不写返回值(值可选)
你看,方法调用的时候,你都可以不写返回值,你还怎么样告诉它调用哪个返回值的方法?
5
首先要了解函数的定义, 引用维基百科的解释”现代数学中[1],函数全部输入值的集合被称作该函数的定义域,而其输出值所存在的集合称为上域或对应域。其中值域特指该函数的输出值集合,意即上域包含了值域,值域为上域的子集。通常输入值称作函数的参数或参量,输出值称作函数的值。函数将有效的输入值变换为唯一的输出值,同一输入总是对应同一输出,但反之未必成立。”
其中函数有唯一的输出值, 且同一输入总对应同一输出. 假如仅返回值类型不同那就说明同一函数有多种输出值违反了函数定义.
举个例子add(int, int)调用此方法时你并不知道函数返回的什么类型(int还是long), 原因是int是可以隐式的向上转型为long, 所以JVM并不知道该调用int的返回方法呢还是long的返回方法. 举这个例子可能有些不恰当, 只是为了说明一个函数只有唯一一个输出, 不能出现既可以返回int还可以返回long或其它什么类型
其中函数有唯一的输出值, 且同一输入总对应同一输出. 假如仅返回值类型不同那就说明同一函数有多种输出值违反了函数定义.
举个例子add(int, int)调用此方法时你并不知道函数返回的什么类型(int还是long), 原因是int是可以隐式的向上转型为long, 所以JVM并不知道该调用int的返回方法呢还是long的返回方法. 举这个例子可能有些不恰当, 只是为了说明一个函数只有唯一一个输出, 不能出现既可以返回int还可以返回long或其它什么类型
5
补上维基百科对函数的解释
2
入口都没找到,出口不同有什么用。