定义数组的三种方式
以 int型 的一维数组为例,说说三种定义方式
int[] arr = new int[3];
这是最常用的方式,定义时就含有默认值,可以后续赋值
public class Demo{
public static void main(String[] args){
int[] arr = new int[3];
}
}
int[] arr = {15,3,8};
这种定义方式易于初始化数组,数组的个数由{}内元素的个数决定
public class Demo{
public static void main(String[] args){
int[] arr = {15,3,8};
}
}
int[] arr = new int[]{15,3,8};
铛铛铛,重点讲的就是这玩意:这种方法看似麻烦,但它可以实现一个很牛逼的功能
可以匿名化的传递常量数组,这是上述两种方法办不到的,具体怎么实现,看下面代码:
public class Demo{
public static void main(String[] args){
print(new int[]{15,6,8}); //没有数组名,但可以把数组作为参数传给方法;其余方法这么做只会报错
}
public static void print(int[] arr){
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}
动态参数列表
以int类型为例来说明一下
JDk1.5版本之后,出现了一个新的写法
int ...x
这是动态参数列表(类型固定,个数可以动态 0-n都可以)
我以int类型来进行探究
不传参数的情况
public class Demo{
public void test(int ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public static void main(String[] args){
Demo t = new Demo();
t.test();
}
}
可以执行
传递任意个参数
public class Demo{
public void test(int ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public static void main(String[] args){
Demo t = new Demo();
Demo t1 = new Demo();
Demo t2 = new Demo();
t.test(1,2,3,4,5);
t1.test(5,5);
t2.test(0);
}
}
我随机弄啦三种参数个数,传递进去,没问题
怎么用传进去的任意个参数
- 其实,
int ...x
与int[] x
的本质是一样的,有length属性,有下标 - 但是动态参数列表优于数组参数的地方在于,他可以传0个参数;
- 而数组参数,传0个参数会报错
和数组参数的调用方法一样
public class Demo{
public void test(int ...x){
System.out.println("执行了test方法,携带动态参数列表");
for(int i = 0; i < x.length; ++i){
System.out.println(x[i]);
}
}
public static void main(String[] args){
Demo t = new Demo();
t.test(1,2,3,4,5);
}
}
数组参数传0个参数会报错
而动态参数列表可以不传参数(最上面第一个例子有演示)
public class Demo{
public void test(int[] x){
System.out.println("执行了test方法,携带动态参数列表");
}
public static void main(String[] args){
Demo t = new Demo();
t.test();
}
}
动态参数列表涉及的重载问题
动态参数列表可以和不带参数,构成重载,但对象.方法()不带参数时调用不带参数的方法
public class Demo{
public void test(int ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public void test(){
System.out.println("执行了test方法,没有携带参数!");
}
public static void main(String[] args){
Demo t = new Demo();
t.test();
}
}
注意,动态参数列表和相同类型数组参数不能构成重载,他们本质是一样的,会报错(除非它们的本质维度不同,比如一个二维,一个一维)
//都对应的是一维数组
public class Demo{
public void test(int ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public void test(int[] x){
System.out.println("执行了test方法,携带数组参数!");
}
public static void main(String[] args){
Demo t = new Demo();
t.test();
}
}
//都对应的是二维数组
public class Demo{
public void test(int[] ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public void test(int[][] x){
System.out.println("执行了test方法,携带数组参数!");
}
public static void main(String[] args){
Demo t = new Demo();
t.test();
}
}
//对应的数组维度不同
public class Demo{
public void test(int ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public void test(int[][] x){
System.out.println("执行了test方法,携带数组参数!");
}
public static void main(String[] args){
Demo t = new Demo();
t.test();
}
}
对应的数组维度不同,这样就编译成功
动态参数列表在方法的参数中只能存在一份儿,且必须放置在方法参数的末尾
public class Demo{
public void test(int a,int ...x){
System.out.println("执行了test方法,携带动态参数列表");
}
public static void main(String[] args){
Demo t = new Demo();
t.test(5,6,7);
t.test();
}
}
public class Demo{
public void test(int ...x,int a){ //这样会报错
System.out.println("执行了test方法,携带动态参数列表");
}
public static void main(String[] args){
Demo t = new Demo();
t.test(5,6,7);
}
}
public class Demo{
public void test(int ...x,int ...y){ //这样也会报错
System.out.println("执行了test方法,携带动态参数列表");
}
public static void main(String[] args){
Demo t = new Demo();
t.test(5,6,7);
}
}