Java SE(4)——方法详解
1.方法的概念&使用
1.1 什么是方法?
Java中的方法类似于C语言中的函数,是用于执行特定任务的代码块。
那么用方法组织起来的代码块和普通的代码相比有什么优势呢?
1.当代码规模较大且应用场景较为复杂时,方法能够模块化地组织代码,让代码更清晰,可读性更高
2.让代码能够被重复利用(方法的多次调用)
3.基于现有的方法进行开发,减少开发成本
不使用方法
public static void main(String[] args) {int year1 = 1900;int year2 = 1901;//判断year1是否为闰年if (year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0){System.out.println(year1 + "是闰年");}else {System.out.println(year1 + "不是闰年");}//判断year2是否为闰年if (year2 % 4 == 0 && year2 % 100 != 0 || year2 % 400 == 0){System.out.println(year2 + "是闰年");}else {System.out.println(year2 + "不是闰年");}}
使用方法
public static void isLeapYear(int year){if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){System.out.println(year + "是闰年");}else {System.out.println(year + "不是闰年");}}public static void main(String[] args) {int year1 = 1900;int year2 = 1901;isLeapYear(year1);isLeapYear(year2);}
1.2 方法定义
语法格式:
修饰符 返回值 方法名(形参类型 形参1,形参类型 形参2,…) {
//方法体
return(返回值)
}
示例一:判断闰年
public static void isLeapYear(int year){if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){System.out.println(year + "是闰年");}else {System.out.println(year + "不是闰年");}}
示例二:判断最大值
public static int max(int x,int y){return x > y ? x : y;}
方法组成部分介绍:
1.public和static都是方法的修饰符,决定了方法的性质,但不影响方法本身的执行逻辑,修饰符在后面类和对象的博文中再详细介绍,目前定义方法统一使用public+static
2.修饰符后面的void表示无返回值,意味着可以没有return;int表示该方法必须返回一个int类型的数据。当然,方法的返回值也可以是其他基本数据类型,引用类型,自定义类型
3.方法名:用于标识方法的名称,一般的命名规范采用小驼峰(第一个单词首字母小写,后面单词的首字母大写)
4.参数列表:方法可以接受任意数量/类型参数,参数=类型+名称,参数之间使用逗号隔开。上面的示例中,isLeapYear(int year)表示接受一个整形参数;max(int x,int y)表示接受两个整形参数
5.方法体:花括号内的代码块,它是方法的具体实现
1.3 方法调用
注意:
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行
- 调用方法的时候,需要使用方法名+参数列表的形式进行调用
- 如果有返回值,需要接收返回值结果
- Java中的方法不需要进行声明,定义完成后可直接调用
1.4 实参和形参的关系
形参(形式参数)
定义:定义方法时参数列表中的变量,用于接收调用者传递过来的值
作用域:仅限于方法体内部,生命周期和方法一致
实参(实际参数)
定义:调用方法时传递给方法的值或变量
作用域:这与实参所在的域和性质有关
传递方法:
1.按值传递:这意味着传递的值是实参的副本,接收数据的形参在内存中拥有独立的空间。对形参的改变不会映射到实参上面
由此可见,调用swap方法后,swap方法内部的a和b变量已经完成了交换,但是main方法中实际的参数a和b没有改变
2.引用类型的传递:1对于引用类型(如数组),传递的是引用的副本。这意味着实参和形参都指向同一个对象,因此通过形参来修改对象的内部状态会影响实参
2.方法重载
2.1 意义
以上面的add方法为例,完成两个整型变量的相加没问题,但是如果想完成两个float数的相加,就会报错
解决办法一:重新定义一个方法用于完成两个float数的相加
但是,如果要完成两个double数的相加,又要定义一个新的方法。这样就会导致要定义许多不同方法名的方法,比较麻烦。所以,Java中就提出了一个新的概念,方法重载
2.方法重载
在同一作用域中,可以存在方法名相同的方法,但参数列表一定不同,编译器通过方法签名来区分这些方法
注意:
- 方法名必须相同
- 参数列表必须不同(参数类型/参数顺序/参数个数,至少有一项不同,和参数名无关)
- 与返回值是否相同无关
2.2 方法签名
在同一个作用域中,不能定义两个相同名称的标识符。比如,在同一个main方法中无法定义两个名字一样的变量,因为对于变量来说,变量名就是标识符。但是,上面介绍到了方法的重载,这意味着在同一个作用域/类(类在后面的博文中介绍)可以存在两个方法名相同的方法,这是因为方法的标识符并不是方法名,而是方法签名
方法签名:经过编译器编译后的方法的最终名称。具体组成=方法全路径名+参数列表(只包含参数类型,不包含参数名称)+返回值类型
3.方法递归
概念:方法在执行过程中调用自身
递归的必要条件:
- 将原问题划分成其⼦问题,注意:子问题必须要与原问题的解法相同
- 要有递归出口
示例:求n的阶乘
public static int factor(int n){if(n == 1){return 1;}return factor(n - 1) * n;}public static void main(String[] args) {System.out.println(factor(5));}
递归过程: