当前位置: 首页 > 后端技术 > Java

面试攻略13:方法优先调用可选参数还是固定参数?

时间:2023-04-02 01:47:03 Java

采访合集:https://gitee.com/mydb/interview可选参数(varargs)是JDK5的新特性,也叫变长参数或可变参数。意思是在一个方法的参数中可以使用“...”来表示这个方法可以接受无限大的参数。这种表示方法称为可选参数。可选参数的语法如下:publicvoidmethod(datatype...parametername){//方法体}可选参数的基本用法如下:publicclassArgumentExample{publicstaticvoidmain(String[]args){//调用可选参数method("Java");System.out.println();//调用可选参数method("MySQL","Redis");//调用可选参数System.out.println();方法(“Spring”、“SpringMVC”、“SpringBoot”);}/***可选参数method*/publicstaticvoidmethod(String...names){for(Stringitem:names){System.out.println(item);}}}上面程序的执行结果如下图所示:固定参数固定参数的概念正好与可选参数相反。固定参数是普通参数。方法中有固定的参数类型和单独的参数。没有“...”修饰的数字是固定参数。JDK5之前的所有方法参数都是固定参数,如下代码所示:publicclassArgumentExample{publicstaticvoidmain(String[]args){method("Java");}/***固定参数方法*/publicstaticvoidmethod(Stringname){System.out.println("固定参数:"+name);}}可选参数注意事项使用可选参数时,需要注意以下4个问题。1、可选参数从0到无穷大。可选参数的调用次数是从0到无穷大,而不是从1到无穷大。这点要注意,如下代码所示:publicclassArgumentExample{publicstaticvoidmain(String[]args){method();}/***可选参数方法*/publicstaticvoidmethod(String...names){System.out.println("可选参数个数:"+names.length);}}上面程序的执行结果如下图所示:从上面的代码可以看出,可选参数即使不传参数也可以正常调用,即0参数。2.一个方法只能有一个可选参数。一个方法只能有一个可选参数。如果有多个可选参数,程序会报错,如下图:3.可选参数必须放在方法的末尾。如果可选参数没有放在方法参数的末尾,编译器也会报错,如下图:4.可选参数与其他同名方法形成方法重载。可选参数和其他同名方法可以共存,它们由方法重载组成,如下代码所示:优先调用固定参数还是可选参数?介绍完基础知识点,我们回到本文的主题。当一个方法中有两种类型的参数:固定参数和可选参数时,应该先调用固定参数吗?还是先调用可选参数?接下来我们用一段代码来测试一下:}/***固定参数方法*/publicstaticvoidmethod(Stringname){System.out.println("调用固定参数:"+name);}/***可选参数方法*/publicstaticvoidmethod(String...names){System.out.println("调用可选参数:"+names.length);}}上面程序的执行结果如下:结论从上面的结果可以看出,当程序中存在固定参数和可选参数时,优先调用固定参数而不是可选参数。选择参数。原因分析看到这里,可能有小伙伴已经意识到了。如果你看了我上一篇文章《为什么不同返回类型不算方法重载?》,你就会明白了。应该先调用可选参数还是固定参数?上一篇文章在介绍方法重载调用的优先级规则时已经说过:其中,可选参数的调用优先级最低,固定参数和可选参数之间还有其他调用选项。因为有些小伙伴没有注意到或者没看到,所以在这里简单回顾一下。第一优先级:参数精确匹配方法重载会优先调用与方法参数类型完全相同的固定参数方法。优先级2:调用基本类型自动转换为更大的基本类型如果是基本数据类型,那么方法重载调用的第二个匹配原则是自动转换为更大的基本数据类型,比如下面的代码:公共类OverloadExample{publicstaticvoidmain(String[]args){OverloadExample示例=newOverloadExample();例子.方法(12);}publicvoidmethod(longnum){System.out.println("calllongmethod");}publicvoidmethod(Integernum){System.out.println("CallIntegermethod");}publicvoidmethod(Objectnum){System.out.println("CallObjectmethod");}publicvoidmethod(int...num){//可选参数System.out.println("callint...method");}}上面程序的执行结果如下图所示:第3优先级:自动打包/解包匹配if如果有基本类型对应的包装类型,或者包装类型对应的基本类型的方法重载,那么会先调用autoboxing或者autounboxing的方法重载,如下代码所示:publicclassOverloadExample{publicstaticvoidmain(String[]args){例子.方法(12);}publicvoidmethod(Integernum){System.out.println("CallIntegermethod");}publicvoidmethod(对象数){System.out.println("调用对象方法");}publicvoidmethod(int...num){//可选参数System.out.println("callint...method");}}上述程序执行结果如下图所示:第4优先级:按照继承路线向上匹配父类。当有父类参数时,会先调用父类的重载方法,如下代码所示:publicclassOverloadExample{publicstaticvoidmain(String[]args){例子.方法(12);}publicvoidmethod(Objectnum){System.out.println("CallObjectmethod");}publicvoidmethod(int...num){//可选参数System.out.println("callint...method");}}上面程序的执行结果如下图所示:第5优先级:可选参数匹配可选参数调用优先级最低。当一个类中只有可选参数方法时,就会调用可选参数方法。总结可选参数是JDK5中一种新的参数类型,格式为“...”,可以是可选参数可以匹配0到无限个参数,但是一个方法中只能有一个可选参数,可选参数应该放在方法参数的末尾。它可以形成固定参数的方法重载,但可选参数的调用优先级最低。判断是非在己,名誉在人,得失在数。公众号:Java面试真题解析