之前在Java中,我们定义一个方法的参数的个数都是定义死的,但有时候我们希望它能够接收多个参数,这时候就需要用到我们的可变长参数了,那么它怎么用呢?我们来看看下面的例子:
从上面其实我们就可以知道一个可变长参数的格式是在原来的基础上在数据类型后面加...。
从上述的声明方式我们可以知道一个方法的可变长参数只能有一个并且在最后一个。那么会定义了该怎么使用呢?我们可以把这个可变长参数看成是一个数组,于是:
于是乎我们就可以遍历数组来读取这个可变长参数了。因为可以看成是一个数组,所以我们也可以采取直接传入一个数组的方式来赋值:
但一旦传入一个数组,就不能再传进其他数据了:
对于main方法中的参数,在Java基础之分析HelloWorld程序所用到的知识中我们讲过了怎么去配置传入字符串了,我们现在以idea为例简单看看:
对于main方法这个参数,看起来是不是和上面的可变长参数很像呢?我们把main方法中的[]改为...:
发现其实是没有报错的,那么同样再传入hello和world两个字符串程序能不能正常运行呢:
可以发现程序能够正常执行。所以main方法的参数其实也是一个可变长参数。
形参与实参之前在变量那里提到了方法的形参是用来代替实参进行操作的,那么,在这里,就产生了一个疑问了,有的读者可能会发现,有时候形参里的值改变了,有些实参的值没有改变有些有改变。这时候我们就需要分情况考虑了:
基本数据类型先看一个例子:
读者们觉得会输出10还是20呢?
答案是10,为什么会这样呢?我们从内存图来看:
从内存图我们就可以知道,changeI方法改变的是形参i的值,并没有改变实参i的值。再看一个类似例子:
你们觉得会输出100还是101呢?答案是100.
引用数据类型以上程序会输出名字为Tom,年龄为3的信息还是名字为Cat,年龄为5的信息呢?想想内存图结构吧:
但有一种引用数据类型是特例:
特例:String类型这个输出的是向软件工程师进发的小白,而不是向软件工程师进发的小黑。
虽然上述的结果不一,但本质上还是离不开形参是代替实参进行操作的关系。而实参的数值会不会根据形参的数值变化是由实参在内存图的位置决定的。
普通代码块之前我们讲了静态代码块,对象代码块(构造代码块),其实还有一种代码块——普通代码块,这种代码块出现在方法体中,如:
里面的局部变量只在块中有用,所以出了{}后再定义一个s变量是不会报错的。由于这个结构很少用就不举例了,知道就行。