java 斐波那契数列 重载方法_Java之方法与方法重载

一、什么是方法?

在日常生活中,方法可以理解为要做某件事情,而采取的解决方法

比如:小明刚出家门,要去学校上课,这就面临一个问题需要解决,小明应该怎么去学校呢?有什么解决办法吗?

可以采用坐公交车或者走路又或者坐出租车的方法去学校,那么,这种解决某件事情的办法,就称之为方法

在Java中,方法就是用来解决某件事情或实现某个功能的代码块

方法的实现过程中,会包含很多语句用于完成某个特定功能---通常是处理文本,控制输入或计算数值

二、方法的语法格式?

修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){

方法体(多个执行语句);

...

return 返回值;

}

修饰符:方法的修饰符有很多,有对访问权限进行限定的(private,public等),有静态修饰符static,还有最终修饰符final等,这些老师暂时没讲,就先记着public static

返回值类型:用于限定返回值的数据类型

方法名:一个名字,但取名最好要有意义,尽量用英文,不要用拼音。为了方便我们调用方法

参数类型:用于接收调用方法时传入的数据的类型

参数名:用于接收调用方法时传入的数据的变量

方法体:实现该功能的代码

return:结束方法,将返回值带给调用者

例如:定义一个方法,计算两个整数的和,并输入这个结果

1 package com.cnblogs;2

3 public classMethodDemo {4 public static voidmain(String[] args) {5 int c = sum(5, 6);6 System.out.println("这两个数的和为:" +c);7 }8

9 public static int sum(int a, intb) {10 int c = 0;11 c = a +b;12 returnc;13 }14 }

结果为:这两个数的和为:11

三、方法调用的内存图

3cd6abb84b9a0b7c418addf3896352f6.png

分析:

1. 类,以及类的一系列方法都时存放在方法区中

2. main方法是程序的入口,运行main方法,将方法区的main方法加载到栈区中,创建一个int类型的变量c

3. 调用sum()方法,并将sum方法返回的值赋给变量c。调用sum()方法时,从方法区将sum方法加载到栈区

4. 创建两个形参变量a和b,由于调用sum方法时传了两个实参5和6,分别对应赋值a和b

5. 创建局部变量c,进行运算,将a+b的和赋给c,并且将结果c返回给调用者,此时sum方法结束,消栈,将栈区的sum方法清除,节约内存

6. 将sum(5, 6)方法返回的值赋给局部变量c(这个c是main方法中的局部变量),使用输出语句打印c的值,此时main方法结束,消栈,将栈区的sum方法清除,节约内存

四、void关键字

如果一个方法没有明确的返回值,则使用返回值类型使用void代替

1 package com.cnblogs;2

3 public classMethodDemo {4 public static voidmain(String[] args) {5 int x = 5;6 int y = 6;7 printNum(x, y);8 }9

10 public static void printNum(int a, intb) {11 System.out.println("a的值为:" + a + "\n" + "b的值为:" +b);12 }13 }

结果为:a的值为:5

b的值为:6

五、方法有哪几种方式?

1)有参有返回值

2)有参无返回值

3)无参有返回值

4)无参无返回值

1 package com.cnblogs;2

3 public classMethodDemo {4 public static voidmain(String[] args) {5

6 }7 //有参有返回值

8 public static int sum(int a, intb) {9 return a +b;10 }11 //有参无返回值

12 public static void printNum(inta) {13 System.out.println("值为:" +a);14 }15 //无参有返回值

16 public static intreturnNum(){17 return 3;18 }19 //无参无返回值

20 public static voidhelloWorld() {21 System.out.println("Hello World!");22 }23 }

六、方法的调用有几种方式?

1)单独调用  ->  没有返回值的方法使用这种调用方式

2)赋值调用  ->  有返回值的方法调用方式

3)输出调用  ->  有返回值的方法调用方式

1 package com.cnblogs;2

3 public classMethodDemo {4 public static voidmain(String[] args) {5 //单独调用

6 helloWorld();7 //赋值调用,通常用于如果后续还需要对这个结果进行处理的话,就使用这种方式

8 int a =returnNum();9 //输出调用

10 printNum(5);11 }12 //有参有返回值

13 public static int sum(int a, intb) {14 return a +b;15 }16 //有参无返回值

17 public static void printNum(inta) {18 System.out.println("值为:" +a);19 }20 //无参有返回值

21 public static intreturnNum(){22 return 3;23 }24 //无参无返回值

25 public static voidhelloWorld() {26 System.out.println("Hello World!");27 }28 }

