当前位置: 首页 > 科技观察

面试突击:方法更喜欢调用可选参数还是固定参数?

时间:2023-03-20 20:12:11 科技观察

作者:雷哥来源|Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)面试合集:https://gitee.com/mydb/interview可选参数(varargs)为JDK5新增特性也称为可变长度参数或可变参数。意思是在一个方法的参数中可以使用“...”来表示这个方法可以接受无限大的参数。这种表示方法称为可选参数。可选参数的语法如下:publicvoidmethod(datatype...parametername){//methodbody}可选参数的基本用法如下:publicclassArgumentExample{publicstaticvoidmain(String[]args){//调用optionalparametersmethod("Java");System.out.println();//调用可选参数method("MySQL","Redis");//调用可选参数System.out.println();method("Spring","SpringMVC","SpringBoot");}/***可选参数方法*/publicstaticvoidmethod(String...names){for(Stringitem:names){System.out.println(item);}}}上面程序的执行结果如下图所示:固定参数固定参数的概念正好与可选参数相反。固定参数是普通参数。没有“...”修饰的参数类型和数量固定的方法是固定参数。JDK5之前的所有方法参数都是固定参数,如下代码所示:.out.println("固定参数:"+name);}}可选参数注意事项使用可选参数时,需要注意以下四个问题。1、可选参数从0到无穷大。可选参数的调用次数是从0到无穷大,而不是从1到无穷大。这个需要注意一下,如下代码所示:.out.println("可选参数的个数:"+names.length);}}上面的程序执行结果如下图所示:从上面的代码可以看出,可以正常调用可选参数即使不传参数,也就是0参数。2.一个方法只能有一个可选参数。一个方法只能有一个可选参数。如果有多个可选参数,程序会报错,如下图:3.可选参数必须放在方法的末尾。如果可选参数没有放在方法参数的末尾,编译器也会报错,如下图:4.可选参数与其他同名方法形成方法重载。可选参数和其他同名方法可以共存,它们由方法重载组成,如下代码所示:优先调用固定参数还是可选参数?介绍完基础知识点,我们回到本文的主题。当一个方法中有两种类型的参数:固定参数和可选参数时,应该先调用固定参数吗?还是应该先调用可选参数?下面我们用一段代码来测试一下:out.println("调用固定参数:"+name);}/***可选参数方法*/publicstaticvoidmethod(String...names){System.out.println("调用可选参数:"+names.length);}}上面程序的执行结果如下:结语从上面的结果可以看出,当程序中存在固定参数和可选参数时,优先调用固定参数,而不是可选参数。原因分析看到这里,可能有些朋友已经意识到了。如果你看了我上一篇文章《为什么不同返回类型不算方法重载?》,你就会明白了。我应该先调用可选参数还是固定参数?上一篇介绍方法重载调用时在优先级规则中已经说过:其中可选参数的调用优先级最低,固定参数和可选参数之间还有其他调用选项。因为有些小伙伴没有注意到或者没看到,所以在这里简单回顾一下。第一优先级:参数精确匹配方法重载会优先调用与方法参数类型完全相同的固定参数方法。优先级2:调用基本类型自动转换为更大的基本类型如果是基本数据类型,那么方法重载调用的第二个匹配原则是自动转换为更大的基本数据类型,比如下面的代码:publicclassOverloadExample{publicstaticvoidmain(String[]args){OverloadExampleexample=newOverloadExample();example.method(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优先级:自动装箱/拆箱匹配如果有基本类型对应的包装类型,或者包装类型Overload对应的基本类型的方法,然后是autoboxing或者aut的方法重载ounboxing会首先被调用,如下代码所示:整数方法");}publicvoidmethod(Objectnum){System.out.println("调用对象方法");}publicvoidmethod(int...num){//可选参数System.out.println("调用int...method");}}上述程序的执行结果如下图所示:第4优先级:按下按照继承路线向上匹配父类。当有父类参数时,会先调用父类的重载方法,如下代码所示:(Objectnum){System.out.println("CallObjectmethod");}publicvoidmethod(int...num){//可选参数System.out.println("Callint...method");}}上面程序的执行结果如下图所示:第5优先级:可选参数匹配可选参数的调用优先级最低,当一个类中只有可选参数方法时,可选参数会被调用MethodSummary可选参数是JDK5中新增的参数类型为“...”格式。可选参数可以匹配0到无限个参数,但是一个方法中只能有一个可选参数,可选参数应该放在方法参数的末尾.它可以形成固定参数的方法重载,但可选参数的调用优先级最低。