【入坑Java第三天】

方法

初步认识方法

  • 以下程序不使用方法,进行求和运算:

    public class Test{
        public static void main(String[] args){
            
            // 计算10+20
            int a = 10;
            int b = 20;
            int c = a + b;
            System.out.println("结果=" + c); // 结果=30
            
            // 计算100+200
            int x = 100;
            int y = 200;
            int z = x + y;
            System.out.println("结果=" + z); // 结果=300
            
        }
    }
  • 以上代码完成了三个求和的功能,每一次求和的时候都把代码重新写了一遍,显然代码没有得到 “重复利用”,表面上看是三个功能,但实际上只是“一个”求和功能,只不过每一次参与求和的实际数值不同。

  • java 中有没有一种方式或者语法,能让我们把功能性代码写一次,然后给这个功能性代码传递不同的数据,来完成对应的功能呢?

  • 答案是:当然有。这就需要我们掌握 java 语言中的方法机制,接下来大家看看改进之后的代码:

    public class Test{
        public static void main(String[] args){
            
            // 调用求和方法计算10和20的和
            sum(10,20); // sum=30
            
            // 调用求和方法计算666和888的和
            sum(666,888); // sum=1554
        }
        
        // 负责求和的方法
        public static void sum(int a , int b){
            int c = a + b;
            System.out.println("sum=" + c);
        }
        
    }
  • 通过以上程序我们可以看出,其实方法也没什么神秘的,方法其实就是一段普通的代码片段,并且这段代码可以完成某个特定的功能,而且可以被重复的调用使用。java 中的方法又叫做 method,在 C 语言中叫做函数。

  • 从现在开始大家以后在写代码的时候就要有定义方法的意识了,只要是可以独立出来的功能,我们都可以定义为单独的一个方法来完成,如果以后需要使用此功能时直接调用这个方法就行了,不要把所有的代码都扔到 main 方法当中,这样会导致程序的“复用性”很差。

方法的定义以及调用

  • 定义/声明方法的语法格式如下所示:

    修饰符列表 返回值类型 方法名(形式参数列表){
        方法体
    }
    ​
    定义一个求和方法,例如:
    public static void sum(int a , int b){
            int c = a + b;
            System.out.println("sum=" + c);
    }
    ​
    public static :修饰符列表
    void : 返回值类型
    sum : 方法名
    (int a , int b) : 形式参数(形参),每一个形参都是局部变量
    形参 : 数据类型 变量名
    ​
    调用方法:
    在main方法种调用,例如:
     public static void main(String[] args){
            sum(10,20);  
            sum(666,888);
    }
  • 接下来我将列出方法的相关规则,其中一些规则目前可能需要大家死记硬背,还有一些规则希望大家在理解的前提下进行记忆:

    • ① [修饰符列表],此项是可选项,不是必须的,目前大家统一写成 public static,后面会详细讲解。

    • ② 返回值类型,此项可以是 java 语言当中任何一种数据类型,包括基本数据类型,也包 括所有的引用数据类型,当然,如果一个方法执行结束之后不准备返回任何数据,则返回值类型必须写 void。返回值类型例如:byte,short,int,long,float,double,boolean,char,String,void 等。

    • ③ 方法名,此项需要是合法的标识符,开发规范中要求方法名首字母小写,后面每个单词首字母大写,遵循驼峰命名方式,见名知意,例如:login、getUsername、findAllUser 等。

    • ④ 形式参数列表(int a, int b),此项又被称为形参,其实每一个形参都是“局部变量”, 形参的个数为 0~N 个,如果是多个参数,则采用半角“,”进行分隔,形参中起决定性作用的 是参数的数据类型,参数名就是变量名,变量名是可以修改的,也就是说(int a , int b)也可以写成(int x , int y)。

    • ⑤ 方法体,由一对儿大括号括起来,在形参的后面,这个大括号当中的是实现功能的核心代码,方法体由 java 语句构成,方法体当中的代码只能遵循自上而下的顺序依次逐行执行, 不能跳行执行,核心代码在执行过程中如果需要外部提供数据,则通过形参进行获取。

方法重载

  • 从上面的求和方法来说,如果我要进行三个数的求和,那这个方法就不能满足我的需求。

  • 这个时候就需要方法重载,例如:

    public class Test{
        public static void main(String[] args){
            int i = sum(10,20);
            System.out.println(i); // 30
            
            itn j = sum(10,20,30);
            System.out.println(j); // 60
        }
        
        // 这里的返回值是int类型,使用return返回一个int类型的数据
        public static int sum(int a , int b){
    		return a + b;
    	}
        
        public static int sum(int a , int b , int c){
    		return a + b + c;
    	}
        
    }
  • 以上代码使用了方法重载机制,我们可以看到,两个“功能相似”的方法名字都叫做 sum, 只不过方法的形参不同,这样对于我们来说,调用方法时所需要记忆的方法名更少一些,代码更加美观一些。

什么是方法重载?什么情况下我们考虑使用方法重载?

  • 方法重载是指在一个类中定义多个同名的方法, 但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java 编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。调用方法时通过传递给它们的不同个数和类型的实参来决定具体使用哪个方法。

  • 什么情况下我们考虑使用方法重载呢?

    • 在同一个类当中,如果多个功能是相似的,可以考虑将它们的方法名定义的一致,使用方法重载机制,这样便于我们的调用,以及代码美观, 但相反,如果两个方法所完成的功能完全不同,那么方法名也一定要不一样,这样才是合理的。

  • 代码满足什么条件的时候构成方法重载呢?满足以下三个条件:

    • ① 在同一个类当中。

    • ② 方法名相同。

    • ③ 参数列表不同:个数不同算不同,顺序不同算不同,类型不同也算不同。

方法递归

  • 什么是方法递归?我们先来看一段代码:

    public class Test {
        public static void main(String[] args) {
            show();
        }
    
        public static void show(){
            System.out.println("show方法执行了!");
            show();
        }
    
    }
  • 以上代码的执行结果如下图所示:

     

  • 我们可以看到以上代码的执行过程中,一直输出 “show方法执行了” ,直到最终发生了错误:java.lang.StackOverflowError,这个错误是栈内存溢出错误,错误发生后, JVM 退出了,程序结束了。 实际上以上代码在 show()方法执行过程中又调用了 show()方法,方法自身调用自身,这就是方法递归调用。

  • 大家再来思考一个问题,一个递归程序有合法有效的结束条件就一定不会发生栈内存溢出错误吗?在实际开发中遇到这个错误应该怎么办?

  • 一个递归程序有的时候存在合法有效的终止条件,但由于递归的太深,在还没有等到条件成立的时候,栈内存已经发生了溢出,这种情况也是存在的,所以实际开发中我们尽可能使用循环来代替递归算法,原则是:能不用递归尽量不用,能用循环代替的尽可能使用循环。当然, 如果在开发中遇到了由于使用递归导致栈内存溢出错误的发生,首先,我们要检查递归的终止条件是否合法,如果是合法的还是发生栈内存溢出错误,那么我们可以尝试调整堆栈空间的大小。怎么调整堆栈大小呢,大家可以研究一下下图中的一些参数,这里就不再讲解内存大小的调整了。

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值