目录
一、方法
1、方法(method)是程序中最小的执行单元。
public static void main(String[] args) { // main方法,主方法 System.out.println("heeloworld"); }
2、实际开发中,什么时候用到方法?
重复的代码,鞠永独立功能的代码可以抽取到方法中。
3、实际开发中,方法由什么好处?
- 可以提高代码的复用性
- 可以提高代码的可维护性
4.方法的注意原则:
- 方法不调用就不执行
- 方法与方法之间是平级关系,不能互相嵌套定义
- 方法的编写顺序和执行顺序无关
- 方法的返回值类型为void,表示该方法没有返回值;没有返回值的方法可以省略return语句不写。如果要编写return,后面不能跟具体的数据。
- return语句下面,不能编写代码,因为永远执行不到,属于无效代码。
二、方法的格式
1.方法的定义
把一些代码打包在一起,该过程称为方法定义。
注意:方法名 命名遵循 驼峰原则
方法的定义格式:
public static 返回值类型 方法名(参数){ 返回体; return 返回值; }
1.1 最简单的方法定义
格式 | 范例 |
| |
练习:看代码说结果
public static void main(String[] args) { System.out.println("a"); method1(); System.out.println("b"); } public static void method1() { method2(); System.out.println("c"); } public static void method2() { System.out.println("d"); System.out.println("e"); } }
运行结果:
1.2 带参数的方法定义
形参:全程形式参数,指方法定义中的参数
格式 | 范例 | |
单个参数 | | |
多个参数 | | |
方法定义的小技巧:
- 我要干什么? - - - > 方法体(打印语句)
- 我干这件事情需要什么才能完成? - - - > 形参
1.3 带返回值的方法定义
方法的返回值其实就是方法运行的最终结果。
- 如果在调用处要根据方法的结果,去编写另外一段代码逻辑
- 为了在调用处拿到方法产生的结果,就需要定义带有返回值的方法。
return关键字:
- 方法没有返回值:可以省略不写。如果书写,表示结束方法。
- 方法有返回值:必须要写。表示结束方法和返回结果。
格式 | 范例 |
| |
2.方法的调用
方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用。
2.1 最简答的方法调用
格式 | 范例 |
| |
2.2 带参数的方法代用
实参:全称实际参数,方法调用中的参数。
注意:方法调用时,形参和实参必须一一对应,否则程序将报错。
格式 | 范例 | |
单个参数 | | |
多个参数 | | |
2.3 带返回值的方法调用
格式 | |
直接调用 | |
赋值调用 | |
输出调用 | |
练习:
public static void main(String[] args) { //直接调用 getSum(10, 20, 30); //赋值调用 int sum = getSum(10, 20, 30); System.err.println(sum); //输出调用 System.out.println(getSum(10, 20, 30)); } public static int getSum(int num1,int num2,int num3) { int result = num1+num2 +num3; return result; }
三、方法的重载
需求:(1)定义一个方法求两个整数的和;定义一个方法求三个整数的和;定义一个方法求四个整数的和;(2)定义一个方法求两个小数的和;
public static int sumTwo(int a, int b) { return a + b; } public static int sumThree(int a, int b, int c) { return a + b + c; } public static int sumFour(int a, int b, int c, int d) { return a + b + c + d; } public static double ? ? ? (double a, double b) { //通过查找???是sumTwodecimals //但是自己去定义很痛苦 //因此会用到方法重载来解决 return a + b; }
1. 重载概念
- 在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。
- 每一方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系
简单记:同一个类中,方法名相同,参数不同的方法,与返回值无关
参数不同:个数不同、类型不同、顺序不同
2. 重载练习
2.1 区分以下方法是否构成重载
要求:
- 会判断方法之间是否构成重载关系
public class MethodDemo{ public static void fn(int a){ //方法体 } public static int fn(int b){ //方法体 } }
原因:参数个数相同
✖ public class MethodDemo{ public static float fn(int a){ //方法体 } public static int fn(int a,int b){ //方法体 } }
✔ public class MethodDemo1{ public static void fn(int a){ //方法体 } } public class MethodDemo2{ public static int fn(double a){ //方法体 } }
原因:不在同一个类
✖ public class MethodDemo{ public static void fn(int a){ //方法体 } public static int fn(double b){ //方法体 } }
✔ public class MethodDemo{ public static void fn(int a,double b){ //方法体 } public static void fn(double a,int b){ //方法体 } }
原因:顺序不同可以构成重载,但是不建议!
✔
2.2 方法重载
- 会定义重载的方法
需求:使用方法重载的思想,设计比较两个整数是否相同的方法。
要求:兼容全整数类型( byte,short,int,long )public static void main(String[] args) { //调用 campare(10, 20); campare((byte)10, (byte)20); //强制转换 } //会把相同功能的方法名起成一样名字 //好处1:定义方法的时候可以不用那么多单词命名 //好处2:调用方法的时候也不需要那么麻烦 public static void campare(byte b1,byte b2) { System.err.println(b1 == b2); } public static void campare(short s1,short s2) { System.err.println(s1 == s2); } public static void campare(int i1,int i2) { System.err.println(i1 == i2); } public static void campare(long g1,long g2) { System.err.println(g1 == g2); }
四、方法练习
1. 数组遍历
需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如: [11, 22, 33, 44, 55]
public static void main(String[] args) {
// 1.定义数组
int[] arr = { 11, 22, 33, 44, 55 };
printArr(arr);
/*
* System.out.println("abc"); //先打印abc,再进行换行
* System.out.print("abc"); //先打印abc,不进行换行
*/
}
// 2.定义方法用于数组遍历
public static void printArr(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i]+",");
if (i == arr.length - 1) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ",");
}
}
System.out.print("]");
}
2. 求数组最大值
需求:设计一个方法求数组的最大值,并将最大值返回
public static void main(String[] args) {
//1.定义数组
int[] arr = {11,22,33,44,55};
//2.调用方法求最大值
int max = getMax(arr);
System.out.println(max);
}
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
3. 复制数组
需求:定义一个方法copyOfRange(int[] arr,int from, int to)
功能:将数组arr中从索引from ( 包含from)开始。到索引to结束(不包含to)的元素复制到新数组中,将新数组返回。
public static void main(String[] args) {
// 1.定义数组
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// 2.调用方法复制数组
int[] copyArr = copyOfRange(arr, 3, 7);
// 3.遍历copy数组
for (int i = 0; i < copyArr.length; i++) {
System.out.print(copyArr[i] + ",");
}
}
public static int[] copyOfRange(int[] arr, int from, int to) {
// 1.定义新数组
// 静态:知道所有元素
// 动态:知道元素个数
int[] newArr = new int[to - from];
// 2.把原始数组arr中的from到to对应元素,直接拷贝到newArr中
int index = 0; // 伪造索引思想
for (int i = from; i < to; i++) {
// 格式:数组名[索引] = 数据值;
newArr[index] = arr[i];
index++;
}
// 3.返回新数组
return newArr;
}
运算结果:
五、方法的内存
- 方法调用的基本内存原理
- 方法传递基本数据类型的内存管理
- 方法传递引用数据类型的内存管理
1. JAVA内存分配
类别 | 内容 |
栈 | 方法运行时使用的内存,方法进栈运行,运行完毕就出栈 |
堆 | new出来的,都在堆内存中开辟了一个小空间 |
方法区 | 存储可以运行的class文件 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
寄存器 | 给CPU使用,和我们开发无关 |
1.1 栈类别内存调用和原理
public static void main(String[] args) {
int number = 100;
System.out.println("number的值为"+ number);
}
内存执行前后前后变化:
![]() | ![]() |
2. 方法传递
2.1 基本数据类型
变量中存储的是真是的数据。
| ![]() |
2.2 引用数据类型
只要new出来的都是引用数据类型。
获取数组数据:
- ①栈内存中变量arr记录的不是数组中真实数据{1,2,3},而是记录其他空间的地址值。
- ②先通过arr找到右边数组,再通过索引获取数据。
引用:使用了其他空间中的数据
| ![]() |
3. 方法传递参数
基本数据类型 | 引用数据类型 |
| |
![]() | ![]() |
传递的是真实数据 | 传递的是地址值 |