1. 概述
-
具有某种特定功能的代码段。
-
某段代码经常使用,所以用大括号,将这段代码包起来,起个名字。以后就使用这个名字来代替这段代码
-
特点:
-
提高了代码的复用性。
-
提高了代码的封装性,大括号中的内容,其他调用者看不到也无法直接访问。
-
简化了软件设计的思维难度
-
2. 方法的定义和调用
2.1 方法的定义
-
语法结构:
-
访问修饰符 可选修饰符 返回值类型 方法名称(形式参数列表) {
方法体代码块;
return ;
} -
语法解释:
-
访问修饰符:后面讲,暂时不写,或者写成public
-
可选修饰符:后面讲,暂时写成static. 静态.
-
返回值 的功能,有可能会有一些产出,就需要将数据返回给调用者。调用者需要知道生产出来的数据的数据类型。方法中必须要return 一个满足要求的类型数据。如果该方法只处理逻辑,没有产出,那么该位置可以直接写
void
,方法内可以不写return,如果要写,return后面不要跟任何数据类型,表示结束方法。 -
方法名称:给这段代码起的名字,只要是一个合法的标识符即可。遵守小驼峰的命名规则
-
形式参数列表:这段代码要完成功能,可能会需要一些资源。在参数列表中,需要定义一些变量, 在调用本方法的时候,会由外界传入数据。
格式:数据类型1 形参1,数据类型2 形参2
-
方法体代码块:真正要完成该方法功能的执行逻辑
-
return
语句使用-
最终生产出来的结果,要返回给调用者,使用return语句返回
-
结束方法,注意return语句后面不再书写代码
-
-
-
示例:
-
/** * 打印一个0~9的随机整数 */ import java.util.Random; static void printRandomNumber() { Random random = new Random(); int number = random.nextInt(10); System.out.println(number); }
-
注意:
-
方法不能嵌套定义,方法都是类里面定义的
-
方法中可以调用当前的属性(成员变量)或者方法
-
方法的定义是平级关系
-
方法可以嵌套调用,C调用B,B调用A,甚至可以自己调用自己(递归)
-
2.2 方法的调用
语法结构:
方法名(实际参数);
-
调用特点:方法不调用,就不执行。
-
参数传递必须匹配。
-
示例:
-
import java.util.Random; public class MethodTest { public static void main(String[] args) { // 调用方法 printRandomNumber(); } static void printRandomNumber() { Random random = new Random(); int number = random.nextInt(10); System.out.println(number); } }
3. 返回值.
-
return语句表达方法结束了;表示方法的产出内容。
-
如果方法没有具体的返回内容,可以写成return;此时的return语句可以省略,返回值类型必须写成void。
-
如果方法有具体的返回内容,那么return后面就需要加上返回的那个数据。返回值类型必须和 return语句后面的数据的数据类型一致。
-
return语句返回数据,返回给调用者。谁来调用当前方法,当前方法就将数据返回给谁。
-
import java.util.Random; public class MethodTest { public static void main(String[] args) { int re = printRandomNumber(); System.out.println(re); } static int printRandomNumber() { Random random = new Random(); int number = random.nextInt(10); return number; } }
3.1 带返回值方法的定义和调用
-
方法的返回值类型,既可以是基本数据类型,也可以是引用数据类型
-
如果方法的返回值类型是引用数据类型,那么在return语句中,一定要返回该类型的一个对象。
-
示例:
-
import java.util.Arrays; import java.util.Random; public class MethodTest { public static void main(String[] args) { int maxValue = maxInArray(); System.out.println(maxValue); int[] randomArray = getRandomArray(); System.out.println(Arrays.toString(randomArray)); } // 获取数组中的最大值 static int maxInArray() { int[] arr = {1, 6, 3, 9, 10}; int max = arr[0]; for (int a : arr) { if (a > max) { max = a; } } return max; } // 获取指定元素个数、指定范围的随机数组 10个元素 范围0 -10 static int[] getRandomArray() { int size = 10; int bound = 10; Random random = new Random(); int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = random.nextInt(bound); } return arr; } }
4 参数
4.1 带参数方法的定义和调用
-
形参和实参
-
形式参数:在定义方法时使用,需要加上数据类型,也就是对于变量进行声明。各个变量之间,使用逗号分隔。
-
实际参数:在方法调用时使用,不需要加上数据类型,也就是对于变量进行赋值。各个实际参数之间,也使用逗号分隔。顺序必须和定义的方法的形式参数的顺序一致。
-
-
方法的参数既可以是基本数据类型,也可以是引用数据类型(类、接口、枚举、数组)
-
示例:
-
import java.util.Arrays; import java.util.Random; public class MethodTest { public static void main(String[] args) { int[] arr = new int[]{10, 2, 30, 46, 5, 6}; System.out.println(maxInArray(arr)); int[] randomArray = getRandomArray(10, 10); System.out.println(Arrays.toString(randomArray)); } // 获取数组中的最大值 static int maxInArray(int[] arr) { int max = arr[0]; for (int a : arr) { if (a > max) { max = a; } } return max; } // 获取指定元素个数、指定范围的随机数组 static int[] getRandomArray(int size, int bound) { Random random = new Random(); int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = random.nextInt(bound); } return arr; } }
4.2 参数传递基本数据类型
-
示例:
-
public class DemoTest { public static void main(String[] args) { int a = 10; int b = 20; swap(a, b); System.out.println("main中的a是" + a); System.out.println("main中的b是" + b); } static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("swap方法中的a是:" + a); System.out.println("swap方法中的a是:" + b); } }
-
注意:传递基本数据类型时,实参与形参之间为值传递,因此方法内的形参变量与调用方的实参变量无关。
4.3 参数传递引用数据类型
-
当方法的形式参数是引用数据类型时,其实传递的是一个对象的内存地址,在方法的内部可以通过这个内存地址,访问方法外创建的对象。
-
示例:
-
import java.util.Arrays; public class DemoTest { public static void main(String[] args) { int[] arr = new int[]{100, 33, 4, 55, 6, 7}; swap(arr); System.out.println(Arrays.toString(arr)); } static void swap(int[] arr) { Arrays.sort(arr); } }
5. 方法重载
-
重载:overload
-
方法的重载:在同一个类中,方法名相同,参数列表不同
-
方法的重载与返回值类型、访问修饰符无关。
-
注意事项:
-
是在同一个类中。方法名不相同的方法中,不可能发生方法的重载的。
-
方法名称相同:一模一样。
-
参数列表不同:参数类型不同;参数个数不同;参数类型的顺序不同。
-
与返回值类型无关。方法是否是重载,与返回值类型没有关系。
-
如果方法的名称和参数列表都一样,即使返回值类型不同,也不算重载,属于方法的重复定义。
-
-
记忆口诀
-
两同一不同:同一个类,同一个方法名,参数不同(参数列表不同、参数个数不同、参数类型不同)
-
-
重载优点:
-
没有重载的时候,相同逻辑相同功能的代码,需要定义很多个方法名称。调用者在记忆方法名称的时候,就有很大的负担。
-
有重载之后,相同功能逻辑的方法,只需要记忆一个名字。
-
当前学习过的常见重载:
-
println方法,任意类型的数据,都可以放到这个方法中打印。在System.out类型中,将各种数据类型的打印方法,都定义出来了,都起了println方法的名称。
-
-
示例:求和
public class ParamsTest {
public static void main(String[] args) {
sum(1, 2);
sum(1, 2, 3);
sum(1, 2, 3, 5, 4, 7, 8);
}
static void sum(int a, int b) {
int sum = a + b;
System.out.println(sum);
}
static void sum(int a, int b, int c) {
int sum = a + b + c;
System.out.println(sum);
}
// 可变个数形参
static void sum(int... n) {
int sum = 0;
for (int i : n) {
sum += i;
}
System.out.println(sum);
}
}
-
编写程序,定义三个重载方法并调用。方法名为mOL。
-
三个方法分别接收一个int参数、两个int参数、一个字符串参数。
分别执行平方运算并输出结果,相乘并输出结果,输出字符串信息。
在主类的main ()方法中分别用参数区别调用三个方法。
5.1可变个数形参(语法糖)
-
可变个数形参(语法糖),本质为数组,必须放在参数列表的最后一位。
-
/* 可变个数形参的方法 * * 1.jdk 5.0新增的内容 * 2.具体使用: * 2.1 可变个数形参的格式:数据类型 ... 变量名 * 2.2 当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,。。。 * 2.3 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载 * 2.4 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。 * 2.5 可变个数形参在方法的形参中,必须声明在末尾 * 2.6 可变个数形参在方法的形参中,最多只能声明一个可变形参。 * */ 2.4 综合上方案例: static void sum(int[] arr) { //不允许共存 } static void sum(String[] arr) { // 允许重载 } 2.5 static void sum(int a, int b, int... n) { // 允许 } static void sum(int... n, int a, int b) { // 不允许 } static void sum(String... m, int... n) { // 不允许 }