概述
方法的意义:
在编程中某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会:1. 使程序变得繁琐2. 开发效率低下,做了大量重复性的工作3. 不利于维护,需要改动时,所有用到该段代码的位置都需要修改4. 不利于复用因此,在编程中,我们也可以将 频繁 使用的代码封装成 " 帖子 "( 方法 ) ,需要时直接拿来链接 (即方法名--方法的入口地址) 使用即可,避免了一遍一遍的累赘。
一、什么是方法
方法其实就是一段代码片段,与C语言中的函数十分相似,两者的相似处集中体现在:
二、方法的定义
方法的语法格式为:
修饰符 + 返回参数类型 + 方法名(参数类型 形参名){
[return参数];
}
public int Add(int n,int m){return n+m;}
1. 修饰符:现阶段直接使用 public static 固定搭配2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void3. 方法名字:采用小驼峰命名4. 参数列表:如果方法没有参数, () 中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开5. 方法体:方法内部要执行的语句6. 在 java 当中,方法必须写在类当中7. 在 java 当中,方法不能嵌套定义8. 在 java 当中,没有方法声明一说
三、方法的调用过程
1、实参与形参的关系
public class demo {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println("main: a = " + a + " b = " + b);
}
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
System.out.println("swap: x = " + x + " y = " + y);
}
}
运行结果:
为何调用方法之后main方法中的a和b并没有交换?
1、方法中的参数变量是形式参数2、调用方法时动态处理的参数是形式参数,形式参数是实际参数的一份拷贝3、main方法中的实际参数与其他调用方法中的形式参数没有直接联系,只是在栈中开辟了空间存放变量,不同的方法开辟不同的空间存放方法中的变量4、方法中的形式参数有生命周期(也就是和C语言中的函数一样,未静态初始化的参数在被函数调用之后会被回收)
2、没有返回值的方法
方法是否有返回值要根据具体代码需求而定,如果没有需求那就不需要返回值,没有返回值的方法参数类型一定是void
例如:
class Test {
public static void main(String[] args)
{
int a = 10;
int b = 20;
print(a, b);
}
public static void print(int x, int y) {
System.out.println("x = " + x + " y = " + y);
}
}
这个代码块中print这个方法我们只是需要它具备一个打印的功能,并不需要方法返回参数,所以这个方法就没有返回值
3、方法的重载
为什么需要方法重载?何为方法重载?方法重载的具体体现?
先看代码:
public class TestMethod {
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
double a2 = 10.5;
double b2 = 20.5;
double ret2 = add(a2, b2);
System.out.println("ret2 = " + ret2);
}
public static int add(int x, int y) {
return x + y;
}
}
// 编译出错
Test.java:13: 错误: 不兼容的类型: 从double转换到int可能会有损失
double ret2 = add(a2, b2);
代码中add方法的功能是实现两数相加,而方法的返回值是int,当其他类型的数据也要调用add方法时会先进行类型提升,导致返回值类型发生变化,由此会出现程序报错
因此,为了避免出现代码执行的时候出现逻辑错误,在定义方法时可以根据不同的参数需求对方法进行重载
重载
如何对方法进行重载?
改变形参数量,形参次序,形参类型,返回值类型
(注:多个方法进行重载方法名字一定是一样的,否则就不算是重载,而是定义了多个不同的方法)
4、方法签名
四、递归
public class demo1 {
public static void main(String[] args) {
demo1 d1 = new demo1();
System.out.println("请输入所求阶乘数字:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println("所求数字的阶乘为:");
System.out.println(d1.sub(num));
}
public int sum = 0;
public int sub(int num) {
if(num==0||num==1)
return 1;
return num*sub(num-1);
}
}
上述的代码中sub就是求阶乘的方法,计算阶乘只有两个小步骤:num*(num-1)的递归,结束递归的条件判断
在后续的数据结构中,创建树,链表,顺序表,树的遍历、压栈进栈等等,都会频繁使用到递归。
本期博客就到此为止啦!看完觉得有收获的可以点点赞啦