Java函数调用的一点疑惑,求Java大神解答

问题描述

在Java,如果有两个函数如下:voidf(Integeri){}voidf(Floatf){}

如果调用f(1),JVM知道去调用第一个函数但是如果换成是下面两个函数voidf(Integer...args){}voidf(Float...args){}

这时如果调用f(1),javac爆函数歧义但是如果再次换成下面两个函数voidf(Integer...args){}voidf(Object..args){}

这时调用f(1),就可以正常调用第一个函数或者换成下面两个函数voidf(Integer...args){}voidf(Integeri){}

这时调用f(1),也会调用第二个函数。因为Java中函数的唯一签名可以认为是函数名+参数列表求问哪位大神可以对这些现象来解释一下

解决方案

解决方案二:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。
解决方案三:
引用1楼kk_124的回复:

这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。

静态分派进行方法抉择的机制,请问一下你了解吗?
解决方案四:
引用2楼phelovhl的回复:

Quote: 引用1楼kk_124的回复:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。

静态分派进行方法抉择的机制,请问一下你了解吗?

他有个优先级。。具体的楼主可以去网上查一查,我记得变长参数优先级是最低的。这个概念楼主知道一下就可以了,因为我实际编程中绝对不会(要)出现这种模棱两可的重载方式~
解决方案五:
引用3楼kk_124的回复:

Quote: 引用2楼phelovhl的回复:
Quote: 引用1楼kk_124的回复:
这是Java中对重载概念的理解:首先重载在Java方法调用中称之为静态分派(重写为动态分派),其次静态分派发生在编译阶段!也就是说重载是编译器帮你抉择好调用方法的版本的,那么编译器是根据什么选择版本呢?通常就是根据传入变量的静态类型(比如:Humana=newMan(),对象a的静态类型是Human,而Man则是实际类型),还有一个值得注意的问题就是这种可选择的版本有时候不是唯一的,出现的原因就像本例子中直接输入字面量f(1),而没有明确声明它的静态类型,这种情况那么编译器就会根据语言上的规则和理解去自动帮你选择“更合适的”方法,1和integer自然最贴切。楼主可以尝试注释一些方法和再加一些重载方法测试一下静态分派编译器的自动选择。。

静态分派进行方法抉择的机制,请问一下你了解吗?

他有个优先级。。具体的楼主可以去网上查一查,我记得变长参数优先级是最低的。这个概念楼主知道一下就可以了,因为我实际编程中绝对不会(要)出现这种模棱两可的重载方式~

是的,我是在看ThinkinginJava的时候看到的,平时编码过程中不会使用。这个是偏语言本身方面的东西

时间: 2024-10-23 17:53:46

Java函数调用的一点疑惑,求Java大神解答的相关文章

注释-JAVA编译中文乱码,求各位大神解答

问题描述 JAVA编译中文乱码,求各位大神解答 只要编写的程序中出现中文,就会出现乱码,不管中文写在哪里都一样,即使是在注释里面也出现乱码 解决方案 用的什么开发环境,建议用eclipse等本身支持中文的.不要用简陋的文本编辑器. 解决方案二: 字符集用UTF-8 解决方案三: 看编码格式,是unicode还是gbk还是utf-8,要一致

跪求大神解答-新手学java有几个不懂得问题求各位大神解答

问题描述 新手学java有几个不懂得问题求各位大神解答 封装有什么意义.为什么要用prative封装呢.直接public不行吗?都说为了安全难道用一个方法setter getter 改变数据这样就安全么?.直接public 多方便.求大神举个例子说明. 第二个问题static:证明此方法是由类名称调用的这句话怎么理解. 第三个问题static有什么作用,我就知道他在类里最先执行然后可以不实力化调用,然后有什么用这有点蒙. 第四个问题我理解的映射就是一项与另一项的关系.他也可以用属性表示.但是之所

接口 百度地图 net-M站(就是手机站)接入百度APP,求各位大神解答

问题描述 M站(就是手机站)接入百度APP,求各位大神解答 最近公司要求在公司做的手机站上接入百度地图,实现导航功能, 我目前接了百度地图极速版的API,但是要求在用户手机上已装百度地图的APP的情况下 直接打开用户的百度地图APP,我在百度地图的接口里并没有找到接入APP的相关接口, 请问各位大神可有解决方案?(注:M站是手机WEB站,不是一个APP) 解决方案 1:首先判断是否安装了百度地图,包名:com.baidu.BaiduMap(不知道有没有更新,这个可以自己去找一下) 2:调用代码

视频-急求,大神解答一个定制摄像头问题

问题描述 急求,大神解答一个定制摄像头问题 在iPhone上同时打开前后两个摄像头录制视频能实现嘛?能给个思路吗? 解决方案 连个摄像头都打开这个还算是苹果的专利呢:http://mobile.qudong.com/2013/0830/151841.shtml 解决方案二: 没有试过,但是按照一般思路看来是不能实现的吧 解决方案三: 能不能弄两个控制系统,一个开始前置摄像头,一个控制后面摄像头

c++-递归问题求各位大神解答

问题描述 递归问题求各位大神解答 ###代码如下,请问这个递归哪里出问题了,问什么程序没有结果 //根据 P/4=1-1/3+1/5-1/7.... 求P的近似值,要求精度为0.000001 #include"iostream" using namespace std; int Temp(int n){//求-1的n次方 if(n==0)return 1; return -1*Temp(n-1); } double PI(){ double sum=0; double temp=1.0

求mfc大神解答关于文件读写操作问题

问题描述 求mfc大神解答关于文件读写操作问题 iter = g_listPath.begin();//list.begin()回指向第一个元素while (iter != g_listPath.end()){ CNode curpos = *iter; CString str; CString strFileName=""mytest.txt""; CFile file; SYSTEMTIME st; GetLocalTime(&st); str.Form

utf-8-跪求各位大神解答!!ubuntu下mysql编码改为utf8之后中文还是乱码

问题描述 跪求各位大神解答!!ubuntu下mysql编码改为utf8之后中文还是乱码 大神们请莫先喷我为何要问这种幼稚问题TAT 情况如下: ubuntu14.04下安装mysql5.5(最简单的安装方法:apt-get install...) 考虑到mysql默认编码为latin,会出现中文乱码,所以按照网上的方法修改了 my.cnf 如下: 之后重启mysql,查看了编码 本以为一切搞定,事与愿违,我试了试插入中文的字段,结果乱码 在workbench中也是这样 apply之前: appl

数据结构于算法上的作业,求各位大神解答

问题描述 数据结构于算法上的作业,求各位大神解答 第一题 Write a List method, equals, that returns true exactly when the elements of two lists are pair-wise equal. Ideally, your implementation should work for any List implementation, without change. 第二题 Implement a recursive ve

c语言-运行的时候结果不对,改了十多次还是不对,求各位大神解答

问题描述 运行的时候结果不对,改了十多次还是不对,求各位大神解答 #include #include #include using namespace std; #define PI 3.1415 class circle { protected: double R; public: circle(){R=0;} circle(double r){R=r;} virtual void display(){cout<<"请输入半径: "; cin>>R;} };

c-关于多线程的疑问,求各位大神解答

问题描述 关于多线程的疑问,求各位大神解答 ```using namespace std; DWORD WINAPI Thread_accept (PVOID lParam) { cout<<"进入线程"<<endl; return 0; } int main() { WSADATA wsaData; WSAStartup (MAKEWORD (2, 2) ,&wsaData); HANDLE Thread; Thread = CreateThread