目录
一、方法
概述:方法就是封装,将经常复用的代码抽取出去,实现多次调用
好处:使程序结构更清晰,易于复用
组成:方法调用,方法实现(定义)
分类:无参数无返回值方法,有参数无返回值方法,有参数有返回值方法
1.无参数无返回值
public static void main(String[] args) {
//案例:打印静夜思,每打印一句,则打印10个‘-’
//使用方法进行封装
System.out.println("床前明月光");
print(); //方法调用
System.out.println("疑是地上霜");
print(); //方法调用
System.out.println("举头望明月");
print(); //方法调用
System.out.println("低头思故乡");
print(); //方法调用
}
//方法实现处需要修饰符:public static void无返回值类型
//print():表示没有参数的print方法
public static void print(){
for(int i=1;i<=10;i++) {
System.out.print("-");
}
System.out.println(); //换行
}
方法特点:方法不调用不执行; 方法与方法之间平级关系,不能嵌套定义
2.有参数无返回值
带参数的好处:进一步提升了方法的复用性
public static void main(String[] args) {
//案例:打印静夜思,每打印一句,则打印10个‘-’
//需求:使用方法进行封装,第一句打印10分‘-’,二打印12个‘-’,依次类推
//可以使用有参数无返回值方法
System.out.println("床前明月光");
print(10); //实参-调用处传入的参数
System.out.println("疑是地上霜");
print(12); //方法调用
}
public static void print(int n){ //形参-定义处的参数
for(int i=1;i<=n;i++) {
System.out.print("-");
}
System.out.println(); //换行
}
带两个参数的案例
public static void 方法名(int a,int b){}
带两个参数,中间使用‘,’隔开即可
public static void main(String[] args) {
//带两个参数的案例:
//案例:打印静夜思,打印符号个数与符号,从参数中传入
System.out.println("床前明月光");
print(10, '#');
System.out.println("疑是地上霜");
print(12, '&');
}
public static void print(int n,char f) {
for(int i=1;i<=n;i++) {
System.out.print(f);
}
System.out.println(); //换行
}
3.有参数有返回值
返回值的好处:可扩展性更强
在后续的应用中,往往大多数场景下都会使用有参数有返回值的方法,这是最完整的功能的封装
ublic static void main(String[] args) {
//有参数有返回值方法:
//案例:求两个数的和
int sum = add(1,2);
System.out.println("和为:"+sum);
}
//方法实现处需要有int返回值类型;方法体中对应有return 值; 具体值由返回值类型约束
public static int add(int a,int b) {
int sum = a+b;
return sum;
}
二、return的细节
return表示跳出方法体,一般情况放到方法体的末尾;常用在带返回值的方法中,但也可放在无返回值方法中,只是不能带值;
注意:一个方法往往只做一种功能;例如:add-加法 sub-减法
1.return带值
public static void main(String[] args) {
//return应用在带返回值方法的细节说明:
//问题:能否在方法实现中多次重复return 值;
//答案:不行,后面的return是不可到达的
//可以写多次return的情况:在方法中有条件判断,每个出口都可以return 值;
int res = calc(2,1);
System.out.println("计算结果:"+res);
}
public static int calc(int a, int b) {
if(a>5) {
return a-b;
}else {
return a+b;
}
//return a-b; //不可到达的代码
}
2.return不带值
public static void main(String[] args) {
//案例:循环1~10,遇到3的倍数则结束,用方法封装
//分许:需要打印多个值,所以无需返回值;
print();
}
public static void print() {
for(int i=1;i<=10;i++) {
if(i%3==0) {
//break; //跳出循环
return; //跳出方法体
}
System.out.println(i);
}
System.out.println("方法最后...");
}
三、多级调用
方法的多级调用,也就是在方法实现中继续调另一个方法;多级调用,主要弄清楚调用的执行流程
public static void main(String[] args) {
//方法的多级调用案例:
System.out.println("main开始"); //1
a();
System.out.println("main结束"); //5
}
private static void a() {
System.out.println("a的开始"); //2
b();
System.out.println("a的结束"); //4
}
private static void b() {
System.out.println("b的方法执行..."); //3
}
四、递归
概述:自己调用自己,且需要有退出出口;如果没有出口,则是死递归
应用:往往能用循环的案例,则可使用递归
注意:能用其他方式解决,尽量不要用递归,因为有两个弊端。
弊端:1.容易死递归 2.执行效率低
应用场景:很少用,一般用在文件中,某些算法(例如链表)
1.死递归
public static void main(String[] args) {
//a();
}
private static void a() {
System.out.println("死递归,无用");
a(); //死递归,无退出出口
}
2.递归案例
public static void main(String[] args) {
//递归案例:求n的阶层 4的阶层
//4!->4*3的阶层
//3!->3*2的阶层
//2!->2*1的阶层
//1!->1(退出出口)
//递归是一个自己调自己方法,方法名往往写的较简单,例如: f()
//递归的步骤:
//1.找重复调用的规律
//2.需要定义方法
//3.设计退出出口
System.out.println(f(4)); //4的阶乘
//注意:如果有返回值类型,则直接可以打印该方法调用
}
public static int f(int n) {
if(n==1) {
return 1;
}
return n*f(n-1);
}
3.斐波拉契数列
规则:第一个数为0,第二个数为1;第三个=第1个+第2个;依次类推
分析:可以将每一项定一个标记值:0项,1项,2项...只需要循环,即可将所有数据打印输出
public static void main(String[] args) {
//斐波拉契数列:0,1,1,2,3,5,8,13....
Scanner sc = new Scanner(System.in);
System.out.print("请输入项数(从0开始):");
int n = sc.nextInt();
for(int i=0;i<=n;i++) {
System.out.print(f(i)+"\t");
}
}
public static int f(int n) {
if(n==0||n==1) { //第0项则返回0,第1项则返回1
return n;
}
return f(n-1)+f(n-2); //等于前两项的和
}
五、总结
1.引言
未使用方法前的某些场景冗余代码太多
2.方法(重点)
概述,作用,组成,分类
带参数好处;带返回值的好处
3.return的细节(重点)
return用在返回值方法中;return 值;
return用在无返回值方法中; return; 与break的区别
4.多级调用
了解概述及多级调用流程
5.递归(扩展)
概述,应用场景,步骤;
案例:求阶层; 斐波拉契数列