Java函数


Java函数

  • 函数就是一个功能,每一个函数就是一个实现了某个功能的代码的封装
  • 函数是方法,一般一个函数做一件事。
  • 函数代表功能,可以简化程序开发的难度,可以实现代码的服用,进行模块化开发。

创建函数的语法

1.函数的格式

修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2, … )
{
执行语句;
return 返回值;
}

对格式的解释:
返回值类型:一个函数代表一个功能。返回值是一个函数执行完成之后返回的数据,描述返回值这个数据的类型。
参数类型:是形式参数的数据类型。
参数列表: 一个函数代表一个功能。有时调用功能时要提供数据。比如计算两个数和,调用这个功能一定要提供两个数。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
实际参数:传递给形式参数的具体数值。
return:用于结束函数。
返回值:该值会返回给调用者。

函数的调用

1.无参和无返回值的函数的调用

直接使用函数名称调用函数即可:

public static void printStar() {
        for (int i = 0;i<4;i++){
            System.out.print("$");
        }
    }
    public static void main(String[] args) {
        /*        打印图案:
        $ $ $ $
        $ $ $ $
        $ $ $ $
        $ $ $ $*/
        for (int i =0;i<4;i++){
            //函数名称调用函数
            printStar();
            System.out.println();
        }
    }

2.有参函数的调用

什么是函数的参数

  • 函数的参数即调用函数是传给函数的数据;如,两个数字的加法运算:public static int add(int i ,int j),其中int i ,int j 就是参数。在函数声明时定义的参数:形参在函数调用时int c = add(1,3);时,给了函数两个数值:1,3。如果函数声明时是带参数的,那调用函数时必须为其参数赋值。
  • 原始数据类型和引用数据类型做为函数参数时,对参数的影响是不同的; 基本数据类型做为参数时,形参与实参是两个不同的变量。只是在调用时使用实参为形参赋值。形参与实参之间没有其他的任何联系。函数中对于形参的数据变化不影响实参。引用数据类型(如数组)当形参和实参都是引用数所类型时,传值是将实参的引用赋值给形参。实参和开参都引用了同一块内存空间。

我们给出例子:

//有参函数的调用
 //打印九九乘法表,声明一个打印第n行的九九乘法表
    public static void printN(int n){
        for(int i =1;i<n+1;i++){
            System.out.print(n+"*"+i+"="+n*i+" ");
        }
    }
    public static void main(String[] args) {
        for (int i =1;i<10;i++){
            //将参数传给函数
            printN(i);
            System.out.println();
        }
    }

输出:
11=1
2
1=2 22=4
3
1=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
6
1=6 62=12 63=18 64=24 65=30 66=36
7
1=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81

那基本数据类型对参数有什么影响呢,我们来看一下:

    public static void main(String[] args) {
        int i =1;
        test01(i);
        //函数调用结束后,形参值被释放,此时输入i还是 1
        System.out.println("main:"+i);
    }
    public static void test01(int a){
        a++;
        System.out.println("test01:"+a);
    }

输出;
test01:2
main:1

下面,我们来看一下引用数据类型:

    public static void main(String[] args) {
        int[] i ={1,2};
        //引用数据类型,传给形参是引用,所以函数调用结束
        //后引用所指向的元素的值是发生变化的
        test(i);
        System.out.println("main: "+ i[0]);

    }
    public static void test(int[] a){
        a[0] = 10;
        System.out.println("test:"+a[0]);
    }

输出:
test:10
main: 10

值得注意的是:String是引用数据类型,但是在使用上类似于基本数据类型,函数在String数据类型里的变化不会影响到实参。

3.返回值类型的调用

  • 调用函数功能时,功能执行完成之后有时会产生数据,如果要将产生的数据返回给调用者就要使用返回值。如果函数的返回类型为void,就表示当前函数没有返回值,注意,void是一个特殊的返回值类型,表示没有返回值。正确没有返回值的函数原型:public static void 函数名(参数){}
    而不是:public static 函数名(参数){}
  • return是返回值关键字,格式为: return 返回值,程序运行到return关键字,函数就终止运行。

如果我们要调用的函数有返回值,在调用时就可以使用相应的数据类型的变量来接收返回值:

    public static void main(String[] args) {
        int a =1;
        int b =2;
        int x =test(a,b);
        //x的值为返回返回值c的值
        System.out.println(x);
    }
    public static int test(int a,int b){
        int c = a+b;
        return c;
    }

4.函数的递归调用

  • 函数的递归调用指的是,在一个函数内部调用函数本身的方式。
    public static void a(){
        ....
        a();//调用函数自己本身.递归调用
        ...
    }

我们给出例子:

      /*小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.
         第二天早上又将剩下的桃子吃一半,又多吃一个.
         以后每天早上吃前一天剩下的一半另一个.
         到第10天早上猴子想再吃时发现,只剩下一个桃子了.
          问第一天猴子共摘多少个桃子?
        */
public class Main {

    public static void main(String[] args) {
        int n=1;
        System.out.println(f(n));
    }
    //我们写一个函数返回第N天桃子的数量
    public static int f(int n){
        //分析一下本题的关系:第一天为f(1)个桃子,第二天为 (f(1)/2)-1个桃子
        //那f(n)有(f(n-1)/2)-1 个桃子,即  f(n)= (f(n+1)+1)*2个桃子
        if (n==10){
            //n ==10 为函数递归调用的结束条件
            return 1;
        }else {
            // 递归调用,调用函数本身
            return (f(n+1)+1)*2;
        }
    }
}

注意,递归调用的重点是:递归结束的条件

发表评论

关闭菜单