Java学习之方法(方法重载)

一、什么是方法?

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

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

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

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

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

二、方法的语法格式?

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

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

    ...

    return 返回值;

  }

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

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

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

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

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

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

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

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

  

 1 package com.cnblogs;
 2 
 3 public class MethodDemo {
 4     public static void main(String[] args) {
 5         int c = sum(5, 6);
 6         System.out.println("这两个数的和为:" + c);
 7     }
 8     
 9     public static int sum(int a, int b) {
10         int c = 0;
11         c = a + b;
12         return c;
13     }
14 }

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

三、方法调用的内存图

  分析:

  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 class MethodDemo {
 4     public static void main(String[] args) {
 5         int x = 5;
 6         int y = 6;
 7         printNum(x, y);
 8     }
 9     
10     public static void printNum(int a, int b) {
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 class MethodDemo {
 4     public static void main(String[] args) {
 5         
 6     }
 7     //有参有返回值
 8     public static int sum(int a, int b) {
 9         return a + b;
10     }
11     //有参无返回值
12     public static void printNum(int a) {
13         System.out.println("值为:" + a);
14     }
15     //无参有返回值
16     public static int returnNum(){
17         return 3;
18     }
19     //无参无返回值
20     public static void helloWorld() {
21         System.out.println("Hello World!");
22     }
23 }

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

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

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

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

 1 package com.cnblogs;
 2 
 3 public class MethodDemo {
 4     public static void main(String[] args) {
 5         //单独调用
 6         helloWorld();
 7         //赋值调用,通常用于如果后续还需要对这个结果进行处理的话,就使用这种方式
 8         int a = returnNum();
 9         //输出调用
10         printNum(5);
11     }
12     //有参有返回值
13     public static int sum(int a, int b) {
14         return a + b;
15     }
16     //有参无返回值
17     public static void printNum(int a) {
18         System.out.println("值为:" + a);
19     }
20     //无参有返回值
21     public static int returnNum(){
22         return 3;
23     }
24     //无参无返回值
25     public static void helloWorld() {
26         System.out.println("Hello World!");
27     }
28 }

七、方法的重载

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

  具备重载的三个条件:

    1)在同一个类中

    2)方法名必须相同

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

  扩展:

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

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

 1 package com.cnblogs;
 2 
 3 public class MethodDemo {
 4     public static void main(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, int b) {
10         return a + b;
11     }
12     public static double sum(double a, double b) {
13         return a + b;
14     }
15 }

八、方法的参数列表

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

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

  1)基本类型时?

 1 public class ArgsDemo {
 2     public static void main(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 
18 }

  2)引用类型时?

 1 public class ArgsDemo2 {
 2     public static void main(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 }

九、方法的递归

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

  递归的前提:

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

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

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

 1 public class Test10 {
 2 
 3     public static void main(String[] args) {
 4         int num = jc(5);
 5         System.out.println(num);
 6     }
 7 
 8     // 1:出口条件 如果1 return 1
 9     // 如果不是1 return num*方法名(num-1)
10     public static int jc(int num) {
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 class Rabbit {
 4     public static void main(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 class Demo7 {
 2     public static void main(String[] args) {
 3         System.out.println(getCount(20));
 4     }
 5     
 6     public static int getCount(int m) {
 7         if(m == 1 || m == 2) {
 8             return 1;
 9         }else {
10             return getCount(m-1) + getCount(m-2);
11         }
12     }
13 }

猜你喜欢

转载自www.cnblogs.com/Adil/p/10196847.html
今日推荐