第六章 方法的返参数(1.4)
五、方法的参数
5.1、方法传参
方法的参数即调用方法时主调方法依据被调方法声明的参数列表传递给被调方法的数据。调用方法时,主调方法中传入的参数称之为实际参数(实参),被调方法中用来接收数据的参数称之为形式参数(形参)。通常在设计方法时,将方法被调用时会变化的数据设计成方法的参数,可以使方法更加灵活的根据调用者的需要进行处理。
例1:
MathUtils类:
public class MathUtils {
/**
* 将两个整数相乘并返回结果
* @param num1 第一个参与相乘的整数
* @param num2 第二个参与相乘的整数
* @return 相乘的结果
*/
public int multiply(int num1, int num2) {
int result = num1 * num2;
return result;
}
/**
* 将两个整数相加并返回结果
* @param num1 第一个参与相加的整数
* @param num2 第二个参与相加的整数
* @return 相加的结果
*/
public int add(int num1, int num2) {
return num1 + num2;
}
/**
* 求两个整数的最大公约数
* @param num1 参与运算的第一个整数
* @param num2 参与运算的第二个整数
* @return 参与运算的两个整数的最大公约数
*/
public int getGCD(int num1, int num2) {
while (true) {
if (num1 < num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}
int remainder = num1 % num2;
if (remainder == 0) {
return num2;
} else {
num1 = num2;
num2 = remainder;
}
}
}
}
Test类源码:
package com.codeke.java.test;
public class Test {
public static void main(String[] args) {
// 实例化一个MathUtils类的对象,并赋值给MathUtils类型的变量mu
MathUtils mu = new MathUtils();
// 定义两个int类型的变量number1和number2,分别存储数字319和377
int number1 = 319, number2 = 377;
// 通过mu调用add(int num1, int num2)方法,并赋值给变量sum
// 注意方法传参时,实参的顺序、类型、数量均要与方法的参数列表相同
int sum = mu.add(number1, number2);
// 打印sum
System.out.println("sum = " + sum);
// 通过mu调用getGCD(int num1, int num2)方法,并赋值给变量gcd
// 注意方法传参时,实参的顺序、类型、数量均要与方法的参数列表相同
int gcd = mu.getGCD(number1, number2);
// 打印gcd
System.out.println("gcd = " + gcd);
}
}
解释:
MathUtils
类中新声明了方法getGCD(int num1, int num2)
,用来计算两个整数的最大公约数(Greatest Common Divisor
),使用了辗转相除法。
Test
类的main()
方法中实例化一个MathUtils
类的对象,并赋值给MathUtils
类型的变量mu
,通过mu调用了add(int num1, int num2)
和getGCD(int num1, int num2)
,方法传参时,实参的顺序、数据类型、数量均要与方法的参数列表相同。
另外,当被调用的方法不需要传参数时,方法声明时和调用时方法名后的()
不能省略。参数列表的设计要根据实际情况来定,参数太多,调用不便;参数太少,方法不灵活。
5.2、方法传参时基本数据类型和引用数据类型的内存变化
例2:
MathUtils类:
package com.codeke.java.test;
public class MathUtils {
/**
* 计算一个int类型整数的平方,并赋值回原变量
* @param num 需要计算平方的整数
*/
public void square(int num) {
num = num * num;
}
/**
* 计算一个int类型数组中每个元素的平方,并赋值回原元素
* @param nums 需要计算元素平方的数组
*/
public void square(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
}
}
Test类源码:
public class Test {
public static void main(String[] args) {
// 实例化一个MathUtils类的对象,并赋值给MathUtils类型的变量mu
MathUtils mu = new MathUtils();
// 通过mu调用square(int num)方法,方法中对形参计算平方并赋值
// 注意该方法并没有返回值,观察方法中形参的改变是否会影响实参
int num = 3;
mu.square(num);
System.out.println("num = " + num);
// 通过mu调用square(int[] nums)方法,方法中对形参中的每个元素计算平方并赋值
// 注意该方法并没有返回值,观察方法中形参的改变是否会影响实参
int[] nums = {3};
mu.square(nums);
System.out.println("nums[0] = " + nums[0]);
}
}
解释:
方法传参即是一个变量赋值的过程。根据基本数据类型的变量相互赋值和引用数据类型的变量相互赋值时的区别,即可理解上例中代码的执行原理。
代码System.out.println("num = " + num)
执行时,输出结果为3,被调方法中的形参发生变化时,主调方法中的实参并没有受影响。图示如下:
代码System.out.println("nums[0] = " + nums[0])
执行时,输出结果为9,被调方法中的形参发生变化时,主调方法中的实参也发生了变化。图示如下:
5.3、方法的可变参数
设计方法时,如果参数的类型可以确定,但个数不确定,可以使用可变参数。
例3:
MathUtils类:
public class MathUtils {
/**
* 将若干个整数相加并返回结果
* @param nums 参与相加的整数,可变参数
* @return 相加的结果
*/
public int add(int ... nums){
int sum = 0;
// 参数nums其实是一个int类型的数组
if(nums instanceof int[]){
System.out.println("nums是一个int类型的数组");
}
// 循环累加
for (int num : nums) {
sum += num;
}
return sum;
}
}
Test类源码:
public class Test {
public static void main(String[] args) {
// 实例化一个MathUtils类的对象,并赋值给MathUtils类型的变量mu
MathUtils mu = new MathUtils();
// 通过mu调用add(int ... nums)方法,累加若干个整数并返回结果
// 该方法声明时使用了可变参数,传参时参数的个数不受限制
int sum1 = mu.add(1, 3, 5, 7, 9, 11);
System.out.println("sum1 = " + sum1);
// 可变参数其实就是数组
int[] nums = {2, 4, 6, 8, 10};
int sum2 = mu.add(nums);
System.out.println("sum2 = " + sum2);
}
}
说明:
可变参数其实就是数组。上例中instanceof
运算符用来判断对象是否是特定类的一个实例。
参数列表中只能有一项可变参数,且必须位于参数列表的最后。