1,方法是什么
方法:就是一段具有独立功能的代码块,不调用就不执行
2,使用方法有什么好处
示例:有两个数组,如果都想遍历其中的每个元素,如果不使用方法就需要两个循环输出
不使用方法:
int[] arr1 = {1, 2, 3, 4, 5, 6};
int[] arr2 = {3, 11, 22, 3, 4, 56, 1, 2, 3, 4, 5, 6};
// 一遍
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + "\t");
}
// 两遍
System.out.println();
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + "\t");
}
使用方法:很明显的提高了代码的复用性
int[] arr1 = {1, 2, 3, 4, 5, 6};
int[] arr2 = {3, 11, 22, 3, 4, 56, 1, 2, 3, 4, 5, 6};
print(arr1);
print(arr2);
}
public static void print(int[] arr1){
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + "\t");
}
System.out.println();
}
通过以上的代码:可以简单的总结下 使用方法的好处
- 提高代码的复用性
- 方便团队协作,分工明确 —–》 比如上面的print方法 职员A写,职员B只需要调用就好
3,如何定义和调用方法
这里入门先按照下面的形式进行定义:
public static void 方法名(){
方法体
}
修饰符 返回值类型 方法名(形参列表){
方法体代码(需要执行的功能代码)
return 返回值;
}
设计方法的时候应考虑:
- 方法是否需要接收数据处理
- 方法是否需要返回数据,并且返回数据的类型
注意事项:
-
如果方法不需要返回数据,返回值类型必须申明成void(无返回值声明), 此时方法内部不可以使用return返回数据。
-
方法如果不需要接收数据,则不需要定义形参,且调用方法时也不可以传数据给方法了。
-
没有参数,且没有返回值类型(void)声明的方法,称为无参数、无返回值的方法,依次类推。
方法定义时几个注意点:
方法的修饰符:暂时都使用public static 修饰。
方法声明了具体的返回值类型,内部必须使用return返回对应类型的数据。
形参列表可以有多个,甚至可以没有; 如果有多个形参,多个形参必须用“,”隔开,且不能给初始化值。
(1)方法在类中的位置放前放后无所谓,但一个方法不能定义在另一个方法里面。
(2)方法的返回值类型写void(无返回声明)时,方法内不能使用return返回数据,如果方法的返回值类型写了具体类型,方法内部则必须使用return返回对应类型的数据。
(3)return语句的下面,不能编写代码,属于无效的代码,执行不到这儿。
(4)方法不调用就不会执行, 调用方法时,传给方法的数据,必须严格匹配方法的参数情况。
(5)调用有返回值的方法,有3种方式:1、可以定义变量接收结果 2、或者直接输出调用,3、甚至直接调用;
(6)调用无返回值的方法,只有1种方式:1、只能直接调用。
// 注:(5)(6)实例如下:
// 1,直接调用 --- 》 适用于无返回值的数据
print();
// 2,赋值调用
int sum = sum(20, 32);
System.out.println(sum);
// 3,输出调用
System.out.println(sum(20, 11));
}
public static int sum(int num1, int num2) {
int sum = num1 + num2;
return sum;
}
public static void print() {
for (int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
}
5,方法在计算机中的执行原理
方法被调用的时候,是进入到栈内存中运行的。
代码经过编译成为.class字节码文件,jvm虚拟机执行,限制性main方法,入栈,当需要处理到其他的方法时,其他的方法入栈。即:只有当对应方法处理的时候才可以入栈。运行完毕,有返回值返回,然后出栈。
6,补充知识,debug的使用
这里有四个控制代码的箭头:
第一个(Step Over):无条件向下走一行 ,有方法跳过方法
第二个(Step Into):有方法进入方法,但是是自己所编写的方法代码
第三个(Force Step Into):进入到方法内,不管是自己编写的,还是系统提供的方法都进入
第四个(Step Out):退出当前的方法
7,参数传递
1,基本类型的参数传递 ——> 值传递,
值传递:指的是在传输实参给方法的形参的时候,传输的是实参变量中存储的值的拷贝。
实参:在方法内部定义的变量。
形参:定义方法时“(…)”中所声明的参数
public class MethodDemo {
public static void main(String[] args) {
int a = 10;
change(10);
System.out.print(a); // 这个时候打印的还是10,不是100
}
public static void change(int c){
a=100;
}
}
因为是值的拷贝,所以是两个独立的变量在两个独立的作用域中:即一个main方法作用域,一个change方法作用域
2,引用类型的参数传递
前四天接触的引用类型只有 数组:所以这里用数组举例,在04-数组的介绍中说到,栈中是数组的引用,引用的是堆中变量的地址:即可以得出,数组的赋值只是把其引用的地址值赋予调用者。如下图:arr1和arr2指向同一个堆中的数据,所以如果有一个通过引用来修改堆中的数据的时候,再用另一个引用来获取数据的时候必然是修改过的数据;同过上面的代码作个展示
public class MethodDemo2 {
public static void main(String[] args) {
int[] arr = {10};
change(arr);
System.out.print(arr[0]); // 这个时候打印的还是100,因为另一个引用修改了共同引用的堆中的值
}
public static void change(int[] arr){
arr[0] = 100;
}
}
基本类型和引用类型的参数在传递的时候有什么不同?
-
都是值传递
-
基本类型的参数传输存储的数据值。
-
引用类型的参数传输存储的地址值。
8,方法的重载
一个类中,出现多个方法的名称相同,但是它们的形参列表是不同的,那么这些方法就称为方法重载
和修饰符,返回类型无关;
形参列表不同:是指形参的个数,数据类型,顺序不同,和起什么名字无关
个数不同:
public static void sum(int num1,int num2,int num3){}
public static void sum(int num1){}
数据类型不同:
public static void max(int n1,double n2){}
public static void max(int n1,int n2){}
顺序不同:
// 这样重载的好处,根据不同的参数顺序可以使用不同的方法处理
public static void add(int num1,double num2){
}
public static void add(double num2,int num1){
}
9,return , break,continue的区别
return; 跳出并立即结束所在方法的执行。
break; 跳出并结束当前所在循环的执行。
continue; 结束当前所在循环的当次继续,进入下一次执行。
10,目标
- 能够说出方法的作用
- 能够按照业务需求定义出合适的方法格式
- 能够说出方法调用的写法
- 能够理解方法调用的内存图
- 能够说出方法的参数传递是什么样的
- 能够说出方法重载的概念,以及法重载的识别技巧
- 能够说出在方法中单独使用return关键字的作用