个人简介
> 📦个人主页:轻狂客_零度的主页
> 🏆学习方向:JAVA后端开发
> 📣种一棵树最好的时间是十年前,其次是现在!
> ⏰往期文章:【Java基础】数组
> 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。
前言
方法是什么
方法是一种语法结构,它可以把一段代码封装成一个功能,以方便重复调用
使用方法的好处是
1. 提高了代码的复用性
2. 让程序的逻辑更清晰
活动地址:CSDN21天学习挑战赛
目录
前言
1. 方法定义, 调用
编辑2. 方法使用的常见问题
方法常见问题
3. 方法案例
简易计算器的实现
4. 方法调用的内存图
5. 方法的参数传递机制
5.1 基本类型的参数传递
5.2 引用类型的参数传递
6. 方法重载
7.方法重写
8.四种权限修饰符
9.练习: 方法调用的顺序
10.补充知识: 单独使用return关键字
11.拓展 : 方法的递归
1. 方法定义, 调用
1.1 方法的完整格式
修饰符 返回值类型 方法名(参数列表){ 方法体 }
1.2 如何确定我们要调用哪个方法呢?
方法名+参数列表
1.3 一个方法被调用,就会执行这个方法的功能,执行完毕就返回到方法被调用的位置,在第几行调 用,程序就返回到第几行继续向下执行
如果这个方法有返回值,我们有两种选择:
1). 选择只执行功能,不接收返回值,不再继续使用这个方法的结果
2). 选择在方法调用的位置接收这个方法的返回值,接收到的返回值可以在方法外继续使用
2. 方法使用的常见问题
方法常见问题
1. 方法的编写顺序无所谓。
2. 方法与方法之间是平级关系,不能嵌套定义。
3. 方法的返回值类型为void(无返回值),方法内则不能使用return返回数据,如果方法的返回值类型写了具体类型,方法内部则必须使用return返回对应类型的数据。
4. return语句下面,不能编写代码,因为永远执行不到,属于无效的代码。
5. 方法不调用就不执行, 调用时必须严格匹配方法的参数情况。
6. 有返回值的方法调用时可以选择定义变量接收结果,或者直接输出调用,甚至直接调用;无返回值方法的调用只能直接调用。
3. 方法案例
简易计算器的实现
package com.example.review;
import java.util.Scanner;
/*本类用于实现简易计算器*/
public class TestCalc {
public static void main(String[] args) {
f0();//调用一个实现计算器的方法
}
private static void f0() {
while(true){//死循环,让用户可以一直算
//1.提示并接收用户输入的两个数
System.out.println("请您输入要计算的第1个数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请您输入要计算的第2个数:");
int b = new Scanner(System.in).nextInt();
//2.提示并接收用户输入的运算符
System.out.println("请您输入要计算的运算符,支持:+ - * / :");
String s = new Scanner(System.in).nextLine();
//3.根据运算符的不同,调用不同的计算方法进行计算并输出结果
switch(s){
case "+" : f1(a,b);break;
case "-" : f2(a,b);break;
case "*" : f3(a,b);break;
case "/" : f4(a,b);break;
default: System.out.println("您输入的运算符不正确!");
}
//4.询问用户是否想继续运算
System.out.println("如果想退出,请输入1,继续请输入2");
int flag = new Scanner(System.in).nextInt();
if(flag == 1){break;}
}
}
private static void f4(int a, int b) {//将拿到的两个数a和b做除法运算并打印结果
System.out.println(a+"和"+b+"做除法的结果为:"+(a/b));
}
private static void f3(int a, int b) {//将拿到的两个数a和b做乘法运算并打印结果
System.out.println(a+"和"+b+"做乘法的结果为:"+(a*b));
}
private static void f2(int a, int b) {//将拿到的两个数a和b做减法运算并打印结果
System.out.println(a+"和"+b+"做减法的结果为:"+(a-b));
}
private static void f1(int a, int b) {//将拿到的两个数a和b做加法运算并打印结果
System.out.println(a+"和"+b+"做加法的结果为:"+(a+b));
}
}
4. 方法调用的内存图
方法没有被调用的时候,在方法区中的字节码文件中存放
方法被调用的时候,需要进入到栈内存中运行
方法的运行区域在哪里?
栈内存
5. 方法的参数传递机制
5.1 基本类型的参数传递
如果方法的参数类型是基本类型,传入的是实际的字面值,如果是引用类型,传入的是地址值
形参:形式意义上的参数,比如方法参数列表的参数名,光看参数名是无法确定这个变量的值是多少的
实参:实际意义上的参数,比如我们的局部变量,比如成员变量,比如调用方法时传入的数字
5.2 引用类型的参数传递
基本类型和引用类型的参数在传递的时候有什么不同?
1). 都是值传递。
2). 基本类型的参数传输存储的数据值。
3). 引用类型的参数传输存储的地址值。
6. 方法重载
- 我们根据方法名+参数列表确定具体调用哪个方法
- 方法的重载:在同一个类中,存在方法名相同,但参数列表不同的方法
- 如果在同类中,同名方法的参数个数不同,一定构成重载
- 如果在同类中,同名方法的参数个数相同,需要查看对应位置上参数的类型,而不是参数名,与参数名无关
比如:
(int a,String b)与(int b,String a)–不构成重载
(int a,String b)与(String a,int b)–构成重载
方法重载的作用 ?
7.方法重写
子类继承了父类以后,想要在不改变父类代码的情况下,实现功能的修改与拓展
重写遵循的规则: 两同 两小 一大
一大: 子类方法的修饰符权限 >= 父类方法的修饰符权限
两同: 方法名与参数列表与父类方法保持一致
两小: 子类方法的返回值类型 <= 父类方法的返回值类型,注意:这里的<=说的是继承关系,不是值的大小
子类方法抛出的异常类型 <= 父类方法抛出的异常类型
8.四种权限修饰符
修饰符 | 同类 | 同包 | 子类 | 不同包(无关类) |
public | YES | YES | YES | YES |
protected | YES | YES | YES | NO |
默认 | YES | YES | NO | NO |
private | YES | NO | NO | NO |
9.练习: 方法调用的顺序
package com.example.basic;
/*本类用于测试方法的调用*/
public class MethodDemo {
//1.创建程序的入口函数main()
public static void main(String[] args) {
System.out.println("main() start...");
m1();
System.out.println("main() stop...");
int a =5;
System.out.println(a);
}
//2.创建m1()
private static void m1() {
System.out.println("m1() start...");
m2();
System.out.println("m1() stop...");
}
private static void m2() {
System.out.println("m2() start...");
}
}
10.补充知识: 单独使用return关键字
如果要直接结束当前方法的执行,怎么解决?
1). return; 跳出并立即结束所在方法的执行。
2). break; 跳出并结束当前所在循环的执行。
3). continue; 结束当前所在循环的当次继续,进入下一次执行。