方法
方法的定义和调用
/* 方法定义语法:
[修饰符] 返回类型 方法名(形式参数列表) {
方法体;
return;
}
*/
// 定义求两个整数数和的方法
public static int getSum(int a, int b) {
return a + b; // 本方法返回类型是int所以需要return,如果返回类型是void则不需要return
}
// public和static都是修饰符,public修饰表示是公共的方法,可以在任何地方调用,static修饰的方法叫做静态方法,在本类中可以直接使用类名调用,当然修饰都是可写可不写的
/* 方法调用语法:
类名.方法名(实际参数列表);
*/
// 例如本类是Sum类
Sum.getSum(2,3); // 或者 getSum(2,3);
// 需要注意的就是形参和实参,方法中需要用到运算的变量未知,就用形式参数来表示,调用时传入实际参数
方法的设计练习
如何定义一个方法?主要是确定有没有参数,是什么参数,有没有返回,返回什么。
1.形式参数:完成一个功能,存在哪些未知的因素,把它们作为参数
2.返回类型:完成一个功能要不要给调用者返回一个结果?
如果需要给调用者返回结果,就写上返回数据的类型
如果不需要给调用者返回结果,此时使用关键字void,表示无返回
// 需求:定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格
// 定义方法
static double totalPrice(double[] price, double discount) {
double total = 0; // 定义总价变量,用来接收累加的结果
for (double ele : price) { // for-each遍历数组
total += ele * discount;
}
return total; // 返回总价格
}
// 调用方法
public static void main(String[] args) {
int[] price = {2, 3.5, 5, 6, 9};
System.out.println(totalPrice(price,0.8));
}
方法的可变参数
在方法中传递数组有一种更简单的方式——方法的可变参数,其本质是一个简写,目的是让开发者写代码更简单。
1.方法的可变参数其底层就是一个一维数组
2.可变参数必须作为方法的最后一个参数,避免多个参数的歧义性
// 需求:定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格(使用可变参数)
// 定义方法
static double totalPrice(double discount, double... price) { // 使用可变参数
double total = 0; // 定义总价变量,用来接收累加的结果
for (double ele : price) { // for-each遍历数组
total += ele * discount;
}
return total; // 返回总价格
}
// 调用方法
public static void main(String[] args) {
System.out.println(totalPrice(0.8,2,3.5,5,6,9)); // 调用时按照顺序列举就行,不用先传入数组
}
方法的重载
方法的重载:一同二不同。方法名相同,返回类型不同,参数列表不同。
1.参数列表不同:参数个数、参数顺序、参数类型之中任意一个不同都可以说是参数表不同
2.作用:屏蔽了同一功能的方法由于参数不同所造成方法名称不同
3.注意:方法重载和方法的返回值类型无关,只是一般要求返回值类型相同
// 需求:多个数求和,两个数求和,三个数求和,四个数求和
// 方法重载
static int getSum(int a, int b) { // 两个数之和
return a + b;
}
static int getSum(int a, int b, int c) { // 三个数之和
return a + b + c;
}
static int getSum(int a, int b, int c, int d) { // 四个数之和
return a + b + c + d;
}
// 调用
public static void main(String[] args) {
// 通过参数列表判断使用哪一个方法
getSum(2, 3);
getSum(2, 3, 4);
getSum(2, 3, 4, 5);
}
方法的值传递机制
1.基本数据类型传递的是值
2.引用数据类型传递的是地址(这里以数组为例)
方法值传递机制分析图:
// 方法的值传递机制
static void getNum(int a) {
System.out.println(a);
a = 100;
System.out.println(a);
}
static void getNum(int[] arr) {
// java.util.Arrays.toString(数组名);这个是调用jdk里面的类打印数组
System.out.println(java.util.Arrays.toString(arr));
arr[0] = 100;
System.out.println(java.util.Array.toString(arr));
}
public static void main(String[] args) {
// 基本数据类型值传递
int a = 10;
System.out.println(a);
getNum(a);
System.out.println(a);
// 控制台打印结果依次为:10, 10, 100, 10
// 基本数据类型传递的是值,只在自己的作用域内有用
// 引用数据类型值传递
int arr[] = {1,2,3};
System.out.println(java.util.Arrays.toString(arr));
getNum(arr);
System.out.println(java.util.Arrays.toString(arr));
/* 控制台打印结果依次为:
[1, 2, 3]
[1, 2, 3]
[100, 2, 3]
[100, 2, 3]
引用数据类型传递的是地址,是把数组在堆空间分配的地址传了过来,当对数组进行更改以后,再调用数据已经发生了改变
*/
}