可变个数形参的方法 、方法的值传递机制、方法重载、递归方法

可变个数形参的方法 

jdk5.0新特性


在调用方法时,可能会出现方法形参的类型是确定的,但是个数不确定,就可以使用可变形参个数的方法


格式;


(参数类型 ... 参数名)


说明:


可变形参个数的方法在调用时,形参赋的实参的个数可以为0、1、多个
可变形参个数的方法与同一个类中,同名的多个方法之间可以构成重载
特例:可变形参个数的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载
可变个数形参必须声明在形参列表最后
可变个数形参在一个方法的形参列表中最多出现一次

方法的值传递机制

1.方法内声明的局部变量,赋值操作:


基本数据类型,则将此变量保存的数据值传递出去。
引用数据类型,则将此变量保存的地址值传递出去。


2.方法的参数传递机制:值传递机制

2.1实参给形参赋值的过程:


如果形参是基本数据类型,则将实参保存的数据值赋给形参。
如果形参是引用数据类型,则将实参保存的地址值赋给形参。


3.Java的参数传递机制是什么?


值传递。(不是引用传递)

方法重载

1.定义:

在同一个类中,允许寻在一个以上的同名方法,只要他们的参数列表不同即可。
满足这样特征的多个方法,彼此之间构成方法的重载。


2.总结为:两同一不同


两同:同一个类、相同的方法名
一不同:参数列表不同。参数个数不同、参数类型不同

注意:方法的重载与形参的名、劝你西安修饰符、返回值类型都没有关系


3.举例


Arrays中的sort(xxx[] arr)


4.如何判断两个方法相同?


方法名相同,形参列表相同(参数个数和类型都相同)。
在一个类中,允许存在多个相同名字的方法,只要他们的形参列表不同即可


编译器如何知道调用某一个具体的方法?
先通过方法名确定一堆重载的方法,再通过不同的形参列表,确定某一个具体的方法


5.在同一个类中,不允许定义两个相同的方法。

递归方法

何为递归方法?


方法自己调用自己的现象就称为递归


分类:


直接递归、间接递归


使用说明:


递归方法包含了一种“隐式循环”
递归方法会“重复执行”某段代码,但这种重复执行无需循环控制
递归一定要向“已知方向”递归,否则就会变成无穷递归,停不下来,类似于死循环。最终发生“栈内存溢出”

递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多的时候速度比循环慢得多,所以在使用递归时要谨慎
再要求高性能的情况下尽量避免使用递归,调用递归既花时间又耗内存,考虑使用迭代循环

public class RecurionTest {
    public static void main(String[] args) {
        RecurionTest test = new RecurionTest();
        //test.method1();
        test.getSum(100);
        System.out.println(test.getSum(100));
        System.out.println(test.getSum1(100));
        System.out.println(test.getMul(5));
        System.out.println(test.f(10));
    }
    /**
     * 举例3:快速排序
     */
    /**
     * 举例4:汉诺塔游戏
     */
    /**
     * 斐波那契数列
     * 1 1 2 3 5 8 13 21 34 55 .。。
     * f(n) = f(n - 1) + f(n -2)
     */
    public int f(int n){
        if (n == 1){
            return 1;
        } else if (n == 2) {
            return 1;

        }else {
            return f(n - 1) + f(n -2);
        }
    }
    /**
     * 举例6:
     * File类的对象表示一个文件目录。
     * 计算指定文件目录的大小,遍历指定文件目录中的所有文件,删除指定的文件目录
     */


    /**
     * 举例2:n!
     */
    public int getMul(int n){
        if (n == 1){
            return 1;
        }else {
            return n*getMul(n - 1);
        }
    }
    /**
     * 举例1:计算1-100内自然数的总和
     */
    public int getSum(int num){
        int sum = 0;
        for (int i = 1; i <= num; i++) {
            sum += i;
        }
        return sum;
    }
    public int getSum1(int num){
        if (num == 1){
            return 1;
        }else {
            return getSum1(num - 1) + num;
        }
    }
    /**
     * 如下递归方法的使用会导致StackOverflowError
     */
//    public void method1(){
//        System.out.println("method1");
//        method1();
//    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值