可变个数的方法
- 使用场景
在调用方法时,可能会出现方法的形参类型是确定的,但参数的个数不确定。这时候需要用到可变个数的方法 - 声明格式:方法名(参数类型 …参数名)
- 注意:可变个数形参的方法在调用的时候,实际的实参个数可以是0个、一个乃至多个。
可变个数方法的举例
public class test { public static void main(String[] args) { test t1 = new test(); t1.printf(); t1.printf(1); t1.printf(1,2); t1.printf(1,2,3); } public void printf(int ... num){ System.out.println(111); } }
可变个数方法的重载
public class test { public static void main(String[] args) { test t1 = new test(); t1.printf(); t1.printf(1); t1.printf(1,2); t1.printf(1,2,3); } public void printf(int ... num){ System.out.println("0"); } public void printf(int i){ System.out.println(1); } public void printf(int i,int j){ System.out.println(2); } public void printf(int i,int j ,int k){ System.out.println(3); } }
当既存在可变个数方法,又存在同名非可变个数方法的时候,编译器会优先调用非可变个数的方法
同时,可变个数方法,又与其他同方法名方法构成了重载方法
数组类型的冲突
public void f(int ... nums){ System.out.println(1); } public void f(int []nums){ System.out.println(2); }
特殊地,可变个数方法的形参与其同方法名的数组形参方法,不能构成重载
可以理解为int[ ] 和 int … 为同一类型
public class test { public static void main(String[] args) { test t1 = new test(); t1.f(new int[]{1,2,3,4,5}); t1.f(1,2,3,4,5); } public void f(int ... nums){ for (int i = 0; i < nums.length; i++) { System.out.print(nums[i]); } System.out.println(); } } 输出为: 12345 12345
多个参数的可变方法
若有多个参数,可变个数的形参,必须声明在形参列表的最后
public class test { public void f(int ... nums,int i){ } } //编译报错
此时,有两个参数,一个为可变个数,一个为普通int,但可变个数参数在前
public class test { public void f(int i,int ... nums){ } } //编译通过
此时,有两个参数,一个为可变个数,一个为普通Int,但可变个数参数再后
可变个数方法只能存在一个可变个数参数
public void f(int ... num1,int ... num2){ } //编译报错
原因杂谈
public class test { public static void main(String[] args) { test t1 = new test(); t1.f(1,2,3,4,5,6); } public void f(int ... num1,int ... num2){ } } //假设编译通过
假设编译通过,此时,存在六个形参
但编译器不清楚,1,2,3,4,5,6 中,哪个作为形参传给num1,哪个传给num2
public class test { public static void main(String[] args) { test t1 = new test(); t1.f(1,2,3,4,5,6); } public void f(int num1,int ... num2){ } } //编译通过 //将1传给num1 //将2,3,4,5,6传给num2
总结
- 可变个数形参的方法与同一个类中,同名的多个方法可以构成重载
- 可变个数形参若与同类方法的形参类型相同,则不能构成重载
- 可变个数的形参必须声明在形参的末尾
- 可变个数的形参只能在形参列表中出现一次
声明:本文为自主学习笔记,如有错误,允以包涵!