1 方法的概念
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
2 方法的定义和调用
(1)无参方法的定义和调用
// 定义方法
修饰符 返回值类型 方法名 (参数列表){
方法体...
}
// 调用方法
方法名();
例如:
// 定义方法
public static void methodName() {
System.out.println("这是一个无参方法");
}
// 调用方法
methodName();
(2)有参方法的定义和调用
参数:由数据类型和变量名组成 - 数据类型 变量名
// 定义方法
public static void 方法名 (参数1) {
方法体;
}
public static void 方法名 (参数1, 参数2, 参数3...) {
方法体;
}
// 调用方法
方法名(参数);
方法名(参数1,参数2);
(3)带返回值方法的定义和调用
我们经常会根据一个方法产出的结果,来去组织另一段代码逻辑,为了拿到这个方法产生得到结果,就需要定义带有返回值的方法。
// 定义方法
public static 数据类型 方法名(参数) {
return 数据 ;
}
// 调用方法1
方法名 ( 参数 ) ; // 【无结果】
// 调用方法2.1,输出方法返回值
数据类型 变量名 = 方法名(参数);
System.out.println(变量名);
// 调用方法2.2,输出方法返回值,也叫输出调用
System.out.println(方法名(参数));
注意:
- 方法不可以嵌套
- 不能用输出语句调用
void
类型的方法。因为方法执行后没有结果,也就打印不出任何内容 void
表示无返回值,可以省略return
,也可以单独的书写return
,后面不加数据,此时代表结束一个方法- 在一个方法中,
return
下面不能编写代码,因为永远执行不到,属于无效代码 - 有参方法调用时,参数的数量与类型必须与方法定义中的设置相匹配
- 每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失
- 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
- 方法的返回值通常会使用变量接收,否则该返回值将无意义
- 方法定义中的参数为形参,方法调用中的参数为实参
案例:打印n-m之间所有的奇数
public static void main(String[] args) {
// 5:main方法中调用print方法,传入两个实际参数
print(20,10);
}
//1:定义方法,名称为print
// 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
public static void print(int n, int m){
if(m < n){
System.out.println("您传入的数据有误, 请检查");
// return; 可以用于结束方法, 也就是将方法从栈内存中弹出去, 该过程称之为方法的弹栈
return;
// System.out.println(); 直接跟在return后,无法执行的代码, 无效代码
// 问题: return语句下面, 不是不能写代码吗?
// 因为return在if语句中,if语句有可能不执行,那么下面的代码就有可能执行
}
System.out.println(n + "到" + m + "之间的奇数为:");
// 3:方法中设计for循环,循环从n开始,到m结束
for(int i = 20; i <= 10; i++){
// 4:循环中加入if判断,是奇数,则打印
if(i % 2 == 1){
System.out.println(i);
}
}
}
3 方法的通用格式
public static 返回值类型 方法名(参数) {
方法体;
return 数据 ;
}
权限修饰符
Java中有四种权限修饰符:
public > protected > (default) > private
同一个类(我自己) YES YES YES YES
同一个包(我邻居) YES YES YES NO
不同包子类(我儿子) YES YES NO NO
不同包非子类(陌生人) YES NO NO NO
注意:
(default)并不是关键字“default”,而是根本不写。
编写代码时,如果没有特殊的考虑,建议这样使用权限:
- 成员变量使用 private ,隐藏细节
- 构造方法使用 public ,方便创建对象
- 成员方法使用 public ,方便调用方法
4 方法重载
方法名相同,参数也完全相同,称为方法的重复定义,是一种冲突性的错误。
方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返 回值类型无关。
参数列表
- 个数不同
- 数据类型不同
- 顺序不同
注意:
识别方法之间是否是重载关系,只看方法名和参数,跟返回值无关。
重载方法调用:JVM通过方法的参数列表,调用不同的方法
5 方法的参数传递
(1)方法参数传递基本类型
传入方法中的是具体的数值
public static void main(String[] args) {
int number = 100;
System.out.println("调用change方法前:" + number); // 100
change(number);
System.out.println("调用change方法后:" + number); // 100
}
public static void change(int number) {
number = 200;
}
结论:
基本数据类型的参数,形式参数的改变,不影响实际参数
结论依据:
每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失
(2)方法参数传递引用类型
传入方法中的是地址值
public static void main(String[] args) {
int[] arr = {
10, 20, 30};
System.out.println("调用change方法前:" + arr[1]); // 20
change(arr);
System.out.println("调用change方法后:" + arr[1]); // 200
}
public static void change(int[] arr) {
arr[1] = 200;
}
结论:
对于引用类型的参数,形式参数的改变,影响实际参数的值
结论依据:
引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果
6 方法的应用
(1)数组遍历
需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]
public static void main(String[] args) {
// 1.定义一个数组,用静态初始化完成数组元素初始化
int[] arr = {
11, 22, 33, 44, 55};
// 4.调用遍历方法
printArray(arr);
System.out.println("另外一段代码逻辑 ");
}
/*
2.定义一个方法,对数组进行遍历
1, 参数 int[] arr
2, 返回值类型 void
*/
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length -1){
// 如果满足条件, 说明是最后一个元素, 最后一个元素, 特殊处理
System.out.println(arr[i] + "]");
}else{
// 3.遍历打印的时候,数据不换行
System.out.print(arr[i] + ", ");
}
}
}
(2)获取数组最大值
需求:设计一个方法用于获取数组中元素的最大值
public static void main(String[] args) {
// 1.定义一个数组,用静态初始化完成数组元素初始化
int[] arr = {
11, 55, 22, 44, 33};
// 3.调用获取最大值方法,用变量接收返回结果
int max = getMax(arr);
// 4.把结果输出在控制台
System.out.println(max);
}
/*
2.定义一个方法,用来获取数组中的最大值
1, 参数 int[] arr
2, 返回值类型 int
*/
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(max < arr[i]){
max = arr[i];
}
}
return max;
}
(3)同时获取数组的最大值、最小值
需求:设计一个方法,该方法能够同时获取数组的最大值,和最小值
注意: return语句, 只能带回一个结果
public static void main(String[] args) {
int[] arr = {
11,55,33,22,44};
int[] maxAndMin = getMaxAndMin(arr);
System.out.println(maxAndMin[0]);
System.out.println(maxAndMin[1]);
}
public static int[] getMaxAndMin(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(max < arr[i]){
max = arr[i];
}
}
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if(min > arr[i]){
min = arr[i];
}
}
int[] maxAndMin = {
min, max}; // 当需要返回多个结果时,可以考虑将其放入数组中返回
return maxAndMin;
}