七、方法的重载

在同一个类中具有多个重名的方法叫做方法重载,方法重载是让类以统一的方式处理不同类型数据的一种手段

具备重载的三个条件:

1)在同一个类中

2)方法名必须相同

3)方法的参数列表不同(参数类型不同或者参数个数不同,与返回值类型没有关系)

扩展:

1)和成员方法一样,构造方法也可以重载

2)声明为final的方法不能被重载

1 package com.cnblogs;2

3 public classMethodDemo {4 public static voidmain(String[] args) {5 System.out.println(sum(6.0, 7.3));6 System.out.println(sum(6, 7));7 }8

9 public static int sum(int a, intb) {10 return a +b;11 }12 public static double sum(double a, doubleb) {13 return a +b;14 }15 }

八、方法的参数列表

如果是基本类型  ->  实际传递的是数值,形参的改变不会影响实参

如果是引用类型  ->  实际传递的是地址值,形参的改变会影响实参

1)基本类型时?

1 public classArgsDemo {2 public static voidmain(String[] args) {3 //定义变量

4 int a = 10;5 int b = 20;6 System.out.println("a:" + a + ",b:" + b);//a:10,b:20

7 change(a, b);8 System.out.println("a:" + a + ",b:" + b);//a:10,b:20

9 }10

11 public static void change(int a, int b) { //a=10,b=20

12 System.out.println("a:" + a + ",b:" + b);//a:10,b:20

13 a = b; //a=20;

14 b = a + b;//b=40;

15 System.out.println("a:" + a + ",b:" + b);//a:20,b:40

16 }

17 }

34aaf13c142622b2a9ff70d52f3b9e67.png

2)引用类型时?

1 public classArgsDemo2 {2 public static voidmain(String[] args) {3 int[] arr = { 1, 2, 3, 4, 5};4 for (int x = 0; x < arr.length; x++) {5 System.out.println(arr[x]);//1,2,3,4,5

6 }7 change(arr);8 for (int x = 0; x < arr.length; x++) {9 System.out.println(arr[x]);//1,4,3,8,5

10 }11 }12

13 public static void change(int[] arr) {14 for (int x = 0; x < arr.length; x++) {15 //如果数组元素是偶数,值就变成了以前的2倍

16 if (arr[x] % 2 == 0) {17 arr[x] *= 2;18 }19 }20 }21 }

9a28479c20bee8412da892c249cc8612.png

九、方法的递归

其实就是方法自己调用自己

递归的前提:

1)定义的方法的调用次数不能太多,否则容易栈内存溢出错误

2)该方法必须要有一个结束条件

例如:求5的阶乘 5! = 5 * 4 * 3 * 2 * 1

1 public classTest10 {2

3 public static voidmain(String[] args) {4 int num = jc(5);5 System.out.println(num);6 }7

8 //1:出口条件 如果1 return 19 //如果不是1 return num*方法名(num-1)

10 public static int jc(intnum) {11 if (num == 1) {12 return 1;13 } else{14 return num * jc(num - 1);15 }16 }17 }

例如:不死神兔(斐波那契数列),有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子涨到第三个月后每个月又生一堆兔子,假如兔子不死,问第二十个月的兔子对数是多少?

解法一:使用数组来做

1 package com.cnblogs;2

3 public classRabbit {4 public static voidmain(String[] args) {5 int[] arr = new int[20];6 //第一个月和第二个月的兔子对数

7 arr[0] = 1;8 arr[1] = 1;9

10 //从第三个月开始

11 for(int x = 2; x < arr.length; x++) {12 arr[x] = arr[x - 1] + arr[x - 2];13 }14

15 System.out.println("第二十个月的兔子对数时:" + arr[19]);16 }17 }

解法二:递归思想

1 public classDemo7 {2 public static voidmain(String[] args) {3 System.out.println(getCount(20));4 }5

6 public static int getCount(intm) {7 if(m == 1 || m == 2) {8 return 1;9 }else{10 return getCount(m-1) + getCount(m-2);11 }12 }13 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值