JAVA入门笔记4:方法

来源:互联网 发布:it软件测试 编辑:程序博客网 时间:2024/05/16 23:35

方法

什么是方法

假如有一个游戏程序,程序在运行过程中,要不断的发射炮弹。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序就会变得很臃肿,可读性也会非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。
代码示例:

public class Example1 {    public static void main(String[] args) {        //下面的循环是使用*打印一个宽为5、高为3的矩形        for (int i=0; i<3; i++) {            for (int j=0; j<5; j++) {                System.out.print("*");            }            System.out.print("\n")        }         System.out.print("\n");        //下面的循环是使用*打印一个宽为4、高为2的矩形        for (int i=0; i<2; i++) {            for (int j=0; j<4; j++) {                System.out.print("*");            }            System.out.print("\n")        }         System.out.print("\n");        //下面的循环是使用*打印一个宽为10、高为6的矩形        for (int i=0; i<6; i++) {            for (int j=0; j<10; j++) {                System.out.print("*");            }            System.out.print("\n")        }         System.out.print("\n");    }}

在例1中,分别使用三个嵌套for循环完成了三个矩形的打印,仔细观察会发现,这三个嵌套for循环的代码是重复的,都在做一样的事情。此时就可以将使用”*”打印矩形的功能定义为方法,在程序中调用三次即可,修改后的代码如下:

public class Example2 {    public static void main(String[] args) {        printRectangle(3, 5);            //调用printRectangle()方法实现打印矩形        printRectangle(2, 4);        printRectangle(6, 10);    }    //下面定义了一个打印矩形的方法,接受两个参数,其中height为高,width为宽    public static void printRectangle(int height, int width) {        for (int i=0; i<height; i++) {            for (int j=0; j<width; j++) {                System.out.print("*");            }            System.out.print("\n");        }        System.out.print("\n");    }}

上述示例运行结果与Example1相同。
Example2中的第8~17行代码就定义了一个方法。其中{ }内实现打印矩形的代码是方法体,printRectangle()是方法名,第8行( )中的height和width是方法的参数,方法名的前面的void是方法的返回值类型。
在Java中,声明的一个方法的具体语法格式如下:

修饰符 返回值类型 方法名 (参数类型 参数名1,参数类型 参数名2...) {    执行语句    ...    return 返回值;}

对于上面的句法格式具体说明如下:

  • 修饰符:方法的修饰符比较多,有对访问权限进行限定的,有静态修饰符static,还有最终修饰符final等,这些修饰符在后面的学习过程中会逐步介绍。
  • 返回值类型:用于限定方法返回值的数据类型。
  • 参数类型:用于限定调用方法时传入参数的数据类型。
  • 参数名:是一个变量,用于接受调用方法时传入的数据。
  • return关键字:用于结束方法以及返回方法指定类型的值。
  • 返回值:被return语句返回的值,该值会返回给调用者。

需要特别注意的是,方法中的“参数类型 参数名1,参数类型 参数名2”被称作参数列表,它用于描述方法在被调用时需要接受的参数,如果方法不需要接受任何参数,则参数列表为空,即( )内不写任何内容。方法的返回值必须为方法声明的返回值类型,如果方法中没有返回值,返回值类型要声明为void,此时,方法中的个return语句可以省略。

代码示例:

public class Example3 {    public static void main(String{} args) {        int area = getArea(3, 5);         //调用个getArea方法        System.out.println("The area is " + area);    }    //下面定义了一个求矩形面积的方法,接受两个参数,其中x为高,y为宽    public static int getArea(int x,int y) {        int temp = x * y;                 //使用变量temp记住运算结果        return temp;                      //将变量temp的值返回    }}

在Example3中,定义了一个getArea( )方法用于求矩形的面积,参数 x 和 y 分别用于接收调用方法时传入的高和宽,return语句用于返回计算所得的面积。在main( )方法中通过调用getArea( )方法时,传入的参数3和5分别赋值给变量 x 和 y ,并将 x*y 的结果通过return语句返回,整个方法的调用过程结束,变量 x 和 y 被释放。


方法的重载

假设要在程序中实现一个对数字求和的方法,由于参与求和数字的个数和类型都不确定,因此要针对不同的情况去设计不同的方法。接下来通过一个案例来实现对俩个整数相加、对三个整数相加以及对两个小数相加的功能,具体实现如例:

public class Example4 {    public static void main(String[] args) {        //下面是针对求和方法的调用        int sum1 = add01(1, 2);        int sum2 = add02(1, 2, 3);        double sum3 = add03(1, 2, 3);        //下面的代码是打印求和的结果        System.out.println("sum1 = " + sum1);        System.out.println("sum2 = " + sum2);        System.out.println("sum3 = " + sum3);        //下面的方法实现了两个整数相加        public static int add01(int x, int y) {            return x + y;         }        //下面的方法实现了三个整数相加        public static int add02(int x, int y, int z) {            return x + y + z;         }        //下面的方法实现了两个小数相加        public static double add03(double x, double y) {            return x + y;         }    }}

从上述代码不难看出,程序需要针对每一种求和的情况都去定义一个方法,如果每个方法的名称都不相同,在调用时就很难分清哪种情况该调用哪个方法。为了解决这个问题,Java允许在一个程序中定义多个名称相同的方法,但是参数的类型或者个数必须不同,这就是方法的重载。接下来通过方法重载的方式对Example4进行修改,代码如下:

public class Example5 {    public static void main(String[] args) {        //下面是针对求和方法的调用        int sum1 = add(1, 2);        int sum2 = add(1, 2, 3);        double sum3 = add(1, 2, 3);        //下面的代码是打印求和的结果        System.out.println("sum1 = " + sum1);        System.out.println("sum2 = " + sum2);        System.out.println("sum3 = " + sum3);        //下面的方法实现了两个整数相加        public static int add(int x, int y) {            return x + y;         }        //下面的方法实现了三个整数相加        public static int add(int x, int y, int z) {            return x + y + z;         }        //下面的方法实现了两个小数相加        public static double add(double x, double y) {            return x + y;         }    }}

上述示例运行结果和Example4一样。Example5中定义了三个同名的add( )方法,他们的参数个数或类型不同,从而形成了方法的重载。在main( )方法中调用add( )方法时,通过传入不同的个参数便可以确定调用哪个重载的方法,如add(1, 2)调用的是两个整数求和的方法。值得注意的是,方法的重载与返回值类型无关,他只需要满足两个条件,一是方法名相同,二是参数个数或参数类型不相同。


方法的递归

方法的递归是指在一个方法的内部调用,递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。下面示例为递归算法计算自然数之和:

public class Example6 {    public static void main(String[] args) {        int sum = getSum(4);                  //调用递归方法,获得1~4的之和        System.out.println("sum = " + sum);   //打印结果    }    //下面的方法使用递归实现求1~n的和    public static int getSum(int n) {        if (n==1) {            //满足条件递归结束            return 1;        }        int temp = getSum(n -1);        return temp + n;    }}

示例中的第11行代码相当于在getSum( )方法的内部调用了自身,这就是方法的递归,整个递归过程在n==1时结束。

自己总结递归的两条构成条件:
- 递归出口
- 递归公式

递归出口是递归方法的结束条件,一定要有,并且要设计的好,否则陷入死循环。
递归公式是递归方法的实现功能,这个公式是简单有规律可循的,是可以重复的。
递归的里一层的输出值是外一层的输入值(实际运用的值,总而言之就是里面的结果是外面的参数)。

0 0
原创粉丝点击