文章目录
- 一 . 方法的初步认识
- 二 . 方法的定义
- 三 . 方法调用的执行过程
- 四 . 实参与形参的关系
- 五 . 方法的重载
一 . 方法的初步认识
方法其实就是一些代码片段,类似于c语言中的函数
方法存在的意义(理解):
- 是能够模块化的组织代码(当代码规模比较复杂的时候).
- 做到代码被重复使用, 一份代码可以在多个位置使用.
- 让代码更好理解更简单.
- 直接调用现有方法开发, 不必重复造轮子.
举个例子,比如现在我们要开发一款日历,经常需要判断一个年份是不是闰年,我们就可以吧判断闰年的代码代码写出来封装成我们的方法
public static void isLeapYear(int year){
if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
System.out.println(year+"年是闰年");
}else{
System.out.println(year+"年不是闰年");
}
}
上面是我们对方法的一个小例子,那方法到底应该如何定义呢?
二 . 方法的定义
基本格式如下
[修饰符列表] [返回值类型] 方法名 [形式参数列表]{
方法体
[return返回值]
}
举一个例子,构造一个加法方法,请注意,我们现阶段所写的方法的修饰符列表全部都用public static进行修饰,具体的原理我们在后续类与对象再进行解释,先记下来吧…
public static int add(int num1,int num2){
return num1+num2;
}
注意事项
- 修饰符:现阶段直接使用public static 固定搭配
- 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成
void - 方法名字:采用小驼峰命名
- 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
- 方法体:方法内部要执行的语句
- 在java当中,方法必须写在类当中
- 在java当中,方法不能嵌套定义
- 在java当中,没有方法声明一说
三 . 方法调用的执行过程
调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行
其实这一块就是c语言中的函数栈帧的内容,每次调用方法就会进行压栈操作,方法结束之后就会进行销毁,继续执行…还有就是要特别注意一点的就是方法调用的时候传递的参数一定是值传递,无非就是这个值是实际的值,还是地址的问题
代码示例:
计算阶乘和
public class TestMethod {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += fac(i);
}
System.out.println("sum = " + sum);
}
public static int fac(int n) {
System.out.println("计算 n 的阶乘中n! = " + n);
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
}
// 执行结果
计算 n 的阶乘中 n! = 1
计算 n 的阶乘中 n! = 2
计算 n 的阶乘中 n! = 3
计算 n 的阶乘中 n! = 4
计算 n 的阶乘中 n! = 5
sum = 153
四 . 实参与形参的关系
你就记住一句话,形参永远是实参的一份临时拷贝
我们现在写一个进行两个数交换的方法
public class Method{
public static void main(String[] args){
int num1 = 15;
int num2 = 25;
swap(num1,num2);
System.out.println("num1的值是"+num1+" num2的值是"+num2);
}
public static void swap(int num1,int num2){
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println("num1的值是"+num1+" num2的值是"+num2);
}
}
该方法的执行结果是
num1的值是25 num2的值是15
num1的值是15 num2的值是25
可以发现其实根本就没有交换,这是因为实参和形参是独立的
在c语言里面我们可以通过指针来操作,但是java没有…
那要如何完成呢,现在我们用数组来完成
public class Method{
public static void main(String[] args) {
int[] arr = new int[]{1,3,7,5};
for(int element : arr){
System.out.print(element+" ");
}
swap(arr,1,3);
System.out.println();
for(int element : arr){
System.out.print(element+" ");
}
}
public static void swap(int[] arr,int i,int j){
if(i == j){
return;
这里是因为
位运算如果i == j,这样操作的话,会直接将该位置为0
}
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}
执行结果
1 3 7 5
1 5 7 3
这里大家就和奇怪了,不是说任何时候都是值传递么,是相互独立的…
首先,确实是值传递,但是这里面的值,其实是地址,因为数组是一个引用类型,arr中保存的其实是数组在堆空间的地址,地址拷贝过去之后,可以通过堆空间的地址来改变我们的数组内容,也就完成内容的修改
所以我们总结一下传参的本质
1. 任何时候都是值传递
2. 基本数据类型就是单纯的"值"
3. 引用数据类型的"值"其实是地址
五 . 方法的重载
记住下面的几点
1 . 函数名称一样
2 . 形式参数列表不一致(数量,类型,顺序)
3 . 返回值不影响
方法重载的出现其实是对一些相似的功能进行统一化
比如我们最常见的输出方法
System.out.println();
括号里面可以传整型,浮点型,字符型,字符串…
我们用一个加法的方法重载举例子
public static int add(int num1,int num2){
return num1 + num2;
}
public static double add(double num1,double num2){
return num1 + num2;
}
public static float add(float num1,float num2,float num3){
return num1 + num2 +num3;
}